我理解这种低耦合高内聚的说法有问题。我在谷歌上搜索并阅读了很多这方面的内容,但还是觉得很难理解。
我的理解是,高内聚意味着,我们应该有专门执行特定功能的类。希望这是正确的?比如信用卡验证类,它专门用于验证信用卡。
还是不明白低耦合是什么意思?
我理解这种低耦合高内聚的说法有问题。我在谷歌上搜索并阅读了很多这方面的内容,但还是觉得很难理解。
我的理解是,高内聚意味着,我们应该有专门执行特定功能的类。希望这是正确的?比如信用卡验证类,它专门用于验证信用卡。
还是不明白低耦合是什么意思?
当前回答
简短明了的回答
高内聚性:一个类/模块中的元素应该在功能上属于一起,并做一件特定的事情。 松耦合:不同的类/模块之间应该有最小的依赖关系。
其他回答
下面是一个从抽象的图论角度给出的答案:
让我们通过只查看有状态对象之间的(有向)依赖关系图来简化这个问题。
一个极其简单的答案可以通过考虑依赖图的两种限制情况来说明:
第一个极限情况:聚类图。
簇图是高内聚低耦合(给定一组簇大小)依赖图的最完美实现。
簇之间的依赖性是最大的(完全连接),而簇间的依赖性是最小的(零)。
这是一种极限情况下答案的抽象说明。
第二个极限情况是一个全连通图,其中所有东西都依赖于所有东西。
在我看来,现实情况介于两者之间,越接近聚类图越好。
从另一个角度来看:当观察有向依赖关系图时,理想情况下它应该是无循环的,如果不是,那么循环就会形成最小的集群/组件。
层次结构的上升/下降对应于软件中松耦合、紧密内聚的“一个实例”,但可以将这种松耦合/紧密内聚原则视为在无环有向图(或其生成树之一)的不同深度上的重复现象。
将系统分解为层次结构有助于克服指数级的复杂性(比如每个集群有10个元素)。在6层中,已经有100万个对象了:
10个星系团形成1个超星系团,10个超星系团形成1个超星系团……如果没有紧密内聚、松散耦合的概念,这样的层次结构就不可能实现。
所以这可能是故事的真正重要性,而不仅仅是两层中的高内聚低耦合。当考虑更高级别的抽象及其交互时,真正的重要性变得清晰起来。
以旧的PC主板为例。
鼠标有自己的PS/2端口。 打印机有自己的打印机端口。 显示器有自己的VGA端口。
这意味着特定的端口只能用于特定的设备,而不能用于其他设备。
这就是强/高耦合
由于鼠标仅用于操作光标和相关功能,键盘用于输入按键等,即它们只执行它们所要执行的任务,这就是高内聚性
如果鼠标需要输入一些“a”、“b”、“c”按钮,那么它所做的就超过了它应该做的,因为键盘已经在执行它们了,这就是低内聚
幸运的是,专有端口的过时用法被我们称为USB的标准(接口)所取代。这是松散/低耦合
看看这些物理属性,很明显这就是它应该有的样子,但在编写软件时,很容易忘记什么功能应该放在哪里,等等,因此作为一个提醒,在生活中的任何事情中,始终坚持:
“高内聚和松耦合”
长话短说,我所理解的低耦合意味着可以在不影响系统正常功能的情况下交换组件。基本上,将您的系统模块化为可单独更新的功能组件,而不会破坏系统
当我读到微服务的时候。我发现了以下几点:
内聚性是对组件各部分之间的关系数量的度量。高内聚性意味着交付组件功能所需的所有部分都包含在组件中
耦合是系统中一个组件与其他组件之间关系数量的度量。低耦合意味着组件与其他组件之间没有太多关系
我的信念是:
内聚性是指一个模块/类的元素属于在一起的程度,建议相关的代码应该相互接近,因此我们应该争取高内聚性,并将所有相关的代码尽可能紧密地绑定在一起。它与模块/类中的元素有关。
耦合是指不同模块/类之间相互依赖的程度,建议所有模块尽可能独立,这就是低耦合的原因。它与不同模块/类之间的元素有关。
将整个画面形象化是有帮助的:
截图来自Coursera。