
当系统比较小的时候,系统受到外部性的干扰不强烈,遵循“高内聚,低耦合”,实际上就将更多的权力配置在“模块内部定义”上面。
假设由于某种原因,“模块内部定义”也慢慢趋向正确,那么我们可以假设系统 Q 的各个模块的分解、聚合与耦合都是一种良性的状态。我们假设每个模块是 m1, m2, ... m[n] , 每个模块的强度,实际上是这个模块包含的操作数,为 s1, s2, ... s[m] 。
我们可以得到这个系统的总体操作度量:
F(Q) = Σ ( | m[i] | * s[i] )
在一定的时刻,我们可以假设 F(Q) 是个常量,因为需求是没有变化的,这个时候
F(Q) = Σ ( | m[i] | * s[i] ) ≈ c 是个常量。
考虑系统的平均操作数 S
S = c / n ≈ q
由于“高内聚,低耦合”,而且“模块内部定义”也是正确的,那么 S 就要趋向一个比较大的值,但由于需求是没有变化的,这个时候直接的做法就是扭曲模块的数量,甚至导致了某种必然的“模块内部定义”的瓦解。
由此我们看到,“模块内部定义”和“高内聚,低耦合”在特定的条件下,是矛盾的。甚至在系统比较大的时候,他们必然是矛盾的。
我们显然不能片面追求“高内聚,低耦合”,于是我们只能回到“恰当的模块设置、恰当的内聚方式、恰当的耦合方式”。
试想系统 Q 有两种需求相同但定义不同的模块设置方式,一种是 Qa = { a } ,一种是 Qb = { b } 。由于他们面向的是同一个系统的设计,所以有着相同的需求,那么 F(Qa) == F(Qb) == F(Q) == c。
如果 Qb 比 Qa 的内聚更高,耦合更少,那么
Sa > Sb, Ma == c / Sa < C / Sb = Mb, 即 Sa > Sb ==> Ma < Mb
如果 Qb 比 Qa 的内聚更高,耦合更少,那么
Sa < Sb, Ma == c / Sa > C / Sb = Mb, 即 Sa < Sb ==> Ma > Mb
也就是说,系统需求不变,两种模块定义方式都正确,内聚越高,模块越少,系统将会向模块数减少扭曲;内聚越低,模块越多,系统向模块数增加扭曲。
!!!!!!!!!!!!!!!!这!!!!!!!!!!!!!!!!!!!!!!
假设两种模块设置都是正确的,对于要不要从 Qa 扭曲到 Qb ,我们假设定义模块扭曲费用 Z(a, b) 和 内聚模式红利 Q(a) 和 Q(b),考虑三种关系:
Q(a) > Z(a, b) + Q(b) 即扭曲模块到高内聚的费用加上高内聚模块设置方式的红利,并不如低内聚的红利
Q(a) = Z(a, b) + Q(b) 即扭曲模块到高内聚的费用加上高内聚模块设置方式的红利,等于低内聚的红利
Q(a) < Z(a, b) + Q(b) 即扭曲模块到高内聚的费用加上高内聚模块设置方式的红利,高于低内聚的红利
容易知道,只有第三种情况,即扭曲模块到高内聚的费用加上新的模块设置方式的红利,高于低内聚的红利,奉行“高内聚,低耦合”才具有直接的现实意义,而另外两种情况都有局限性,即使得扭曲后所付出的费用和带来的红利(补偿)反而不如保持原状或约等于原状的红利。
所以“高内聚,低耦合”不是银弹。
--
修改:darkk FROM 118.26.128.*
FROM 118.26.128.*