skip to content
logo

Search

重新认识耦合与内聚

3 min read

认清耦合与内聚的本质定义,澄清常见误解,并解释如何通过调整元素边界来减少耦合、提高内聚,从而优化代码结构

# 编程范式
Not in series

什么是“耦合”,什么是“内聚” - Kent Beck

耦合

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

  • 在耦合的定义里没有 element 之间的包含关系。耦合是两两之间的,不是父子之间的。 耦合差不多就是静态类型的引用关系,那种可以被编译器报错的“连接约束”。
  • 耦合和业务上的变化倾向没有关系。不是说两个东西在业务上经常同时被修改,就是耦合了。 要看这两个东西之间是不是有类似静态类型引用这样的,不改就会导致编译失败的“连接约束”。

内聚

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

elementA 包含了 a,b,c e,f

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

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

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

也就是内聚是:

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

通过移动包含的边界,减少耦合,达成内聚

  • 如果父 element 是文件夹,则要移动文件夹内的文件,使得文件之间都是耦合的。如果两个文件都在一个文件夹内,但是彼此之间没有耦合关系,则是不好的。
  • 如果父 element 是文件,则要移动文件内的函数和类,使得这些函数和类之间都是耦合的。如果两个函数都在一个文件内,但是彼此之间没有耦合关系,则是不好的。
  • 如果父 element 是类,则要移动类里面的方法,使得这些方法之间都是耦合的。如果两个方法都在一个类之内,但是彼此之间没有耦合关系,则是不好的。

耦合不是坏事情,只是一种客观存在。可以用来指导发现“父 element”的边界,然后通过移动边界,来达成内聚。