第二章 OO大原则
2.1.1 引言
好的设计,成就好的作品:僵化的设计,则会使你的作品大打折扣。在软件领域更是如此。Bob大叔在其《敏捷软件开发——原则、模式与实践》一书的序言中就讲到“美的东西比丑的东西创建起来更廉价,也更快捷。”可见追求美好的软件设计不光是代码优雅的问题,更关乎生产成本。对于软件架构的研究经历了很长时间的摸索,在面向过程到面向对象,从设计原则到设计模式,对于如何设计更好软件的探索,从未停止。技术大师总结了很多设计上的经典法则,后来者可以站在巨人的肩膀上尽情享受丰富而珍贵的经验。
在第1章“OO大智慧”中,我们分析和讨论了面向对象技术的基本要素,对继承、封装、多态和接口等进行了基本的讨论,如何将这些基本技术应用的得心应手,是本章要阐释的问题和目标。面向对象的原则也正是如何使用继承、封装、多态和接口技术进行优良设计的原则总结和规律认识,因此这两掌的内容相辅相成,互为补充。
2.1.2 原则综述
本章将重点讲述最基本的5个设计原则,分别是:单一职责原则、开放封闭原则、依赖倒置原则、接口隔离原则和Liskov替换原则,在表2-1中列出了主要的一些面向对象设计原则及其简单描述,详细的分析将在本章各节逐步展开。
表2-1 设计原则
设计原则 |
英文表达 |
说明 |
单一职责原则 |
SRP:Single Responsibility Principle |
一个类,应该仅有一个引起它变化的原因,不要将变化原因不同的职责封装在一起,而应该隔离。 |
开放封闭原则 |
OCP,Open Closed Principle |
软件实体应当对修改关闭,对扩展开放 |
依赖倒置原则 |
DIP,Dependency Inversion Principle |
依赖了抽象,而不要依赖于具体,因为抽象相对稳定 |
接口隔离原则 |
ISP,Interface Segregation Principle |
尽量应用专门的接口,而不是单一的总接口,接口应该面向用户,将依赖建立在最小的接口上 |
Liskov替换原则 |
LSP,Liskov Substitution Pinciple |
子类必须能够替换其基类 |
合成/聚合复用原则 |
CARP,Composite/Aggregate Reuse Principle |
在新对象中聚合已有对象,使之成为新对象的成员,从而通过操作这些对象达到复用的目的。合成方式较继承方式耦合更松散,所以应该少继承、多聚合 |
迪米特法则 |
LoD,Law of Demeter |
又叫最小知识原则,指软件实体应该尽可能少的和其他软件实体发生相互作用 |
在本书中,我们只对前5大原则进行系统论述,关于合成/聚合复用原则,在1.2节“什么是继承”中已经有相关的论述。