热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

“面向对象太烂了”

整理|伍杏玲

“面向对象太烂了”

“面向对象太烂了”

整理 | 伍杏玲

出品 | CSDN(ID:CSDNnews)

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

可有一种编程语言很特殊,是面向并发编程的,它便是Erlang。

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

但你不知道的是,在编程语言界里Erlang是骨灰级“元老”了。

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

惋惜的是,Joe Armstrong于上周去世。

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

为何当初他会这么说呢?

“面向对象太烂了”

Armstrong :面向对象有四宗“罪”

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

他还说:

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

接着他列举了面向对象的四宗“罪”:

  1. 数据结构和函数不应该被绑在一起;

  2. 一切事物不得不是对象;

  3. 在面向对象程序设计语言中,数据类型定义遍布在程序各处;

  4. 对象有私有状态。

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

不,他是知道的。

老爷子继续火力满满地炮轰道为什么会有这么多人用它:

  • 原因1:它被认为很容易上手学习的。

  • 原因2 :有人认为面向对象能使代码更容易被复用。

  • 原因3:它被炒作了。

  • 原因4:它创造了一个新的软件产业。

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

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

继而他的态度来了180°大转变,说道:

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

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

“面向对象太烂了”

开发者:两个角度解读“面向对象”

有人批评老爷子过激的言论:

@lame88:

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

还有人也认为面向对象唯一的优点是很容易上手:

@LifeLiverTransp:

作为一种架构,面向对象唯一的好处是,初学者很容易上手。

有人详细对比几种语言处理消息传递:

@revvx:

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

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

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

例如,在C++中,唯一的延迟绑定是抽象类和虚表。

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

众说纷纭,这位@bunderbunder开发者说得较中肯:

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

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

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

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

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

资料:

https://news.ycombinator.com/item?id=19715191

“面向对象太烂了”

作为码一代,想教码二代却无从下手:

听说少儿编程很火,可它有哪些好处呢?

孩子多大开始学习比较好呢?又该如何学习呢?

最新的编程教育政策又有哪些呢?

下面给大家介绍CSDN新成员: 极客宝宝(ID: geek_baby)

戳他了解更多↓↓↓

“面向对象太烂了”

 热 文推 荐 

  百度浏览器谢幕!

  不懂嵌入式,何谈物联网?

  Java 在「权力的游戏」里,能活到第几集?

☞ 19 岁当老板,20 岁 ICO 失败,编程少年的创业辛酸史

☞ 养生 996 的崛起:马云竟给他最痛恨的「兔子」站台?

☞ 打开阿兹海默之门:华裔张复伦利用RNN成功解码脑电波,合成语音 | Nature

☞ 澳洲生活7年, 前阿里程序员谈我们的区块链差距究竟在哪?

☞ 关于谷歌云,你应该知道的一切!| 技术头条

☞ 她说:为啥程序员都特想要机械键盘?这答案我服!

System.out.println("点个在看吧!");
console.log("点个在看吧!");
print("点个在看吧!");
printf("点个在看吧!\n");
cout << "点个在看吧!" << endl;
Console.WriteLine("点个在看吧!");
Response.Write("点个在看吧!");
alert("点个在看吧!")
echo "点个在看吧!

点击阅读原文,输入关键词,即可搜索您想要的 CSDN 文章。

你点的每个“在看”,我都认真当成了喜欢


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 我们


推荐阅读
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 众筹商城与传统商城的区别及php众筹网站的程序源码
    本文介绍了众筹商城与传统商城的区别,包括所售产品和玩法不同以及运营方式不同。同时还提到了php众筹网站的程序源码和方维众筹的安装和环境问题。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了win7系统休眠功能无法启动和关闭的解决方法,包括在控制面板中启用休眠功能、设置系统休眠的时间、通过命令行定时休眠、手动进入休眠状态等方法。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
author-avatar
人生-顺势而为
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有