Alan Kay Was Wrong About Him Being Wrong

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

有时候有人问我对于面向对象编程(OOP)之父、Smalltalk设计者Alan Kay在1998年关于OOP的观点有何看法。他当时实际上说了“对象”这个术语是具有误导性的,更合适的术语应该是“消息传递”。以下是我的观点。

我认为对象之间存在两种正交的交互方式:消息传递和组合。举个例子,我们有一个点和一个画布:

这是消息的样子:

消息传递的问题在于它保持了对象在相同抽象级别上的状态。它们作为相等和独立的”模块”进行通信,彼此发送数据消息。尽管它们看起来是面向对象的,但整个通信模式实际上是非常过程化的。我们尽量将尽可能多的东西封装在一个对象内部,但不可避免地仍然需要暴露很多数据以便能够与其他对象”连接”。

我们将对象转化为”小型计算机”,正如某些书籍所称。它们期望数据进入,然后处理数据,并返回一些新的数据。然而,这种方法并没有真正解决可维护性的问题——我们仍然必须处理大量数据,并记住对象之外的语义。换句话说,没有真正的封装。

另一方面,这就是组合的方式会看起来如何:

每次我们需要对象进行通信时,我们会创建一个更大的对象,将更原始的对象封装在其中,让它们在内部进行交互。当然,数据也会从一个对象传递到另一个对象,但这将发生在一个更大的对象内部。我们甚至可以让封装对象和被封装对象成为“朋友”,正如我之前建议的那样,以使这种交互更加透明,并避免通过getter或者甚至是printer暴露数据。

再次引用Alan Kay的话:

我认为他指的是模块,而不是对象。这些是不同的东西。模块是架构的要素,而对象是设计的要素。这是两个不同的层次。在架构层面,我们显然需要消息,凯伊的说法是完全正确的。然而,在设计层面,我们需要可组合的结构,以增加可维护性,而消息并不能帮助我们实现这个目标。

因此,我相信艾伦·凯在发明对象并称之为对象,并给他们的编程风格冠以“面向对象”的名称时是正确的。

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-27 at 10:48

sixnines availability badge   GitHub stars