9

什么是耦合,什么是内聚

 3 years ago
source link: https://zhuanlan.zhihu.com/p/373962759
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

什么是耦合,什么是内聚

problem solver

https://www.youtube.com/watch?v=3gib0hKYjB0

今天偶然听了 Kent Beck 讲解 Edward Yourdon 《Structured design : fundamentals of a discipline of computer program and systems design》关于什么是“耦合”,什么是“内聚”的定义。觉得有必要记录一下

有 A 和 B 两个 element。当修改了 A 的时候,B 必须被修改,那么两者就耦合了。

  • 在耦合的定义里没有 element 之间的包含关系。耦合是两两之间的,不是父子之间的
  • 耦合差不多就是静态类型的引用关系,那种可以被编译器报错的“连接约束”

耦合和业务上的变化倾向没有关系。不是说两个东西在业务上经常同时被修改,就是耦合了。要看这两个东西之间是不是有类似静态类型引用这样的,不改就会导致编译失败的“连接约束”。

内聚的定义是 element 之间有包含关系。

v2-e1298c263add52e91744fa3bebbaaecc_720w.jpg

element 甲包含了 a,b,c e,f

如果修改 a 会因为耦合,同时修改 b 和 c。那么 element 甲的内聚就是 3/5

如果修改 a 会因为耦合,同时修改 b,c,e,f。那么 element 甲的内聚就是 5/5

假设 a,b,c 是耦合的,e,f 是耦合的。如何提高甲的内聚呢?就是把甲缩小一些,只包含 a,b,c

v2-70b76147a9ab54a130bb67b126bacf91_720w.jpg

也就是内聚是

  • 具有一堆子 elements 的父 element 具有的一种属性
  • 所包含的子 elements 之间耦合占比越高,则内聚越高

通过移动包含的边界,达成内聚

  • 如果父 element 是文件夹,则要移动文件夹内的文件,使得文件之间都是耦合的。如果两个文件都在一个文件夹内,但是彼此之间没有耦合关系,则是不好的。
  • 如果父 element 是文件,则要移动文件内的函数和类,使得这些函数和类之间都是耦合的。如果两个函数都在一个文件内,但是彼此之间没有耦合关系,则是不好的。
  • 如果父 element 是类,则要移动类里面的方法,使得这些方法之间都是耦合的。如果两个方法都在一个类之内,但是彼此之间没有耦合关系,则是不好的。
  • 耦合不是坏事情,只是一种客观存在用来指导发现“父 element”的边界

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK