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

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

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

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

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

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

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

何时应对变化?

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

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

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

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

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

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

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

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C++

python笔记:#001#python简介

1424
来自专栏iOS 开发

iOS 代码使用 C++ 的 zero-cost abstraction 特性

1843
来自专栏Java面试通关手册

一份送给Java初学者的指南

我自己总结的Java学习的系统知识点以及面试问题,目前已经开源,会一直完善下去,欢迎建议和指导欢迎Star: https://github.com/Snailc...

1393
来自专栏机器之心

人生苦短,为什么我要用Python?

本教程的目的是让你相信两件事:首先,Python 是一种非常棒的编程语言;其次,如果你是一名科学家,Python 很可能值得你去学习。本教程并非想要说明 Pyt...

941
来自专栏程序人生

重构:撰写合格的代码

在「代码重构之道」里,我犯了个懒,讨论了什么情况下需要考虑重构,以及工具和方法来促进重构,但对如何重构代码本身,或者说:如何把烂代码转化成好代码,或者至少是合格...

3568
来自专栏华章科技

人生苦短,为什么我要用Python?

导读:随着机器学习的兴起,Python 逐步成为了「最受欢迎」的语言。它简单易用、逻辑明确并拥有海量的扩展包,因此其不仅成为机器学习与数据科学的首选语言,同时在...

501
来自专栏Crossin的编程教室

【Python 第8课】while

学会了if,有一个好处,就是你能听懂下面这个笑话了: 老婆给当程序员的老公打电话:“下班顺路买一斤包子带回来,如果看到卖西瓜的,就买一个。” 当晚,程序员老公手...

3136
来自专栏java学习

Java每日一练(2017/8/10)

最新通知 ●回复"每日一练"获取以前的题目! ●【新】Android视频更新了!(回复【安卓视频】获取下载链接) ●【新】Ajax知识点视频更新了!(回复【学习...

2454
来自专栏腾讯移动品质中心TMQ的专栏

小说书架内容质量自动化测试

一.项目背景 小说书架的产品思路是:在手机QQ浏览器这个平台上,给用户提供一个小说书架这样的小说阅读入口。通过这个入口阅读到的小说,是后台将从其它网页中抽取到...

2185
来自专栏包子铺里聊IT

CS面试高频22条,你能过关么?

准备CS面试是一个非常累心的过程:算法又多又难,数据结构复杂多变,面向对象设计和系统设计根本没有正确答案,周边的关于计算机体系的基础知识浩如烟海,一般人无从下手...

38811

扫码关注云+社区