乔错了(2009)

2021-03-26 20:12:11

我只是读了Joe Armstrong的“为什么Oo Sucks”的文章,Joe Armstrong是Erlang的发明者。授予,这篇文章是从2000年来看我想,所以也许我应该削减他......不! :)

首先 - 否,我没有在erlang(尚未)中编程,但相当多的其他编程语言。我最喜欢的语言是宏伟的OO语言 - Smalltalk。所以肯定,我偏见了OO。

我读过对OO的其他批评,以及各种讨论OO的良好或糟糕特征,以及特定的OO语言......对不起,这篇文章是恕我直言不讳,我的感觉是乔写得很快就会写它在OO中没有真正的经验。

但我不打算说他的文章“很糟糕”而没有争论为什么我觉得它很糟糕:)。而且,我非常敬畏埃尔朗的东西,所以我对乔有很大的尊重 - 但这并不意味着他不能错了。

“由于函数和数据结构是完全不同类型的动物,因此在同一笼子里锁定它们是根本的不正确。”

重新判断第一次异议,我只看到了良好的函数和数据的说明。我没有看到任何真正的严肃解释,为什么他们不能合并成“因为它们不同”。这不是一个论点。

事实上,基于它们的交互模式,将组函数和数据一起将组函数和数据相当合乎逻辑。

假设我们有数据结构A,B,C和D.并且我们具有函数q,x,y,z。如果您开始查看这些功能读取和写入的数据,您可能会发现Q和x仅在A和B上运行,读取一个并写入另一个等,因此函数和数据结构形成“自然集群”,通常是“自然集群”。这些集群非常直观地建模为物体。

将它们放在一起创建围绕这组数据和函数的边界 - 封装。当然,你可以称之为“模块”,但是一个对象是毫无疑问,因为对象具有身份,生命周期,我们可以抓住它们,发送它们等等。

所以在某些感觉中,对象可能会被视为模块,但通常更细腻。我们可以将这种“模块”组合到更大的模块中(因为对象具有标识并且可以引用等),并且我们可以动态创建和杀死它们(生命周期)。

如果我来自一个带有良好发达的“模块”概念的语言,我肯定会看到这一点只是“另一个步骤”向前看。

具有生命周期的对象的另一个有趣事实是,由于对象包含数据A,B,C和D,我们现在可以轻松地实例化该对象来创建一个整个这样的数据“组”。我们也可以单独地或自动将它们作为单个实体放在一起。再次,非常自然。

所以好的,我可以继续这个,但是因为乔并没有真正给出任何争论,我将停止那里。

现在,作为一个小小的人员,我不会使用这句话必须是,但我可以清楚地看到范例,以纯粹的方式真正接着。

好的,但让我们看看Joe说的话。他指向一个示例 - 用于描述时间量或井不是“金额”的不同数据类型,但实际上存在部分点。每小时(一天),分钟(小时),年份等。不知道Erlang这些数据类型定义通常定义对这些类型有效的整数值范围。无论如何,他的要点是:

第一个参数是奇怪的。让我们来看看SmallTalk(或任何OO语言),假设我们有一个名为Timestamp的类。或日期。我们可以从系统中的任何位置实例化这些类,没有原因对于比数据类型更少(或更多)的类。所以类的对象也可以使用“无处不在”。

第二个论点是傻瓜(对不起)。没有相关方法?有很多有趣的行为,你可以附上这些物体!对于真正的旅游力,只需查看Chronos。乔可以使这种声称的事实是恕我直言清楚地表明他真的没有看到一个好的OO图书馆如何工作。或者我认为实际上以OO语言编程。

但如果我们忽略这个糟糕的例子,我同意 - 我同意 - 一切都不是一个对象。但是许多语言中的许多问题都可以追溯到它们仍然保留了不是对象的“基本数据类型”的事实。大多数现代OO语言都越来越靠近SmallTalk,几乎所有东西都是一个物体,只需看看Python,Ruby,Scala等。

对象概念非常强大,并且在慷慨地应用时,其电源甚至更大。 :)

“反对3 - 在OOPL数据类型定义中遍布整个地方。”

EHM,对不起Joe,但这个真的表现出对OO语言的理解差。首先,我认为你的意思是“数据类型定义”作为枚举或类似。或类定义。好的,然后你似乎说这是一种遗憾的是你不能把它们放在一个地方 - EHRM,但你可以......但它会是相当恐怖的设计。

它是简单的正常模块化,您不希望在全局范围内定义的所有数据类型/类,右图?事实上,我将在确切的对面中争论 - 在OOPL数据类型定义是它们应该 - 接近使用地点。模块化方式。

无论如何,现在我们来到最后一段 - 它只是混淆了。让我引用:

“在一个OOPL中,我必须选择一些基础对象,其中我将定义无处不在的数据结构,所有想要使用此数据结构的对象必须继承此对象。假设现在我想创建一些“时间”对象,这属于哪些对象......“

不,不,没有 - 为什么所有其他对象都需要继承那个类?继承通常用于专业化,您完全缺少的机制是构成。如果我的帐户对象需要在它中有一个时间戳 - 那么我只是实例化了时间戳,让我的帐户在实例变量中保持它。这是基本的oo,第1章。

它还有助于提到的“无处不在数据类型”的示例是LinkedList,数组和哈希表。所有三个是标准集合类,几乎所有的oo语言都没有问题,对不起。请注意,Erlang于1990年左右创建。在1967年的七十年代末和Simula创建了Smalltalk。Smalltalk与“所有对象”的方法成功地工作过,并具有非常丰富和欣赏的集合类 - 包括链接列表,阵列和字典(Hashtable) 。感觉像Joe认为OO在1996年来到Java - Nope,它实际上比Erlang更早。

关于C / Pascal的论点使用范围规则 - EHM,嗯,OOLTS也是如此,很难看到那里的区别。 joe呼叫的OO封装的想法是“最糟糕的选择”。但是,为什么封装为什么没有真正的争论是一件坏事。事实上,它是OO最重要的方面之一 - 公开概念的能力 - 一个对象 - 以全面的高级方式,具有精美的API,无需强制用户查看内部的所有细节。古典黑匣子组成,一个比......老的想法:)

不,黑暗不必严格 - 如果程序员想要看起来我说,我就会前进。我绝对没有捍卫自命不凡的防护思想,如java,c ++和c#的语言中的语言。这样的关键字,如“最终”,“密封”,“私人”,“受保护的”等倾向于让实际认识的程序员悲惨正是他或她在做什么。但足够的那么少,声称封装是一件坏事......只是愚蠢。

关于为什么Oo受欢迎的最终结论也没有持有任何物质 - 我甚至都没有进入它。 所以我认为乔完全在这篇文章中。 :)说我仍然期待学习erlang,既然我与Couchdb一起涉及我可能会很快弄湿我的脚。 2011年说明:现在我终于遇到了Joe,几乎感到尴尬地对上面的“抨击”。 但只有几乎:)