高质量编程的金玉良言——开放-封闭原则

什么是“开放-封闭”原则?

软件的类、模块、函数等交付后,如果需要增加功能,不要去修改原来的代码,而是通过新增加类的方法去扩展功能。

所谓的“开放”就是指开放接口,也就是通过增加子类的方法来增加功能;

“封闭”指的是封闭修改,也就是代码一旦提交,就不要再去修改它。

总而言之,“开放-封闭”原则的意思就是:在我们设计一个类的时候要尽量把这个类的功能考虑全面,然后一旦写好了交付给第三方使用之后就不要再去修改。如果确实需要给一个类增加功能,我们增加一个含有新功能的类,原来的代码不要动它。

但是,在实际开发中,“封闭”是相对的,一个类写完后并不能确保它未来永远都不会被修改。因此,在设计类的时候,应该要“猜”这个类未来会作哪些扩展,然后把这些扩展抽象出一个公共父类,父类中有这些子类都会执行的函数,只不过不同的子类函数实现不一样;这样,增加新功能时只要新建一个类,继承父类,覆盖父类中的函数,然后客户端需要使用新功能时,只要将新的子类对象赋给父类引用,再通过父类引用调用函数即可。

何时应对变化?

我们在设计或开发类的时候如果没有将未来可能扩展的功能考虑到,这没关系,只要在开发或新增需求的时候,一旦发现需要扩展功能并且需要修改原来代码,我们就立刻给这个类抽象出父类,让原本的功能和新增的功能都继承这个父类。

比如,我们一开始拿到需求是这样的:

开发一个软件,营业员只要输入原价,就能根据“满100返50”计算出折扣以后的价钱。

我们只需要创建一个折扣类,该类里面有一个打折函数,这个函数需要输入原价,然后它会按照“满100返50”的规则计算出折后价。

过了一阵子后,超市的需求改了:

由于超市隔三差五就要办促销活动,但每次促销活动的方式不一样,所以需要开发一个软件,营业员只要输入原价再选择活动类型后,就能计算出折扣以后的价钱。

此时我们发现,折扣的形式有多种多样,而现在我们的折扣类中只提供了“满100返50”的打折方式,如果要增加其他打折方式就要往折扣类里面增加新的打折方式,如果过了一阵子又要增加打折方式,就又要在折扣类里面增加代码,这就违背了“封闭修改”的原则。

正确的做法是,当我们发现需要增加打折功能的时候,我们将抽象出一个打折类,这个类中有一个抽象函数:discount(),然后让各种不同的打折方式类继承这个类,并重写各自的打折方式。类这样设计之后,当超市又要增加新的打折方式的时候,我们只需要创建一个新的打折类,去继承打折父类,并重写打折函数;然后客户端就可以调用这个新的功能了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端架构

CPU阿甘:函数调用的秘密

上帝为你关闭了一扇门,就一定会为你打开一扇窗这句话来形容我最合适不过了。 我是CPU, 他们都叫我阿甘, 因为我和《阿甘正传》里的阿甘一样,  有点傻里傻气的。...

752
来自专栏编程

一行 Python 代码实现并行

译者:caspar 译文:https://segmentfault.com/a/1190000000414339 原文:https://medium.com/b...

1869
来自专栏瓜大三哥

UVM(七)之phase及objection

UVM(七)之phase及objection 这两个概念与UVM验证平台息息相关,phase就好比铁轨,让UVM这趟列车在铁轨上向前运行,不会脱轨,不...

2548
来自专栏林冠宏的技术文章

php isset( $test ) 的神奇之处。

这次总结下 php 的一个 函数 :  boolean isset($test), 返回值:boolean类型,传入参数不为空,返回true,反之,false ...

17410
来自专栏醒者呆

Go并发模式:管道与取消

关键字:Go语言,管道,取消机制,并发,sync.WaitGroup,包引用,通道,defer,select GO并发模式:管道与取消 简介 Go的并发能...

2796
来自专栏编程

C语言嵌入式系统编程修炼之软件架构篇

这是我13年前创作和发表在互联网上的文章,这么多年过去了,这篇文章仍然在到处传播。现在贴回Linuxer公众号。 全文目录: C语言嵌入式系统编程修炼之道——背...

1897
来自专栏牛客网

基础题:深信服2018春季实习生面经

算法: 1、说一下二分查找 2、二分查找的条件是什么 3、说一下平衡二叉树的概念 4、你知道有哪些排序方式 5、归并排序的思想及时间空间复杂度 6、你知道图论算...

3457
来自专栏木宛城主

浅谈 SOLID 原则的具体使用

SOLID 是面向对象设计5大重要原则的首字母缩写,当我们设计类和模块时,遵守 SOLID 原则可以让软件更加健壮和稳定。那么,什么是 SOLID 原则呢?本...

1909
来自专栏数据派THU

教你用一行Python代码实现并行(附代码)

来源:编程派 翻译:caspar 译文:https://segmentfault.com/a/1190000000414339 原文:https://mediu...

21610
来自专栏PPV课数据科学社区

数据流编程教程:R语言与DataFrame

DataFrame DataFrame 是一个表格或者类似二维数组的结构,它的各行表示一个实例,各列表示一个变量。 一. DataFrame数据流编程 ? 二....

37912

扫描关注云+社区