分享视频链接:https://www.bilibili.com/video/av97551981
下面是本次分享的幻灯片和文字稿:
大家好,我是来自软件工程2019级的王柯。今天我在这里和大家分享一下设计原则中的开闭原则。开闭原则是整个设计原则里最有用的一条,但同时他又是最难理解和掌握的一条原则。
首先,我们来思考一个问题:什么是软件开发中最不稳定的因素?
相信这个问题,不管是做过项目还是亲自在公司待过的同学,应该对这个问题都深有体会。在软件开发中,不管是客户还是老板,都有可能在开发的各个阶段给你提一些新的需求。
面对这些需求,我们可能需要对原有代码进行修改,这就可能会引入一些bug,我们也可能不得不对原有代码进行重构以及测试。那么,在代码修改、重构和测试的过程中,怎样保证整个软件开发的质量呢?这就需要提到我们今天的主题开闭原则:
开闭原则是面向对象世界里最基础的设计原则,它指导我们如何建立一个稳定,灵活,可扩展的系统。开闭原则定义如下:
一个软件实体(如类,模块和函数)应该对扩展开放,对修改关闭。怎么理解这句话呢?我们下面来看一下:
模块对扩展开放,就意味着需求变化时,可以对模块扩展,使其具有满足那些改变的新行为。换句话说,模块通过扩展的方式去应对需求的变化。
模块对修改关闭,表示当需求变化时,关闭对模块源代码的修改,当然这里的“关闭”应该是尽可能不修改的意思,也就是说,应该尽量在不修改源代码的基础上面扩展组件。
这句话感觉是矛盾的,不让我修改,那我怎么扩展呢?
这句话应该这样来理解:软件扩展必须首先制定需求扩展标准,我们基于抽象标准来扩展我们的模块,而不用去修改抽象标准的代码。这就做到了对扩展开放,对修改关闭。
也就是说我们的软件主体依赖于抽象标准,而不依赖于具体实现。
总结一下,我们使用开闭原则的步骤:
1.在变化的需求中提炼共性、制定抽象标准
2.具体实现抽象标准
3.让软件主体依赖抽象标准
下面我们具体举例来说明一下:Windows 的主题是桌面背景图片、窗口颜色和声音等元素的组合。用户可以根据自己的喜爱更换自己的桌面主题,也可以从网上下载新的主题。这些主题有共同的特点,可以为其定义一个抽象类(Abstract Subject),而每个具体的主题(Specific Subject)是其子类。用户窗体可以根据需要选择或者增加新的主题,而不需要修改原代码,所以它是满足开闭原则的。
关于定义,我们有两点要注意:
① 开闭原则并不是说完全杜绝修改,而是以最小的修改代码的代价来完成新功能的开发。
② 同样的代码改动,在粗代码粒度下,可能被认定为“修改”;在细代码粒度下,可能又被认定为“扩展”。
我们要时刻具备扩展意识、抽象意识、封装意识。在写代码的时候,我们要多花点时间思考一下,这段代码未来可能有哪些需求变更,如何设计代码结构,事先留好扩展点,以便在未来需求变更的时候,在不改动代码整体结构、做到最小代码改动的情况下,将新的代码灵活地插入到扩展点上。
谢谢大家!
原文:https://www.cnblogs.com/wangke0825/p/12523445.html