每当我看到 ASP.NET MVC 项目时,我总是看到松耦合架构。
在 Web 架构中,为什么我需要松耦合(如果我不进行单元测试)?
这样做的优点和缺点是什么?
解耦层/类的主要原因是什么?
如果我不想改变我的数据访问层(DAL),例如何时应该更改整个 DAL?因此,我可以将我的 DAL 与 UI 耦合。这样做有什么问题吗?
每当我看到 ASP.NET MVC 项目时,我总是看到松耦合架构。
在 Web 架构中,为什么我需要松耦合(如果我不进行单元测试)?
这样做的优点和缺点是什么?
解耦层/类的主要原因是什么?
如果我不想改变我的数据访问层(DAL),例如何时应该更改整个 DAL?因此,我可以将我的 DAL 与 UI 耦合。这样做有什么问题吗?
松散耦合(Loose Coupling)允许您在不影响其他部分的情况下对应用程序的某个区域进行更改。理论上,它允许您执行一些操作,例如更改数据访问层而无需重建业务或UI层。
松散耦合确实使您的应用程序更加灵活、更易于变更和更易于维护(因为您无需担心应用程序中一个区域的更改会破坏另一个区域)。
如果一个项目不是微不足道的小,我定义为代码行数少于几千行(具体取决于编程语言),这时使用松散耦合的设计可以节省很多时间。
因为一旦过了超小型项目,每次更改或更新都会变得更加困难,尤其是当紧密耦合时。而松散耦合使您可以继续前进,添加功能、修复错误等等。
在某一点上,我认为任何程序都会成为维护、更新和添加的噩梦。设计越松散耦合,这一点就能够推迟。如果过于紧密耦合,也许在约10,000行代码后就会变得难以维护,有些功能甚至需要从头开始重写。
松散耦合有助于让它发展到1,000,000 - 10,000,000行代码并仍能够在合理的时间内进行更改和添加新功能。
这些数字并不是要字面理解,只是为了给出何时使用松散耦合有帮助的感觉。
如果您永远不需要更新程序并且它相当简单,则可以将其设计为紧密耦合。甚至可以这样开始,但是必须知道何时分离代码,而且您仍然需要经验来编写松散耦合的代码以了解在何时使用它才有益。
Enterprise Fizzbuzz是一个刻意幽默的例子,说明过度工程化是可能的,并非每个项目都需要相同水平的解耦。
MVC通常被认为是一个不错的起点,因为大多数项目会变得足够大,以至于MVC设计能够帮助到开发。当项目变得更大时,这种程度的解耦将不足以应对,M部分需要进一步拆分为多个层次等等。并没有适用于所有情况的标准,但对于大多数项目来说,MVC提供的程度足够了。
在理论上,松耦合有很多优点,但实际操作中,我认为很难做到。下面是一些优点:
系统可以独立地按照生命周期进行演进。
系统可以使用不同的编程语言编写,并最终运行在不同的操作系统上。
系统可以(并且应该)由不同的团队构建。你可以外包系统的开发。事实上,这几乎是扩展软件开发组织的唯一方法。
但也有一些缺点:
在开始时需要投入更多的工作量,如果做得不好,可能永远看不到它的益处。
定义API/约定相当困难,需要非常有经验的开发人员。刚开始容易做,但长期来看会很难。
过度使用松耦合技术实际上会导致到处都是松散的类型。与使用清晰定义的有意义的对象相比,您可能会观察到“对象”参数或返回类型的使用增加,以及在每个类或接口上添加通用类型。这样做的坏处是平均开发人员可能会在所谓的松耦合系统的两侧使用类型间转换操作。
一些松耦合技术基于接口定义的概括,旨在避免直接的依赖关系。请记住,一旦定义和发布接口,它应该被规定为不可更改的。现在,这并不是我所说的松耦合。利用JIT和方法重载等技术的.NET类可能是更好的松耦合工具。因此,这些接口和工厂的问题在于会导致类型、程序集、测试用例等的增加,而简化事情的代价是你需要构建很多系统,而不是一个系统。"N层系统是N倍的工作量" :-)
松耦合机制在某种程度上绕过了编译器(C#或其他编译器)这个最强大的工具之一。这实际上是其整个目的,但它肯定存在一些缺点,因为编译器执行的所有基本工作(如类型检查等)现在需要在其他地方进行(测试),这将带来一定的成本。
许多开箱即用的工具可能不再起作用。您将无法使用诸如Visual Studio“转到定义”或“查找所有引用”之类的功能。
松散耦合的架构有助于应用程序在需要更改或增长时进行调整。任何非平凡的应用程序都将最终需要更改或增长。
如果您设计一个松散耦合的架构,只有应用程序的一小部分会受到要求变化的影响。而对于过于紧密耦合的架构来说,许多部分都需要更改,并且很难确定哪些部分会受到影响。
在我看来,TDD(测试驱动开发)的主要好处之一是帮助促进松散耦合的架构。
这些开发人员是否有编写自动化测试的经验?仅拥有自动化测试是不够的。它们应该尽可能完整并且正确地完成。如果你的测试很弱,那么最好不要有任何测试。你不想依靠一个充满漏洞的墙壁。
结论:
我知道我们都想成为专业人士。作为专业人士,我们必须考虑所有因素。我们不能浪费时间和精力去做“正确”的事情。有时候我们必须看向其他因素(现实)并做出选择。最重要的是要接受它。
优点:
缺点:
首先,你应该编写单元测试 ;)
假设你最终需要更改底层数据库。如果您的数据访问代码与业务逻辑紧密耦合,则可能需要付出巨大的努力。使用松散耦合的代码,您的业务逻辑将不受影响。
如果您决定编写一些命令行实用程序来利用后端组件怎么办?使用松散耦合的代码更容易提供多个系统入口点。
这将提供可扩展性。例如,如果您有服务层,可以将其分离到几个服务器中。此外,您将拥有更少的依赖项,修改将更容易,并且代码支持也将更加容易。
在这里,您可以看到一个有趣的小文章:SOA - Loosely Coupled...What?
简而言之:
松耦合系统提供了许多优点,包括支持使用后期或动态绑定到其他组件运行,并且可以调解组件结构、安全模型、协议和语义之间的差异,从而抽象出波动......
因为即使与基于浏览器的HTTP web UI没有通信,背景中的东西可能也很有用。所以你希望能够将它与特定的UI断开连接。