《架构整洁之道》之里氏替换原则
1988年,Barbara Liskov在描述如何定义子类型时写下这样一段话:
这样需要的是一种可替换性:如果对于每个类型是S的对象o1都存在一个类型为T的对象o2,能使操作T类型的程序P在用o2替换o1时行为保持不变,我们就可以将S称为T的子类型。
在面向对象这场编程革命兴起的早起,我们的普遍认知正如上文所说,认为LSP只不过是指导如何使用继承关系的一种方法,然而随着时间的推移,LSP逐渐演变成一种更广泛、指导接口与其实现方式的设计原则。
这里提到的接口可以有多种形式-可以是Java风格的接口,具有多个实现类;也可以像Ruby一样,几个类公用一样的方法签名,甚至可以是几个服务响应同一个REST接口。
LSP适用于上述所有的应用场景,因为这些场景中的用户都依赖于一种接口,并且都期待实现该接口的类之间能具有可替换性。
LSP可以且应该被应用于软件架构层面,因为一旦违背了可替换性,该系统架构就不得不为此增添大量复杂的应对机制。