开闭原则——对扩展开放,对变化关闭。在设计中应尽可能预想到所有可能会变化的类(需求变更),并运用面向对象的抽象思想将这些变化分离出来。比如当一个类提供运算功能,现在只有一个加法的需求,如果只是简单的实现加法算法的话,这是一个脆弱的设计,因为这个运算需求很可能会有变化:添加减法、乘法之类。所以在接到这样的需求的时候能够预想到需求的变更,将这个运算类利用面向对象中的继承将这个类抽象为一个运算类,添加子类继承该运算类,如果需求变更了,则只需要添加子类即可,不需要修改该运算类。
然而在实际开发过程中有些需求的变更是很难预料的,那么就需要在需求第一次变更的时候将这个算法类修改抽象化,那么在下次遇到同类需求变更时就可以避免同样的尴尬(相同的地方只能被绊倒一次)。在设计中这种需求的变更需要尽早被预知或提出,因为该运算类在其他地方被调用,需要更改的地方就会很多而且很难被发现,将它们一一找出来并修改花费的代价是很大的,而且时间越推迟,代价越大,所以在开发过程中需求的变更越早被提出或预知 越好。
遵循开闭原则能够实现面相对象优点:可维护、可扩展、可复用、灵活性好。然而在设计工作中应该仅对那些需求频繁变更的程序进行抽象分离,如果对程序的太多地方进行刻意的抽象分离就会导致程序复杂化,也不是我们所期望的。所以拒绝不成熟的抽象和必要的抽象一样重要。在不断的设计编程中积累这种决定是否抽象的经验,寻找一个折中的方案,使解决方案趋于完美。