
2.2 开闭原则
2.2.1 开闭原则定义
一般认为最早提出开闭原则(Open-Close Principle,OCP)的是伯特兰·迈耶。他在1988 年发表的《面向对象软件构造》中给出的。在面向对象编程领域中,开闭原则规定软件中的对象、类、模块和函数对扩展应该是开放的,但对于修改是封闭的。这意味着应该用抽象定义结构,用具体实现扩展细节,以此确保软件系统开发和维护过程的可靠性。
开闭原则的核心思想也可以理解为面向抽象编程。
2.2.2 模拟场景
对于外部的调用方来说,只要能体现出面向抽象编程,定义出接口并实现其方法,即不修改原有方法体,只通过继承方式进行扩展,都可以体现出开闭原则。
这里计算三种形状的面积,如长方形、三角形、圆形,它们在类中已经按照固定的公式实现,其中圆形面积公式中π=3.14。但后续由于π值取的精度对于某些场景是不足的,需要扩展,接下来就通过模拟这个场景体现开闭原则。
(1)场景案例代码。
(2)定义接口。分别定义了三种求面积的接口。


·长方形面积,长×宽。
·三角形面积,使用海伦公式,S=,其中p=(a+b+c)/2。
·圆形面积,S=πr2。
(3)实现类。在实现类中,分别实现三种类型的面积计算,长方形(rectangle)、三角形(triangle)、圆形(circular)。其中,圆形面积的 π 值取的是 3.14D,这也是要扩展精度的方法和体现开闭原则的地方。

2.2.3 违背原则方案
如果不考虑开闭原则,也不思考这种方法在整个工程服务中的使用情况,那么直接修改π值就可以了;但这样做就会破坏整个工程服务的稳定性,也会造成一些风险。
例如,用原来精度的π值计算出的圆形面积本可以满足需求,但是因为精度加长破坏了原有精度下的稳定性,就像齿轮间的啮合程度、方向盘的间隙等。

2.2.4 开闭原则改善代码
按照开闭原则方式实现起来并不复杂,它的主要目的是不能因为个例需求的变化而改变预定的实现类,除非预定的实现类有错误。
实现过程是继承父类扩展需要的方法,同时可以保留原有的方法,新增自己需要的方法。

扩展后的方法已经把求圆形面积的精度增长,需要使用此方法的用户可以直接调用。而其他的方法,如长方形面积、三角形面积,则可以继续使用。