前言
任何原则和理论的提出都是前人处理原来的一些问题的总结下提出来的,原则和理论就是一条正确的道路,是前人为了让我们不犯以前出过的错而写下的指导思想。
为什么把里氏代换原则和开闭原则放在一起说呢,个人认为他是面向对象的基本原则,是我们,这两个原则定义了类的创建的原则和对面向对象软件设计中对整个结构的更改的基本原则,也就是说它们限定了类的设计过程中的分类原则和在面对变化时设计过程中应该如何设计的原则,通过这些原则才会有一些设计模式去解决类的创建和扩展的模式。在下面的章节中将得到一些个人阐述。
里氏代换原则(LSP)
里氏代换原则一句话来说就是基类出现的地方,子类一定可以出现。那么判定的标准就是当子类替换掉基类的时候,软件功能单元的行为不会发生改变,不会影响到原来的功能,基类才可以真正复用,它是继承和分类的基石,也是开闭原则实现的基础。
里氏代换原则是一个分类学上的原则,是人类对事物的分类一种方式,面向对象也就是希望按人类的视角以看待事物并应用到计算机软件的设计上的,这个原则决定了类继承关系,决定的设计中的分类和对象的创建和引用,不符合里氏代换原则的情况,设计的类和继承关系是有问题,在引用基类的地方代入子类后,会产生行为上的变化,那么职责划分的时候会觉得很别扭,这个时候很多程序员会将就的将不该这个分类有的行为放进来,以满足设计中错误的分类和继承关系,带来一些不必要,这就会影响到开闭原则。
最经典的例子,是长方型和正方型的例子,可以在网上搜索下。
开闭原则(OCP)
开闭原则一句话说来就是对修改的关闭,对扩展的开放。也就是说在设计过程中应该当充分考虑到当一个功能需要改变或者增加一些行为的时候你的设计应该是用扩展的方式将功能的行为改变或者增加,而不是直接修改,很多设计原则都是基于开闭原则的,也就是说他有两个方面。
- 对于扩展是开放的(Open for extension): 这意味着模块的行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。也就是说,我们可以改变模块的功能。
- 对于修改是关闭的(Closed for modification)。对模块行为进行扩展时,不必改动模块的源代码或者二进制代码。
最典型的不符合开闭原则的设计就是当一个系统分析师设计了一个模块交给程序员实现的时候,当一个类需要增加一个行为时,程序员没办法通过继承一个接口和抽象类来达到目的,而是要在代码中增加一些判断来实现,这个时候就要分析这个设计了,基本上是不符合开闭原则的。
后续
有那些是为了符合或者实现里氏代换原则的设计模式,在接下来的文章中会进一步的说明和解析。
同时也记住这些理论和原则提出的理论家,里氏代换原则提出者BarbaraLiskov,勃兰特·梅耶(Bertrand Meyer)在面向对象软件构造(Object Oriented Software Construction)》提出了开闭原则。