一、面向对象设计
变化是复用的天敌,OOP设计的最大优势在于抵御变化!
二、重新认识面向对象
- 理解隔离化:宏观来讲,OOP方式能够将变化所带来的影响减为最小;
- 各司其职:微观上看,OOP更强调各个类的职责,由于需求的变化导致新增类型不改变原来的实现
- 对象是什么:
- 语言层面:封装了代码和数据
- 规格层面:对象是一系列可被使用的公共接口
- 概念层面:对象是拥有某些责任或功能的抽象
三、面向对象设计原则
1. 依赖倒置原则(DIP) 非常重要,几乎贯穿所有设计模式
1.1 高层模块(稳定)应该应依赖底层实现(变化),二者都应该依赖于抽象;
1.2 抽象不应该依赖细节实现的变化,实现细节应该依赖于抽象;
2. 开放封闭原则(OCP)
2.1 对扩展开发,对更改封闭
2.2 类模块应该是可扩展的,但是不可修改;
3. 单一职责原则(SRP)
3.1 一个类应该仅有一个引起变化的原因;
3.2 变化的方向隐含着类的责任; *** 单个类不能太臃肿,这就隐含着多责
4. Liskov替换原则(LSP)
4.1 子类必须能够替代他们的基类 :父类能做的,子类都可实现
4.2 继承表达类型抽象:如果父类有很多方法子类没用,说明是组合关系而非继承关系
5. 接口隔离原则(ISP)
5.1 不应该强迫用户依赖不用的方法;
5.2 接口应该小而完备:子类用则protected,只自己用则private,必要时才使用public
6. 有限使用对象组合而非继承
6.1 类继承通常为"白箱复用",对象组合为"黑箱复用";
6.2 继承在某种程度上破坏了封装性,子类父类耦合度增加;
6.3 对象组合则要求对象具有良好的接口,耦合度低;
7. 封装变化原则
7.1 使用封装来创建对象的分阶层,设计者可以在分阶层一次进行修改,而不影响另一次
8. 面向接口编程而非面向实现编程
8.1 不将类型变量声明为具体类,而是某个接口;
8.2 客户程序无需获知对象的具体类型,而需知道对象接口;
8.3 减少系统中部分依赖关系,实现"高内聚、低耦合"的类型设计方案;
四、将设计原则提升为设计经验
- 设计习语:描述与特定编程语言相关的底层模式,技巧和惯用法;
- 设计模式:主要描述类与相互通信对象之间的组织关系,包括他们的角色、职责、写作方式等方面;
- 架构模式:描述系统中与基本结构组织关系密切的高层模式,包括子系统划分、职责,一级如何组织他们之间的关系规则;
#include <stdio.h>
int main()
{
// some codes
return 0;
}