开放-封闭原则是指,软件实体(类、模块、函数等)应该可以扩展,但是不可修改。也就是,对于扩展是开放的,对于修改是封闭的。
我们要明确一点,**需求是一定会变化的。**而我们在设计的时候,也不可能考虑的面面俱到,将所有需求可能的变化都考虑到。那么我们就需要一种设计,面对需求的变化可以保持相对稳定,从而使系统在第一个版本以后,不断推出新的版本。
我们在设计的时候,要时刻考虑,尽量让这个类足够好,写好了就不需要修改了。如果新的需求过来,我们增加一些类就可以,原来的代码尽量不要发生改变。
但事实情况是,无论一个模块是多么的封闭,总会出现一些无法封闭的变化,也就是说,实现完全封闭是不可能的。那么设计者就必须对他设计的模块应该对哪种变化封闭做出选择,必须先猜测出最有可能发生变化的种类,然后构造抽象来隔离变化。
这种猜测是不容易的,但我们可以在发生小变化时,就及早想办法应对发生更大变化的可能。也就是说,等到变化发生时,立刻采取行动。在发生变化时,就要思考,这个变化后面会不会再出现很多类似的变化,然后及早对变化进行抽取,抽象。在最初写代码时,假设变化不会发生。当变化发生时,我们就创建抽象来隔离以后发生的同类变化。举一个简单的例子,要写一个两个数相加的程序。突然有一天来了一个需求,要将这两个数相减。我们就要考虑它们会不会有乘除运算或其他各种运算的可能,考虑抽象出一个运算类。当以后再增加新的运算时,我们就不需要去修改加减法这两个类了,而是增加新的运算子类。即面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。
发现这种变化,并对其抽象,并不是什么时候都容易的。这种抽象进行的越早越好。时间越长,系统开发完成的内容越多,要创建正确的抽象就越困难。
但是,系统中的抽象也不是越多越好。应该仅仅对系统中频繁出现变化的部分进行抽象,拒绝不成熟的抽象,和抽象本身一样重要。