为什么Web架构应该松散耦合?

Roo*_*ian 28 architecture asp.net asp.net-mvc loose-coupling

当我看到ASP.NET MVC项目时,我每次都看到松耦合架构.

为什么我需要在Web架构中松散耦合(如果我不进行单元测试)?

有什么优点缺点的呢?

分层/类的主要原因是什么?

如果我不想改变我的DAL怎么办?我的意思是什么时候才能改变我的整个DAL?!所以我可以将我的DAL耦合到UI.这有什么不好的?

Jus*_*ner 31

松散耦合允许您在应用程序的一个区域中进行更改而不会影响其他区域.从理论上讲,它允许您执行更改数据访问层而无需重建业务或UI层的操作.

它确实使您的应用程序更灵活,更擅长变更,并且更易于维护(因为您不必担心应用程序的某个区域发生变化而导致另一个区域发生变化).

  • 而且我会添加"更容易维护".如果从长远来看它们不容易维护,那你就做错了. (3认同)

Dav*_*vy8 19

对于任何非常小的项目,它都会为您节省大量时间,在这些项目中,我将其简单地定义为少于几千行代码(取决于语言).

原因是,一旦你超越了超级小项目,每次更改或更新都会变得越来越紧密.松散耦合使您可以继续前进,添加功能,修复错误等.

在某一点上,我认为任何程序都成为维护,更新和添加的噩梦.设计越松散耦合,这一点就会延迟.如果它紧密耦合,可能在大约10,000行代码之后变得不可维护,添加一些功能变得不可能,而基本上不从头开始重写.

被松耦合允许它增长到1,000,000 - 1000行的代码,同时还能够进行更改并在合理的时间量内增加新的功能.

这些数字并不意味着按字面意思理解,因为它们只是组成,而是要了解它变得有用的地方.

如果你永远不需要更新程序而且它非常简单,那么可以紧密耦合.甚至可以这样开始但是知道什么时候分开东西,但是你仍然需要编写松散耦合代码的经验来知道什么时候它变得有益.

企业Fizzbuzz是一个故意幽默的例子,说明如何过度使用过度工程,并不是每个项目都需要相同级别的解耦.

MVC通常被认为是一个很好的起点,因为大多数项目都会变得足够大以使其有用.当项目变大时,这种解耦水平是不够的,M部分本身需要分成几层,依此类推.没有一个适合所有人,但MVC对于大多数项目来说是一个很好的解耦.


Sim*_*ier 12

在论文中,松散耦合有许多优点,但在实践中,很难使其正确恕我直言.这有一些优点:

  • 系统可以在生命周期方面独立发展.

  • 系统可以用不同的语言编写,最终可以在不同的操作系统上运行.

  • 系统可以(并且应该)由不同的团队构建.您可以外包系统的开发.事实上,这几乎是扩展软件开发组织的唯一方法.

以下是一些缺点:

  • 一开始就是更多的工作,如果你做得不好,你可能永远不会看到它的好处.

  • 定义API /合同非常困难,需要经验丰富的开发人员.最初很容易做到,但从长远来看这很难.

  • 松散耦合的泛化实际上可能导致各处的松散输入.您可以观察到添加到每个类或接口的泛型类型的"对象"参数或返回类型的使用增加,而不是使用明确定义的有意义的对象.这种情况的不良影响是普通开发人员可能会在任何地方添加野外投射操作,假设所谓的松散耦合系统的两侧都有类型.

  • 一些松散耦合技术基于接口定义的泛化,旨在避免直接依赖.请记住,界面应该在定义和发布时刻在石头上.现在,这不是我所谓的松散耦合..NET类利用JIT和方法过载等技术可以成为更好的松散耦合工具.因此,这些接口和工厂无处不在的问题是它会导致类型,组件,测试用例等的倍增......而且还会带来更多的工作和复杂性.而不是简化事物,而不是建立一个系统,你将不得不建立许多."一个N层系统是N次工作":-)

  • 松耦合以某种方式绕过了有史以来最强大的工具之一:编译器(C#或其他).这实际上就是它的全部目的,但它肯定有一些缺点,因为编译器所做的所有基础工作(类型检查等等)都需要在其他地方(测试)完成,这将产生成本.

  • 许多开箱即用的工具可能不再适用.您将无法使用Visual Studio"转到定义"或"查找所有引用"等内容.


dri*_*iis 8

当您的应用程序需要更改或增长时,松散耦合的体系结构将帮助您.任何不平凡的应用程序最终需要更改或增长.

如果使用松散耦合的体系结构进行设计,则在需求发生变化时,应该只影响应用程序的一小部分.由于耦合架构太紧,许多部件需要更改,并且很难准确识别哪些部件会受到影响.

在我看来,TDD的主要好处之一是有助于促进松散耦合的架构.


小智 5

我认为在其他答案中解释了"正确"的方式.但我现在要根据自己的经验写作.

在决定架构时,您必须考虑很少的事情.

一个.客户

你有足够的时间让一切都"正确"(伟大的建筑,测试等......)?有时客户希望快速查看结果.我们可以抱怨时间很短,产品不会达到最高标准,但最终这是我们的问题.在这种情况下,我们向客户解释他将得到什么,并写下我们都知道的意大利面条代码.

客户要求是什么(在可靠性,可扩展性,可扩展性,速度方面)?我认为这是自我解释的.有时客户指示"正确"的方式.我们可以为客户提供"正确"的方式,但最终客户将决定(当然,取决于时间和金钱).

开发后谁将支持该系统?我想支持一个很好的解耦代码.因此,当我编写代码时,我会尽力使其"正确".有时候,我可能会将视图和控制器结合起来,或者结合一些服务并对它感到满意.知道我自己的代码很容易支持它.

项目

项目的规模是多少?有些项目非常小,任何复杂的架构都是不合理的.

软件是否有机会在未来快速发展(更多功能)?这是最大的挑战之一.但如果软件增长,则意味着它是成功的.您可能有更多资源可供使用.重构代码并使其"正确"是相对容易的.

该项目是否可能存在可扩展性问题?在用户和数据方面,有些项目永远不会增长.我已经看到过使用Oracle RAC数据库设置试图看起来很严肃的项目,当一个简单的嵌入式数据库工作得很好!

您是否启动了该项目,或者您是从其他开发人员那里接管的?这是谁将支持软件以及软件增长的问题的组合.您可能会从其他开发人员那里获得意大利面条代码.你有时间和资源使它"正确"吗?

C.开发团队

团队经验是否足以使解耦合适?当我缺乏经验时,我试图编写"正确"的代码.我失败了.关键是要真正了解您的开发团队,他们的技能和知识.不要低估这个问题.与经验不足的开发人员合作时,我通常会对架构做出一些牺牲.将要做出的牺牲是我所拥有的最好的教育猜测.你可以牺牲的建筑有一些点,有些你不能.通常你先前做出的一个或多个牺牲会回来咬你.

开发人员是否经历过编写自动测试?仅进行自动测试是不够的.它们应该是完整的(尽可能的)并且做得对.如果你的测试很弱,那么你最好不要使用它们.你不会想要靠在满是洞的墙上.

结论:

我知道我们都想成为专业人士.作为专业人士,我们必须考虑所有因素.我们不能浪费时间和精力以"正确"的方式做事.有时我们必须考虑其他因素(现实)并做出我们的选择.而最重要的是与它共存.