原则3-开放-封闭原则

我已经了解过了单一职责原则,对于一个类(或函数),有且只有一个导致其变化的原因,但是这样只能满足可复用性和可维护性,扩展性依然不好,我们来继续计算器的例子。

基于单一职责原则,我们把计算器拆分为UI类和逻辑处理类,我们甚至可以把职责细分,将所有的基本运算(加、减、乘、除)都单独封装成类,这样,某一个基本运算的调整修改不会影响到其他运算,满足了单一职责原则。

现在这个计算器只是针对十进制的基本运算,我想让这个计算器实现十六进制的基本运算,那我要调整所有这些基本运算类(加、减、乘、除)的算法细节,然后打包发布。过一段时间我想让这个计算器实现八进制运算,然后我需要继续改这些运算类,过段时间我又向实现二进制运算,你打算怎么办,过段时间,我又改回十进制运算,过段时间,我想让这些进制运算可选择执行,是不是一脸懵逼。这就违背了我们所说的开放-封闭原则。

 

开放-封闭原则:一个软件实体(类,函数,模块)应该可以扩展,但是不可修改。对于新的需求,对程序的改动应该是通过增加新代码进行的,而不是更改现有的代码。即多扩展,少修改。

 

开放-封闭原则的核心思想就是对抽象编程!我们在代码开发的过程中可能会根据基础需求确认了软件实体无法规避掉的变化点,也有可能在后期的维护中根据新增的需求发现了软件实体的变化点,无论在什么时间段,只要确认了变化点,就应该立即对软件实体进行抽象,从而实现对变化点进行封装隔离。这样做,如果在增加新的需求,我们只需要实现新的变化点就可以了,基础代码和其他已有的变化点不会被修改,而同样的,新的变化点实现后就不应该被修改了。

 

对于上面的例子,我们可以把所有基础运算进行抽象,拿除法为例,我们抽象一个除法类,定义“设置除数、被除数”等基础函数,定义“获取结果”虚函数,同时定义十进制/十六进制/八进制除法类来泛化(或实现)这个基类,client在调用的时候判断进制类型,使用指向具体进制类的基类指针进行获取结果操作即可,后面如果增加了其他进制类型的除法,只需要新创建一个类来泛化(或实现)这个基类即可。

 

开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所生成的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开发人员应该仅对程序中呈现出频繁变化的那些部分做出抽象,然而,对于应用程序中的每个部分都刻意地进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值