对象和迭代

2004年1月1日

从面向对象开发的最初开始,OO 设计就与迭代和增量开发联系在一起。但正如许多人指出的那样,两者之间没有内在联系。你可以在瀑布模型中进行 OO,也可以在没有对象的情况下进行 IID。那么为什么两者如此紧密地联系在一起呢?

我认为没有一个明确的原因,但有一些迹象。其中一个是技术方面。对象提供了非常细粒度的模块化,程序被划分为小的可替换模块,并分离了接口和实现。类提供了支持接口/实现划分和多态性的封装,多态性提供了一种简单的替换机制。

这种细粒度的模块化,如果做得好的话,可以让你更容易地对现有代码库进行更改。这对 IID 非常重要,因为 IID 的重点在于你一开始没有一个全面的设计,而是让设计和代码一起成长。良好的模块化对于这一点至关重要。(Unix 社区就是一个有趣的非 OO 例子,它强调模块化以实现演进,但并不热衷于 OO。)

OO 世界中很大一部分的动力来自 Smalltalk,尽管 Smalltalk 用户的数量(过去和现在)都很少,但他们的声音却不成比例地大。Smalltalk 是一个环境,它除了 OO 特性之外,还有许多支持 IID 的特性。立即编译并链接到正在运行的系统,一个好的 IDE 可以真正帮助你浏览源代码,强调图形用户界面(在它变得普遍之前),一个隐藏了许多底层问题(如内存管理)的环境,一个庞大的类库——所有这些都使迭代成为可能。(同样,Lisp 社区也拥有所有这些,并且也是强迭代的。)

所以,从技术上讲,对象鼓励 IID,但也有社会原因。OO 世界的领导者从一开始就推动 IID,因此敏捷运动的领导者几乎都是 OO 人员也就不足为奇了。当领导层如此热烈地拥抱这两个运动时,它会对整个社区产生影响。我肯定是在这个社区中长大的,对象和迭代都是理所当然的。

所有这些并不意味着对象和 IID 是相互必要的,但我认为它确实表明了为什么两者之间有如此强的亲和力。