开闭原则

分享视频链接:https://www.bilibili.com/video/av97551981

 

下面是本次分享的幻灯片和文字稿:

大家好,我是来自软件工程2019级的王柯。今天我在这里和大家分享一下设计原则中的开闭原则。开闭原则是整个设计原则里最有用的一条,但同时他又是最难理解和掌握的一条原则。

首先,我们来思考一个问题:什么是软件开发中最不稳定的因素?

相信这个问题,不管是做过项目还是亲自在公司待过的同学,应该对这个问题都深有体会。在软件开发中,不管是客户还是老板,都有可能在开发的各个阶段给你提一些新的需求。

 

面对这些需求,我们可能需要对原有代码进行修改,这就可能会引入一些bug,我们也可能不得不对原有代码进行重构以及测试。那么,在代码修改、重构和测试的过程中,怎样保证整个软件开发的质量呢?这就需要提到我们今天的主题开闭原则:

开闭原则是面向对象世界里最基础的设计原则,它指导我们如何建立一个稳定,灵活,可扩展的系统。开闭原则定义如下:

 

一个软件实体(如类,模块和函数)应该对扩展开放,对修改关闭。怎么理解这句话呢?我们下面来看一下:

模块对扩展开放,就意味着需求变化时,可以对模块扩展,使其具有满足那些改变的新行为。换句话说,模块通过扩展的方式去应对需求的变化。

模块对修改关闭,表示当需求变化时,关闭对模块源代码的修改,当然这里的“关闭”应该是尽可能不修改的意思,也就是说,应该尽量在不修改源代码的基础上面扩展组件。

 这句话感觉是矛盾的,不让我修改,那我怎么扩展呢?

这句话应该这样来理解:软件扩展必须首先制定需求扩展标准,我们基于抽象标准来扩展我们的模块,而不用去修改抽象标准的代码。这就做到了对扩展开放,对修改关闭。

也就是说我们的软件主体依赖于抽象标准,而不依赖于具体实现。

总结一下,我们使用开闭原则的步骤:

1.在变化的需求中提炼共性、制定抽象标准

2.具体实现抽象标准

3.让软件主体依赖抽象标准

下面我们具体举例来说明一下:Windows 的主题是桌面背景图片、窗口颜色和声音等元素的组合。用户可以根据自己的喜爱更换自己的桌面主题,也可以从网上下载新的主题。这些主题有共同的特点,可以为其定义一个抽象类(Abstract Subject),而每个具体的主题(Specific Subject)是其子类。用户窗体可以根据需要选择或者增加新的主题,而不需要修改原代码,所以它是满足开闭原则的。

关于定义,我们有两点要注意:

① 开闭原则并不是说完全杜绝修改,而是以最小的修改代码的代价来完成新功能的开发。

② 同样的代码改动,在粗代码粒度下,可能被认定为“修改”;在细代码粒度下,可能又被认定为“扩展”。

 

我们要时刻具备扩展意识、抽象意识、封装意识。在写代码的时候,我们要多花点时间思考一下,这段代码未来可能有哪些需求变更,如何设计代码结构,事先留好扩展点,以便在未来需求变更的时候,在不改动代码整体结构、做到最小代码改动的情况下,将新的代码灵活地插入到扩展点上。

 谢谢大家!

 

posted @ 2020-03-20 09:24  王柯  阅读(236)  评论(0编辑  收藏  举报