封装的意义
封装的定义:封装是一个过程,它分隔了构成抽象的结构元素和行为元素。(隐藏抽象的内部视图)
封装的作用:分离抽象的概念接口及其实现。
抽象关注对象可以观察到的行为,封装关注这种行为的实现。
封装通常采用信息隐藏来实现。
隐藏的内容:对象的结构、方法的实现。
让客户只看到接口,客户只需要抽象的职责,并不需要关心职责的实现细节,因为这对客户不重要。
明智的封装使一些可能发生改变的设计决策变得局部化(改变是对内部来说的,处于外部的客户完全不知道内部已经改变了,也不需要知道。)
模块化的意义
发现正确的类和对象、然后将他们放到不同的模块中,减少系统的复杂性!
模块化的定义:模块化是一个系统的属性,这个系统被分解为一组高内聚、低耦合的模块。
高内聚——将逻辑上相关的抽象放在一起
低耦合——减少模块间的依赖关系
分割程序可以在系统内部创造一个定义良好、有文档描述的边界(接口)
模块化将系统划分为一些模块,这些模块可以独立的编译,但又与其他模块有联系。
模块之间的联系是模块之间互相所作出的假定(模块将抽象打包成独立的单元,各个模块通过既定的接口联系)
分解为模块的目标:通过允许模块独立地设计和修改,减少软件的成本。
一个良好的独立的模块,应该能够在不知道其他模块的实现方法时进行修改,并且这种修改不会影响其他模块行为。
一般的方案是:将逻辑上相关的类和对象放在同一个模块中,只暴漏出其他模块必须看到的元素。(模块接口应该尽可能小,但又要满足其他用到它的模块的需要)
“可能独立变化”的系统细节,应该成为独立模块的秘密;模块之间存在的假定只能是那些“不太可能变化”的东西。
所以在建立模块边界时,要尽量减少开发团队中不同部分之间的接口。(这一块一般应该由经验丰富的设计师来做,经验较少者来完成模块的实现)
类和对象的确定是系统逻辑设计的一部分,模块的确定是系统物理设计的一部分。设计决策是以一种迭代的方式进行的,我们并不能再物理设计之前完成所有逻辑设计,反之亦然。