设计模式之美
王争
前 Google 工程师,《数据结构与算法之美》专栏作者
123425 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 113 讲
设计模式与范式:行为型 (18讲)
设计模式之美
15
15
1.0x
00:00/00:00
登录|注册

16 | 理论二:如何做到“对扩展开放、修改关闭”?扩展和修改各指什么?

为什么要“对扩展开放、对修改关闭”?
在项目中灵活应用开闭原则
做到“对扩展开放、修改关闭”
理解“对扩展开放、对修改关闭”
在扩展性和可读性之间做权衡
对于不确定的需求,等需求驱动时通过重构代码来支持扩展
识别确定的、短期内可能扩展的需求,预留扩展点
使用设计原则、思想、模式来提高代码扩展性
多花时间思考未来可能的需求变更,预留扩展点
具备扩展意识、抽象意识、封装意识
代码改动可能在不同粒度下被认定为“修改”或“扩展”
添加新功能应该通过扩展代码而非修改已有代码
课堂讨论
重点回顾
如何在项目中灵活应用开闭原则?
如何做到“对扩展开放、修改关闭”?
如何理解“对扩展开放、对修改关闭”?
开闭原则

该思维导图由 AI 生成,仅供参考

在上一节课中,我们学习了单一职责原则。今天,我们来学习 SOLID 中的第二个原则:开闭原则。我个人觉得,开闭原则是 SOLID 中最难理解、最难掌握,同时也是最有用的一条原则。
之所以说这条原则难理解,那是因为,“怎样的代码改动才被定义为‘扩展’?怎样的代码改动才被定义为‘修改’?怎么才算满足或违反‘开闭原则’?修改代码就一定意味着违反‘开闭原则’吗?”等等这些问题,都比较难理解。
之所以说这条原则难掌握,那是因为,“如何做到‘对扩展开放、修改关闭’?如何在项目中灵活地应用‘开闭原则’,以避免在追求扩展性的同时影响到代码的可读性?”等等这些问题,都比较难掌握。
之所以说这条原则最有用,那是因为,扩展性是代码质量最重要的衡量标准之一。在 23 种经典设计模式中,大部分设计模式都是为了解决代码的扩展性问题而存在的,主要遵从的设计原则就是开闭原则。
所以说,今天的内容非常重要,希望你能集中精力,跟上我的思路,将开闭原则理解透彻,这样才能更好地理解后面章节的内容。话不多说,让我们正式开始今天的学习吧!

如何理解“对扩展开放、修改关闭”?

