开放封闭

开放封闭原则

Software entities like classes, modules and functions should be open for extension but closed for modifications.

软件实体,如:类、模块与函数,对于扩展应该是开放的,但对于修改应该是封闭的。简言之,对扩展开放,对修改封闭。当需求发生改变的时候,我们需要对代码进行修改,这个时候我们应该尽量去扩展原来的代码,而不是去修改原来的代码,因为这样可能会引起更多的问题。

但是如果能够确保对整体架构不会产生任何影响,那么也没必要搞得那么复杂了;直接改这个类吧,有时候过度拘泥模式而导致代码膨胀反而得不偿失。假设你是一名成功的开源类库作者,很多开发者使用你的类库。如果某天你要扩展功能,只能通过修改某些代码完成,结果导致类库的使用者都需要修改代码。更可怕的是,他们被迫修改了代码后,又可能造成别的依赖者也被迫修改代码。这种场景绝对是一场灾难。如果你的设计是满足开闭原则的,那就完全是另一种场景。你可以通过扩展,而不是修改来改变软件的行为,将对依赖方的影响降到最低。

实现开闭原则的关键是抽象。在 Bertrand Meyer 提出开闭原则的年代(上世纪 80 年代),在类库中增加属性或方法,都不可避免地要修改依赖此类库的代码。这显然导致软件很难维护,因此他强调的是要允许通过继承来扩展类。随着技术发展,我们有了更多的方法来实现开闭原则,包括接口、抽象类、策略模式等。

上一页
下一页