14.11 渐增式开发
继承和组合的优点之一是它支持渐增式开发(incremental development),它允许在已存在的代码中引进新代码,而不会给原来的代码带来错误,即使产生了错误,这个错误也只与新代码有关。也就是说通过继承(或通过组合)已存在的功能类并在其基础上增加数据成员和成员函数(并重定义已存在的成员函数)时,已存在类的代码—可能某人仍在使用—并不会被改变,更不会产生错误。如果错误出现,我们就会知道它肯定是在新派生代码中。相对于修改已存在代码体的做法来说,这些新代码很短也很易读。
相当奇怪的是,这些类如何清楚地被隔离。为了重用这些代码,甚至不需要这些成员函数的源代码,只需要表示类的头文件和目标文件或带有已编译成员函数的库文件(对于继承和组合都是这样)。
认识到程序开发就像人的学习过程一样,是一个渐增过程,这是很重要的。我们能做尽可能多的分析,但当开始一个项目时,我们仍不可能知道所有的答案。如果开始把项目作为一个有机的、可进化的生物来“培养”,而不是完全一次性地构造它,像一个玻璃盒子式的摩天大楼,那么我们就会获得更大的成功和更直接的反馈[1]。
虽然继承对于实验是有用的技术,但在事情稳定之后,我们需要用新眼光重新审视一下我们的类层次,把它看成一个可感知的结构[2]。记住,继承首先是表示一种关系,即“新类属于老类的类型(a type of)”。我们的程序不应当关心怎样摆布位,而应当关心如何创建和处理各类型的对象,以便用问题空间的术语表示模型。
[1]为了学习这方面的更多思想,请参见Kent Beck所著的《Extreme Programming Explained》(Addison-Wesley 2000)。
[2]参见Martin Fowler所著的《Refactoring:Improving the Design of Existing Code》(Addison-Wesley,1999)。