- 模块化
将程序中的所有功能划分为一个一个相互独立不可分割的功能部件。其中模块内的功能特定又集中,具有着内聚的特性。而模块间则基本独立无关,但也可能存在着少量的依赖关系,这便又拥有着耦合的特性。一个优秀的模块化设计应尽可能做到“模块中高内聚,模块间低耦合”。 - 在模块中高内聚
若你开始使用诸如大段复制粘贴之类的方式编写程序,那你的程序恐怕就没有实现高内聚。内聚代表着强关联性,比如去掉某模块中的一个函数,则可能整个模块都会无法运行,因为其中的每个函数间相互关联相互依赖的。 - 在模块间低耦合
耦合代表着存在依赖关系,如去掉模块A,模块B则无法使用,说明B模块依赖于A模块。若去掉B模块,A模块也无法运行,则代表着A和B存在着双向依赖,这种情况应该避免。利用接口事件等方式将其调整为单向依赖,否则考虑将其合并为同一个模块
允许模块间依赖,但应该尽可能减少这种关系。模块之间应尽可能不相关不依赖,如去掉某模块,程序可能会缺失部分功能但大部分功能应该依然能正常运行。这样不仅程序出错的概率被降低,而且通用性强移植性好,也便于团队协作。 - 平衡内聚和耦合
模块化中的内聚和耦合是相互制衡的关系,模块的高内聚必然会导致模块间低耦合,反之同理。为了让软件开发更加便捷更加健壮,我们当然希望程序能尽可能的做到高内聚,但过于极端的追求会导致模块数量激增,项目变的过于复杂度,开发成本过高从而导致结果也适得其反。所以高内聚究竟要达到什么水平,这是一个权重值,需要根据具体场景进行调整,建议依据哈夫曼压缩原理进行决策。 - 单向依赖与逐层精化
上述有关耦合的描述中已经说明了一些有关单向依赖的问题,无法做到单向依赖会导致功能调整变得复杂且困难,项目的结构最终也会变成难以理解的网状。理想的项目结构应该类似树形拥有明显的层次关系。
从开发者的角度,我们知道一个模块可能要依赖于其他模块才能运行,但这对使用者来说却可能是透明的,因为每个模块都代表一种独立的功能,这就要求它最终要把这种依赖关系转变成封装关系,这也是为什么项目会产生层次性的原因。每一层都是对下层内容的封装,反过来每一层又都是对上层内容的细化,这便是逐层精化的由来。