前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >高质量编程的金玉良言——开放-封闭原则

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

作者头像
大闲人柴毛毛
发布2018-03-09 11:50:14
7630
发布2018-03-09 11:50:14
举报

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

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

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

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

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

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

何时应对变化?

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

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

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

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

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

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

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年08月31日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档