开闭原则的英文全称是 Open Closed Principle,简写为 OCP。它的英文描述是:software entities (modules, classes, functions, etc.) should be open for extension , but closed for modification。我们把它翻译成中文就是:软件实体(模块、类、方法等)应该“对扩展开放、对修改关闭”。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了软件开发中的开闭原则,即对扩展开放、对修改关闭的设计原则。通过详细的代码示例和解释,阐述了如何通过扩展而非修改代码来实现新功能,以遵循开闭原则。文章通过重构一个API接口监控告警的示例代码,展示了如何将原有的代码改动为基于扩展的方式,从而实现新功能的添加。重构后的代码更加灵活和易于扩展,只需创建新的handler类即可添加新的告警逻辑,而无需修改原有代码。作者还讨论了代码改动是否违背开闭原则的问题,并提出了对扩展开放、修改关闭的设计思路。此外,文章还介绍了如何利用多态、依赖注入、基于接口而非实现编程等方法来实现“对扩展开放、对修改关闭”。总的来说,本文内容详实,适合开发人员学习和理解如何应用开闭原则来提高代码质量和可维护性。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(288)

  • 最新
  • 精选
  • 航哥很帅
    之所以会有对扩展开放,对修改关闭的原则,是因为对扩展开放能够应对业务需求的变化,从而实现已有功能的扩展,而对修改关闭是为了保证在扩展新的需求是,能够保证已有功能的稳定。 对扩展开放,对修改关闭原则,听起来很简单,就是指我们在开发时尽可能的少修改已有的代码,而应该增加新的代码来实现新的功能。但对于这个原则,往往是很难绝对执行的,因为即使是完全增加新的功能,也很难做到百分百不修改原来的代码。所以,对扩展开放,对修改关闭的原则,用大白话来说就是在尽可能少修改以后功能代码的情况下,通过增加新的功能代码来实现新的功能。 如果想做到对扩展开放,对修改关闭,作为一个程序员要有扩展意识、封装意识和抽象意识。这三个意识听起来很简单,但要真正的做到必须要多实践多练习才能够慢慢的心领神会。

    作者回复: 总结的好

    2020-11-17
    19
  • feifei
    文中的alter 一步一步的改造,看的眼花缭乱的😂,我就问下,为什么不能直接在原始的Alter 类中,重载一个只有新增业务参数的check 放到的,这样不就最简单,原先开发好也不用动,这样对于Alter 类来说不是对扩展开放,对修改关爱了吗?请教下大神,我这种用重载的思路有啥,不好的地方

    作者回复: 重载可以。但如果报警规则很多的花 类会无限膨胀 可读性比较茶

    2019-12-18
    10
    14
  • 梦倚栏杆
    关于修改后的报警规则代码实现有两个疑问: 1. ApiStateInfo class 是充血模型还是贫血模型。 2.其实各个handler侧重的是不同的方方面面,比如错误次数,超时次数。统一接收ApiStateInfo 和 某一个handler接收具体的类比如:ErrorRequestApiStateInfo, TimeOutStateInfo, 哪种方式好呢?比较依据是什么

    作者回复: 1. 是贫血模型 2. 不好讲,拆分之后,类增加,维护成本高一些,但职责更单一,更加高内聚、低耦合,扩展性更好些。

    2019-12-09
    5
    11
  • 土豆哪里挖
    什么时候出其他语言的demo呢,不懂java,理解起来太痛苦了

    作者回复: 关注我的github:https://github.com/wangzheng0822

    2019-12-09
    3
    5
  • Kingram
    为什么要遵循开闭原则? 1、修改原有复杂的业务代码本来就存在一定的风险,同时耗费精力,可能影响到别的你不知道的地方,导致程序运行故障。 2、修改代码同时单元测试也要跟着修改,浪费时间精力。 3、可扩展性差的代码同时封装性也会差,违背面向对象设计原则。 补充:但是注意不要过度设计呦

    作者回复: 嗯呢 ������

    2020-11-26
    2
    2
  • 了@事@牵
    争哥, public class MessageFormatter implements MessageFormatter {//...} 这段代码是不是有问题?

    作者回复: 是的,我改下,多谢指出

    2020-07-04
    2
  •  1234567890
    老师请教你个问题,什么是粗粒度代码什么是细粒度代码?

    作者回复: 这个要根据实际情况来定

    2020-11-27
    1
  • fenciso
    对修改关闭,是为了增加新功能,但不影响已有的功能,增加不必要的成本。对拓展开发就是为了应对不断变化的功能需求

    作者回复: 对的

    2020-11-22
    1
  • Leo
    为什么我们要“对扩展开放、对修改关闭”? 写代码一方面是为了满足功能需求,另一方面是为了让「他人」读懂,而不是自嗨。设计模式不是为了展现自己的能力,而是为了应对变化,很多软件需要做成插件、或者可插拔架构,都是为了方便其他人拓展。 「对扩展开放」是为了适应变化,「对修改关闭」是把代码封装好,减少不必要的错误改动。

    作者回复: 嗯嗯������

    2020-11-20
    1
  • 薯片
    if分支很多,用handler导致类爆炸怎么处理?

    作者回复: 没看懂你说的 为什么handler类会爆炸呢

    2019-12-29
    13
    1
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部