1. 说明
- 1.面向对象设计(Obiect-Oriented Design,OOD)是将 OOA 所创建的分析模型转化为设计模型,其目标是定义系统构造蓝图。
- 2.通常的情况是,由概念模型生成的分析模型被装入到相应的执行环境中时,需要考虑实现问题加以调整和增补,如根据所用编程语言是否支持多继承或继承,而调整类结构。
- 3.OOA 与 OOD之间不存在鸿沟,采用一致的概念和一致的表示法,OOD同样应遵循抽象、信息隐蔽、功能独立、模块化等设计准则。
2. 面向对象设计的活动
- 1.OOD 在复用 OOA 模型的基础上,包含与 OOA 对应如下五个活动,识别类及对象、定义属性、定义服务、识别关系、识别包。
- 2.和所有其他设计活动一样,要使系统的结构好且效率高,做好相互间的平衡是困难的。
- 3.分析模型已经提供了概念结构,它将试图长期保存。
- 4.另外,设计期必须充分考虑系统的稳定性,如目标环境所需的最大存储空间、可靠性和响应时间等,所有这些都会影响系统的结构。
- 5.对象标识期间的目标是分析对象,设计过程也是发现对象的过程,称之为再处理,并补充几个新的组成部分,即与实现有关的因素:图形用户界面系统,硬件操作系统及网络,数据管理系统以及编程语言和可复用构件库等。
- 6.OOD应该尽可能隔离实现条件对系统的影响,对不可隔离的因素按实现条件调整 OOA 模型。
- 7.因此,必须有从分析模型到设计模型到程序设计语言的线性转换规则。
- 8.对象可以用预先开发的源代码实现,称这样的部分为构件(Component)。
- 9.由于这些构件是功能和数据的组装,因此,常常用于简化面向对象环境的产生。
3. 面向对象设计的原则
3.1 单一责任原则
- 1.Single Responsibility Principle,SRP
- 2.就一个类而言,应该仅有一个引起它变化的原因。
- 3.当需要修改某个类的时候原因有且只有一个,让一个类只做一种类型责任。
3.2 开放-封闭原则
- 1.Open & Close Principle,OCP
- 2.软件实体(类、模块、函数等)应该是可以扩展的,即开放的;但是不可修改的,即封闭的。
3.3 里氏替换原则
- 1.Liskov Substitution Principle,LSP。
- 2.子类型必须能够替换掉他们的基类型。
- 3.在任何父类可以出现的地方,都可以用子类的实例来赋值给父类型的引用。
- 4.当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有是一个(is-a)关系。
3.4 依赖倒置原则
- 1.Dependence Inversion Principle, DIP
- 2.抽象不应该依赖于细节,细节应该依赖于抽象。
- 3.高层模块不应该依赖于低层模块,二者都应该依赖于抽象。
3.5 接口分离原则
- 1.Interface Segregation Principle,ISP
- 2.不应该强迫客户依赖于它们不用的方法。
- 3.接口属于客户,不属于它所在的类层次结构。
- 4.依赖于抽象,不要依赖于具体,同时在抽象级别不应该有对于细节的依赖。
- 5.这样做的好处就在于可以最大限度地应对可能的变化。
3.6 重用发布等价原则
- 1.Release Reuse Equivalency Principle,REP
- 2.重用的粒度就是发布的粒度。
3.7 共同封闭原则
- 1.Common Closure Principle,CCP
- 2.包中的所有类对于同一类性质的变化应该是共同封闭的。
- 3.一个变化若对一个包产生影响,则将对该包中的所有类产生影响,而对于其他的包不造成任何影响。
3.8 共同重用原则
- 1.Common Reuse Principle,CRP。
- 2.一个包中的所有类应该是共同重用的。如果重用了包中的一个类,那么就要重用包中的所有类。
3.9 无环依赖原则
- 1.Acyclic Dependencies Principle,ADP。
- 2.在包的依赖关系图中不允许存在环,即包之间的结构必须是一个直接的五环图形。
3.10 稳定依赖原则
- 1.Stable Dependencies Principle,SDP。
- 2.朝着稳定的方向进行依赖。
3.11 稳定抽象原则
- 1.Stable Abstractions Principle,SAP。
- 2.包的抽象程度应该和其稳定程度一致。
4. 例题
4.1 例题1
1.以下关于面向对象设计的叙述中,错误的是(D)
A.高层模块不应该依赖于底层模块
B.抽象不应该依赖于细书
C.细节可以依赖于抽象
D.高层模块无法不依赖于底层模块
依赖倒置原则,抽象不应该依赖于细节,细节应该依赖于抽象。
即,高层模块不应该依赖于低层模块,二者都应该依赖于抽象。所以选D