了解“现实世界”中的松散/紧密耦合


9

我不会说什么“社区”,因为我想要一个不偏不倚的解释,但是假设您正在构建一个可重用的模块,并且该模块需要3个以上的依赖模块,而删除其中的1个模块不仅会在您的应用中导致中断错误使用该模块的整体,但使用模块本身。

根据我的理解(必须是错误的),一个松耦合的模块化系统不会因为简单地删除一个模块而破裂。该应用程序仍应运行,但没有该“功能” /模块,并且该模块本身不应仅由于不存在依赖模块而导致所有内容无法运行。

这是错的吗?如果是这样,如果模块仍然依赖于一切都不起作用的点,那么紧密/松散耦合之间的区别是什么?


2
这有点像在争论您可以从汽车上卸下轮胎,但仍然可以正常工作
Ryathal'2

1
@Ryathal-好吧,实际上会:)“汽车”可以正常工作。它没有任何轮胎,但是可以正常工作。事实上,如果您愿意,可以破坏车轮,但实际上也可以驱动车轮。可能会有些颠簸:)
Rook

是的,正如@ldigas所说。汽车将启动,收音机将运行,一切都将运行,但运动部分。那就是我想说的。
奥斯卡·戈德森

Answers:


21

不太可能---卸下模块可能会损坏系统。松耦合系统背后的想法是,只要新模块符合与旧模块相同的接口要求,就可以在完全不同的模块中进行交换工作。如果紧密耦合,周围的代码将对内部进行推测,并且如果引入了新模块,则将开始失败。


+1:好答案!模块必须依赖于其他模块,而不依赖于其内部实现。
乔治

5

松散耦合本质上是模块之间如何发展的间接依赖。

通常,当存在紧密耦合的系统时,不同的模块/对象具有非常特殊的行为,这些行为假定外围对象的行为。这样的对象链接/耦合到其他模块行为,并且不能孤立地或在任何其他上下文中重复使用它们。

即使负责单个功能的此类模块也无法独立发展或无法发展


一个例子:

假设您有3个对象 Shape(一个模型对象)和Canvas(一个UI元素)。现在

假定方法shape.draw(Canvas)将在画布平面提供的平面上绘制对象。

现在,有时窗户会被部分遮盖并调整大小。在这种情况下,上面的方法可能只是这样做。

shape::draw(Canvas) {
   Rect.WindowLeft = Canvas.GetWindowRect.getLeftOffset(); 
   Rect.LeftPixel = Canvas.GetWindowRect.pixels() + Rect.WindowLeft; 
   ....  // like this get all co-ordinates. 

   draw_instance(Rect);  // This will draw the actual shape. 
}

基本上,这里的draw函数拾取需要绘制事物的矩形。这很容易理解(人们可能将其称为简单)代码。但是,这是极其耦合的代码。

想象一下情况:

  • 如果画布的固定窗口机制不再是矩形怎么办?
  • 如果Canvas保留私有的其他偏移量怎么办?
  • 如果某些其他应用程序想要相同的形状但不再具有GUI窗口(例如,它正在创建图像并保存在文件中)怎么办。

问题的根源在于,对象shape 知道并因此紧密耦合Canvas

理想的是给像素集写形状。对shape像素实际写入的位置不应有(甚至是隐式的)知识。


0

这取决于甚至指定为模块的内容。系统的某些部分应紧密耦合(例如,您的实体应在整个应用程序中重用),但某些系统应该是松散的,可能存在接口分离,或者如果我们正在谈论如果删除模块则不破坏应用程序,那么该模块必须以某种方式动态连接,例如通过IoC容器之类的东西。

同样,紧密耦合意味着某些部分取决于特定的模块实现方式,而不是模块的定义或其他内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.