我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:六合图库 > 多态性 >

“面向对象太烂了”

归档日期:06-07       文本归类:多态性      文章编辑:爱尚语录

  很多程序员一开始接触编程时学的是C或者Java,这两种语言分别是面向过程和面向对象的,后续学习上手的语言也大多基于这两种思想。

  可能很多人没用过这小众的Erlang。根据TIOBE发布的最新语言排行榜,Erlang排名第47位,市场份额占有仅为0.177%。

  早在1987年,程序员Joe Armstrong在爱立信工作时,为了通信应用而设计出Erlang。所以Erlang从一开始就被设计用于自下而上地编写并发式、分布式、容错、可扩展和软实时系统的程序,并被应用在电信、银行、商业、即时通讯等场合。

  可没想到的是他曾经公开发文说的 “面向对象烂透了”言论重新引起程序员们新的讨论和思考。

  Armstrong在《Why OO Sucks》文章的开头说:“当我第一次接触到OOP(面向对象编程)时,我便持怀疑态度,不知道为什么,我总觉得它是错误的。当面向对象编程开始流行时,我就喜欢批评它。”

  我们经常被问到“Erlang是面向对象的吗?”——当然,我们真正的答案是“当然不是”。

  在老爷子眼里,面向对象像一个“劣迹斑斑”的孩子,那难道老爷子没看到这么多程序员用面向对象吗?

  不得不说,老爷子上述的观点有可取的地方,但也有主观臆断的部分。所以他后来在采访中自己打脸纠正了,他坦诚道当初diss面向对象的起因:

  我主要想用(文章)来激怒人们,我设法惹恼了很多人,他们对此的反应相当有趣。我开始怀疑什么是面向对象编程,我认为Erlang不是面向对象的,它是一种函数式编程语言。

  但我的论文导师说,“Erlang是非常面向对象”。他说面向对象的语言不是面向对象的。我可能认为,虽然我不太确定我是否相信这一点,但Erlang可能是唯一一种面向对象的语言,因为面向对象编程的3个原则是,它基于消息传递,对象之间是隔离的,并且具有多态性。

  为什么老爷子会对Erlang是否是面向对象编程语言,有前后截然不同的评论呢?对此,程序员是这样看的:

  “我主要想挑衅人......”我讨厌他这样说,这要么是一种借口以逃避去承认你说过的话,要么是恶意评论。特别是当说话的人带着权威性的语气去说的,使得人们接受他所说的。这样的言论本身是与批判性思维相对立的。

  在我看来,Alan Kay(面向对象之父)和Joe Armstrong试图解决的问题是,类似C++/Java/C#等语言具有非常有限的消息传递能力。

  Alan Kay使用的是“延迟绑定”。在Kay的观点中,“极端延迟绑定”是他认为这是在面向对象编程最重要方面之一,甚至比多态性更重要。极端的延迟绑定基本上意味着让对象决定如何处理消息。

  这就是像Objective-C和Ruby所实现的:在运行时才决定方法之后的操作。你可以发送一条不存在的消息,并得到类的响应(Ruby中缺少方法);你可以向一个无效的对象发送一条消息,它将以nil响应;可以将除某些消息以外的所有消息委托给第三个对象;甚至可以向在其他计算机中运行的类发送消息。

  对于“真正的面向对象”必须是异步的问题,我认为不必是异步的,但是Alan Kay认为,在消息传递的异步应该由“调度器”处理,而不是在发送者或接收者中添加额外的代码(来控制)。

  我觉得对于“对象”这次应该有两种不同的含义,但大多数面向对象的语言和实践都将这两者深深地融合在一起。

  第一个含义是,“对象”意味着数据结构和程序的统一。在这个观点中,理想的情况是所有的东西都是一个“对象”,所有的程序实际上都是某个类的方法。这是Java禁止不让直接使用不属于本类方法的动机,如果凭这样评定Java的话,它就不是真正的面向对象,因为并不是每个类型都是对象。在这个角度来看,Erlang也不是面向对象,因为它从根本上函数和数据类型是分开的。

  在另一个方面上看,“对象”可以说是某种模块化的方法,其中模块是相对独立的实体,它们的行为应该像黑匣子一样,只能通过来回传递消息进行通信。这就是Java使所有字段是私有,并且只通过方法调用它们的原因。如果从这个角度来说,Erlang是非常面向对象的。

  虽然我还没有做过详尽的分析,但我怀疑,很多人讨论面向对象时都存在一个问题:将这两个截然不同的观点混为一谈了。

  对此,你怎么看呢?你又是如何理解“面向对象”,如何理解Erlang的呢?欢迎来留言。

本文链接:http://lcvam.com/duotaixing/490.html