例如本文所举的这个例子,它太简单了,它只有一个方法,所以,无论是在代码级别上违
反单一职责原则,还是在方法级别上违反,都不会造成太大的影响。实际应用中的类都要复杂
的多,一旦发生职责扩散而需要修改类时,除非这个类本身非常简单,否则还是遵循单一职责
原则的好。
遵循单一职责原的优点有:
可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;
提高类的可读性,提高系统的可维护性;
变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以
显著降低对其他功能的影响。
需要说明的一点是单一职责原则不只是面向对象编程思想所特有的,只要是模块化的程序
设计,都适用单一职责原则。
设计模式六大原则(2):里氏替换原则
肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑。其实原因就
是这项原则最早是在 1988 年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出
来的。
定义 1:如果对每一个类型为 T1 的对象 o1,都有类型为 T2 的对象 o2,使得以 T1 定
义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型
T2 是类型 T1 的子类型。
定义 2:所有引用基类的地方必须能透明地使用其子类的对象。
问题由来:有一功能 P1,由类 A 完成。现需要将功能 P1 进行扩展,扩展后的功能为 P,
其中 P 由原有功能 P1 与新功能 P2 组成。新功能 P 由类 A 的子类 B 来完成,则子类 B 在完成
新功能 P2 的同时,有可能会导致原有功能 P1 发生故障。
解决方案:当使用继承时,遵循里氏替换原则。类 B 继承类 A 时,除添加新的方法完成
新增功能 P2 外,尽量不要重写父类 A 的方法,也尽量不要重载父类 A 的方法。
继承包含这样一层含义:父类中凡是已经实现好的方法(相对于抽象方法而言),实际上
是在设定一系列的规范和契约,虽然它不强制要求所有的子类必须遵从这些契约,但是如果子
类对这些非抽象方法任意修改,就会对整个继承体系造成破坏。而里氏替换原则就是表达了这
一层含义。
继承作为面向对象三大特性之一,在给程序设计带来巨大便利的同时,也带来了弊端。比
如使用继承会给程序带来侵入性,程序的可移植性降低,增加了对象间的耦合性,如果一个类
被其他的类所继承,则当这个类需要修改时,必须考虑到所有的子类,并且父类修改后,所有
涉及到子类的功能都有可能会产生故障。