设计原则和设计模式的关系:
设计原则更为抽象和基础。设计模式是设计原则在具体问题中的体现。设计原则为新设计模式的研究提供向导。
OO软件系统设计的核心问题:
可维护性(Maintainability)
可复用性 (Reuseability)
3.1 软件系统的可维护性
开发半年,维护多年
一个软件系统生命周期内,维护上面的钱,是开发上的钱的两倍
软件的维护
维护的含义:错误的清除、功能的扩充
好的软件设计必须允许新需求以容易和平稳的方式加入到已有系统中
一个软件生命周期内,常因为小改动的累计导致系统臃肿
设计师的辩解
常见辩解:用户需求变化无常。维护设计师和原始设计师不同时,理由更多。
首先,设计未必适合扩充;再者,即使适合扩充,维护设计师未必能理解原始设计师意图。
真正的原因
Rober C. Martin指出真正原因:
1) 过于僵硬
因新性能会波及多个模块而不敢轻易加入新功能
2) 过于脆弱
一个地方修改,可能导致未知地方发生错误
3) 复用率低
已有代码依赖于一堆东西,难以拆开
最原始的服用方式:代码拷贝粘贴
4) 黏度过高
两种方式:以保存原始设计意图和原始设计框架的方式改动;破坏原始意图和框架的方式改动。涉及到短期利益和中长期利益的问题。如果总是第二种方式比第一种方式方便,就是黏度过高
设计的目标
Peter Coad提出
1) 可扩展性
新新能很容易加入到系统中去
2) 灵活性
允许代码修改以很平稳的方式进行,不会涉及很多模块
3) 可插入性
很容易把一个类抽取,用一个同样接口的类替换
3.2 系统的可复用性
复用的重要性
好处:
1) 较高的生产效率
2) 较高的软件质量
3) 可改善系统可维护性
传统的复用方式
代码拷贝粘贴、算法的复用、数据结构的复用
可维护性和复用性有时会发生冲突,想要的:支持可维护性的复用
面向对象设计的复用
复用焦点的转移:不在集中在函数和算法等具体实现细节上,而是集中在含有商业逻辑的抽象层次上。
在面向对象的设计里面,可维护性复用是以设计原则和设计模式为基础的。
常见OO设计原则
开闭原则
里氏代换原则
依赖倒转原则
接口隔离原则
组合/聚合原则
迪米特法则