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

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

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

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

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

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

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

何时应对变化?

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

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

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

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

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

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

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

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程

设计模式启示录(二)

设计模式启示录(二) 在【设计模式启示录 (一)】中,重点介绍了设计模式的精髓(抽象),设计模式的分类(按抽象的目的进行分类)。在本篇中,将按照前述的七大分类,...

1687
来自专栏青玉伏案

设计模式(九): 从醋溜土豆丝和清炒苦瓜中来学习"模板方法模式"(Template Method Pattern)

今天是五.四青年节,祝大家节日快乐。看着今天这标题就有食欲,夏天到了,醋溜土豆丝和清炒苦瓜适合夏天吃,好吃不上火。这两道菜大部分人都应该吃过,特别是醋溜土豆丝,...

1649
来自专栏UDNZ

记一次 .NET Framework 不兼容 HTTP COOKIE 协议标准的问题跟踪

我们在后端系统实现了 HTTP 请求的代理类,用于请求其他第三方系统。

2648
来自专栏WeTest质量开放平台团队的专栏

【腾讯内部干货分享】安卓包体压缩——分析Dalvik字节码进行减包优化

对游戏整体的压缩却不影响场景,对图片的压缩却不影响品质。最麻烦的是对代码进行压缩,简直是让程序们熬白了头发只为包体再小个几K。

875
来自专栏章鱼的慢慢技术路

《算法图解》第五章笔记与课后练习_散列函数与散列表

1655
来自专栏算法修养

PHP 正则表达式抓取网页内容。

我想用php抓取爱奇艺生活类型视频网页里面的元素,应该如何去做呢? 首先我要非常熟悉正则表达式,关于正则表达式的学习,我会写一篇博客一直学习的。 直接举例子: ...

2756
来自专栏xingoo, 一个梦想做发明家的程序员

【AngularJS】—— 7 模块化

AngularJS有几大特性,比如:   1 MVC 2 模块化   3 指令系统   4 双向数据绑定 那么本篇就来看看AngularJS的模块...

1865
来自专栏从零开始学自动化测试

python笔记32-ddt框架报告优化

至于什么是ddt这个可以参考我之前写的博客内容,使用ddt框架的时候,有个问题困扰我很久了,一直没得到解决(也有很大小伙伴问过我,没解决抱歉了!) 这个问题就是...

1124
来自专栏CSDN技术头条

写出优质Java代码的4个技巧

我们平时的编程任务不外乎就是将相同的技术套件应用到不同的项目中去,对于大多数情况来说,这些技术都是可以满足目标的。然而,有的项目可能需要用到一些特别的技术,因此...

1857
来自专栏章鱼的慢慢技术路

《算法图解》第五章笔记与课后练习

1584

扫码关注云+社区