软件设计之美
郑晔
开源项目 Moco 作者
19890 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 42 讲
软件设计之美
15
15
1.0x
00:00/00:00
登录|注册

21 | 开放封闭原则:不改代码怎么写新功能?

你好!我是郑晔。
上一讲,我们讲了一个最基础的设计原则:单一职责原则,从这个原则中,你知道了一个模块只应该包含来自同一个变化来源的内容。这一讲,我们来看下一个设计原则:开放封闭原则。
作为一名程序员,来了一个需求就要改一次代码,这种方式我们已经见怪不怪了,甚至已经变成了一种下意识的反应。修改也很容易,只要我们按照之前的惯例如法炮制就好了。
这是一种不费脑子的做法,却伴随着长期的伤害。每人每次都只改了一点点,但是,经过长期积累,再来一个新的需求,改动量就要很大了。而在这个过程中,每个人都很无辜,因为每个人都只是遵照惯例在修改。但结果是,所有人都受到了伤害,代码越来越难以维护。
既然“修改”会带来这么多问题,那我们可以不修改吗?开放封闭原则就提供了这样的一个新方向。

不修改代码

开放封闭原则是这样表述的:
软件实体(类、模块、函数)应该对扩展开放,对修改封闭。
这个说法是 Bertrand Meyer 在其著作《面向对象软件构造》(Object-Oriented Software Construction)中提出来的,它给软件设计提出了一个极高的要求:不修改代码。
或许你想问,不修改代码,那我怎么实现新的需求呢?答案就是靠扩展。用更通俗的话来解释,就是新需求应该用新代码实现。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

开放封闭原则是软件设计中的重要原则之一,要求软件实体对扩展开放,对修改封闭。本文通过酒店预订系统的例子详细解释了开放封闭原则的应用。作者指出,通过在软件内部留好扩展点,可以实现不修改代码而仅凭扩展就完成新功能。文章强调了构建稳定模块和找到共性的重要性,以及如何逐步构建扩展点,让系统稳定下来。此外,还提到了面向接口编程和设计扩展点的重要性。总之,本文深入浅出地阐释了开放封闭原则的重要性和实际应用,对软件开发人员具有很高的参考价值。

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

全部留言(23)

  • 最新
  • 精选
  • 业余爱好者
    第一个案例感觉就是把user类改成了充血模型,这样确实合理一些,因为价格生成策略因用户不同而不同,同时又加入userlevel类,这样就更职责单一了。 第二个案例从方法命名上就可以看出职责不单一了,连原作者都不知道这个方法干了什么,只好叫“process”这么泛泛的名字。 Unix那个,是“提供策略,而不是机制”吧,可能记错了,一直搞不清机制和策略是什么意思。

    作者回复: 去看看《Unix 编程艺术》,非常值得读的一本好书。

    2020-07-15
    3
    9
  • 桃子-夏勇杰
    软件系统是变与不变的交融艺术,变化带来发展,不变的是本质,是共性。没有不变的变化只是绚丽的海市蜃楼,透过变化抓住不变,才是抓住了核心与要义。

    作者回复: 写出了一种诗意。

    2020-07-28
    8
  • liliumss
    DDD的思路我觉得比较适合做,难就难到领域建模

    作者回复: DDD只能帮助你把骨架建起来,其中的细节,还是需要遵循着设计原则进行调整。

    2020-07-19
    8
  • Being
    可以简单说下我们公司GIS平台的框架,也是插件的扩展机制。比如对于不同文件的格式解析和保存,抽象出DataSource模型和Saver模型,作为一类数据源注册进插件模块来扩展,而框架则提供类似驱动的能力,由用户组合需要的数据源放入驱动,然后通过驱动,来获得按流程处理后的文件导出。

    作者回复: 很好的分享!

    2020-07-16
    7
  • 阳仔
    1、识别修改点,构建模型,将原来静态的逻辑转为动态的逻辑 2、构建模型的难点在于分离关注点,其次就是 找到共性

    作者回复: 非常好的总结!

    2020-07-15
    3
    6
  • 看了两遍 觉得这个开闭原则和函数式编程很搭啊😂😂

    作者回复: 别说,在不改动这件事上,还真的是异曲同工。

    2020-11-01
    5
  • 秃然的自我~
    那么用户等级和不同级别的类如何对应起来,用if else吗?

    作者回复: 工厂模式

    2021-02-03
    4
  • PM2
    java的SPI给开发者提供了不错的扩展机制,像spring boot 和dubbo就在此基础上做了改进,各自提供了扩展点,spring boot允许用户自定义starter,dubbo可以自定义协议等

    作者回复: 很好的分享

    2020-08-07
    4
  • 赵越
    开闭原则之前一直没理解,就在于这个名字翻译过来一点也不直观。今天才意识到应该这么说:“就是不要修改代码,新的功能要用新的代码实现。”。

    作者回复: 找到关键点了

    2021-05-11
    2
  • 第一装甲集群司令克莱斯特
    不是不让改代码,是不建议无设计的一团麻if else改代码,类内部膨胀,可读性,可维护性都不高。绝不再在类内部写硬代码,常量都抽取到配置文件去读取,拒绝硬代码!

    作者回复: 改能改得好,才是有价值的。

    2020-12-15
    1
收起评论
显示
设置
留言
23
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部