美文网首页
什么是对扩展开放、修改关闭

什么是对扩展开放、修改关闭

作者: 高大强19 | 来源:发表于2020-04-12 23:02 被阅读0次

SOLID 中的第二个原则:开闭原则。开闭原则是 SOLID 中最难理解、最难掌握,同时也是最有用的一条原则。

这条原则难理解,那是因为,“怎样的代码改动才被定义为‘扩展’?怎样的代码改动才被定义为‘修改’?怎么才算满足或违反‘开闭原则’?修改代码就一定意味着违反‘开闭原则’吗?”等等这些问题,都比较难理解。

扩展性是代码质量最重要的衡量标准之一。在 23 种经典设计模式中,大部分设计模式都是为了解决代码的扩展性问题而存在的,主要遵从的设计原则就是开闭原则。

什么是对扩展开放、修改关闭?

添加一个新的功能应该是,在已有代码基础上扩展代码(新增模块、类、方法等),而非修改已有代码(修改模块、类、方法等)。

开闭原则讲的就是代码的扩展性问题,在讲具体的方法论之前,先来看一些更加偏向顶层的指导思想。为了尽量写出扩展性好的代码,要时刻具备扩展意识、抽象意识、封装意识。这些“潜意识”可能比任何开发技巧都重要。

在写代码的时候后,要多花点时间往前多思考一下,代码未来可能有需求变更、如何设计代码结构,事先留好扩展点,以便在未来需求变更的时候,不需要改动代码整体结构、做到最小代码改动的情况下,新的代码能够很灵活地插入到扩展点上,做到“对扩展开放、对修改关闭”。还有,在识别出代码可变部分和不可变部分之后,要将可变部分封装起来,隔离变化,提供抽象化的不可变接口,给上层系统使用。当具体的实现发生变化的时候,只需要基于相同的抽象接口,扩展一个新的实现,替换掉老的实现即可,上游系统的代码几乎不需要修改。

在众多的设计原则、思想、模式中,最常用来提高代码扩展性的方法有:多态、依赖注入、基于接口而非实现编程,以及大部分的设计模式(比如,装饰、策略、模板、职责链、状态等)。

如何在项目中灵活应用开闭原则?

对于一些比较确定的、短期内可能就会扩展,或者需求改动对代码结构影响比较大的情况,或者实现成本不高的扩展点,在编写代码的时候之后,就可以事先做些扩展性设计。但对于一些不确定未来是否要支持的需求,或者实现起来比较复杂的扩展点,可以等到有需求驱动的时候,再通过重构代码的方式来支持扩展的需求。

而且,开闭原则也并不是免费的。有些情况下,代码的扩展性会跟可读性相冲突。为了更好地支持扩展性,对代码进行重构,重构之后的代码要比之前的代码复杂很多,理解起来也更加有难度。很多时候,都需要在扩展性和可读性之间做权衡。在某些场景下,代码的扩展性很重要,就可以适当地牺牲一些代码的可读性;在另一些场景下,为了代码的可读性更加重要,那就适当地牺牲一些代码的可扩展性。

相关文章

  • 开闭原则

    对扩展开放、修改关闭 1 如何理解“对扩展开放、修改关闭”? 开闭原则的英文全称是 Open Closed Pri...

  • 什么是对扩展开放、修改关闭

    SOLID 中的第二个原则:开闭原则。开闭原则是 SOLID 中最难理解、最难掌握,同时也是最有用的一条原则。 这...

  • 设计模式的原则(6+1)

    开闭原则【OPEN CLOSE PRINCIPLE】:类、模块和函数等应该对扩展开放,对修改关闭(即:扩展时不修改...

  • 面向对象7原则

    OCP 全称:“Open-Closed Principle” 开放-封闭原则 说明:对扩展开放,对修改关闭。 优点...

  • 那些你要知道的设计原则之-开闭原则

    1.定义 1.一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。对组建的功能扩展是开放的,对原有代码的修改是...

  • 设计模式 开闭原则

    设计模式 - 开闭原则即 对立与统一原则 什么是开闭原则 软件实体应该对扩展开放,对修改关闭,即实体应当通过扩展实...

  • 设计模式 - 七大原则

    开闭原则 对扩展开放,对修改关闭;再不修改原业务代码的前提下,扩展新功能。 ; 描述:开闭原则 是 面向对象设计的...

  • 面向对象设计--开闭原则

    定义 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。 对扩展开放:这意味着模块的行为是可以扩展的。当应用...

  • 软件设计六大原则

    总原则 开放封闭原则(Open Close Principle) 定义:对扩展开放,对修改关闭。用抽象构建框架,用...

  • 设计模式--装饰者模式

    设计原则: 少用继承,多用组合 类应该对扩展开放,对修改关闭 目录 本文的结构如下: 什么是装饰者模式 为什么要用...

网友评论

      本文标题:什么是对扩展开放、修改关闭

      本文链接:https://www.haomeiwen.com/subject/ptgimhtx.html