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

2020-04-12  本文已影响0人  高大强19

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

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

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

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

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

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

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

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

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

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

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

上一篇 下一篇

猜你喜欢

热点阅读