知识卡片
模块化设计的六条分解规则
内容
模块化是把一个待开发的软件分解成若干独立开发、测试、最后再组装成整体的小部分(模块)的开发方法,是”分而治之”原则在软件开发领域的具体体现;模块通常由接口和实现两部分组成,接口隐藏内部具体实现,使开发可以面向接口而非面向具体应用,带来良好的封装性。但”如何分解”本身是一个需要规则约束的设计问题,书中给出六条规则:①最高模块内聚——模块内部元素要最大限度地关联,只实现一种功能的模块内聚度最高,具有三种以上功能的模块则内聚度低;②最低耦合——不同模块之间的关系要尽可能弱,以利于系统的升级和扩展;③模块大小适度——粒度过大会造成模块内部维护困难,粒度过小又会导致模块间耦合增加,两者是同一个”粒度选择”问题的两个对立失败模式;④模块调用链的嵌套深度不可过多;⑤接口干净、信息隐蔽;⑥尽可能复用已有模块。这六条规则中,①②③尤其值得注意——它们共同揭示了模块化设计本质上是一个多目标权衡问题:内聚度要求把强相关的东西聚在一起,耦合度要求把弱相关的东西分开,而粒度适中则要求这两个目标不能被推向任何一个极端(粒度越细,内聚度天然容易做高,但耦合会随之上升;粒度越粗,耦合天然容易做低,但内聚会被稀释)。相比模块,”服务组件”通常因为分布式协议(SOAP/HTTP/RMI-IIOP)调用的远程性能考虑而粒度更大,模块则更适合复用服务中的特定行为,两者是不同粒度层级上解决同类”复用与解耦”问题的互补方案。
参考来源
- 位置:《软件架构理论与实践》第1章《软件架构概述》"1.3.1 基础研究阶段(1968—1994)"节(源文件:_epub-src/OEBPS/text00008.html)
- 结论依据:原文明确列出"在把系统分解成模块时,应该遵循以下规则"六条,并逐条说明每条规则的判断标准(如"只实现一种功能的模块是最高内聚的,具有三种以上功能的模块则是低内聚的"),直接支撑本卡片结论;随后原文说明模块与服务组件在粒度和复用场景上的差异,支撑卡片末段的对比。
- 原始内容:①最高模块内聚。也就是在一个模块内部的元素最大限度地关联……②最低耦合。也就是不同模块之间的关系尽可能弱,以利于软件的升级和扩展。③模块大小适度。粒度过大会造成模块内部维护困难,而粒度过小又会导致模块间的耦合增加。