面向对象编程的灾难:是时候考虑更新换代了!

全文共13316字,预计学习时长26分钟

图片来源:Unsplash/Jungwoo Hong

许多人认为面向对象编程是计算机科学的珍宝,代码组织的最终解决方案,所有问题的终极回答,编写程序的唯一真正方法,编程之神赐予我们的财富……

但事实证明并非如此,人们常常屈服于抽象和混杂共享可变对象的复杂图形的重压。耗费宝贵的时间和脑力来思考“抽象”和“设计模式”,而不关注解决现实问题。

许多人批评面向对象编程,其中包括非常杰出的软件工程师。有意思的是,就连面向对象变成的发明者自己也是现代面向对象编程的著名批评者!

每个软件开发人员都应该以编写可靠的代码为终极目标。如果代码有问题且不可靠,那其他方面的优点都不足为提。编写可靠代码的最佳方式是什么?简洁。简洁与复杂相反。因此,作为软件开发人员,我们首要的责任应该是降低代码复杂性。

包络高级技术人员在内的很多人认为面向对象编程是代码组织的标准,这是不正确的。同样不可接受的是,除面对对象编程之外,许多主流语言都没有提供任何代码组织的替代方案。

面向对象编程可以作为正确程序的替代品。

Edsger W. Dijkstra,计算机科学的先驱

图片来源:Unsplash/Sebastian Herrmann

面向对象编程的目的只有一个——管理过程代码库的复杂性。换句话说,它应该改进代码组织。没有客观和公开的证据表明面向对象编程优于普通的过程性编程。

残酷的事实是,面向对象编程在它唯一能处理的任务上失败了。它在纸上看起来很好——有清晰的动物、狗、人类等层级。然而,一旦应用程序的复杂性开始增加,它就会停滞不前。不但没有降低复杂性,反而鼓励混杂地共享可变状态,并通过其众多的设计模式引入了额外的复杂性。面向对象程序增加了常见的开发实践(如重构和测试)的难度。

有些人可能不同意这一观点,但事实是现代Java/ c# OOP从来没有正确地设计过,从未出自一个合适的研究机构(与Haskell/FP不同)。λ微积分为函数式编程提供了完整的理论基础,而面向对象编程做则没有与之匹配的理论。

短期来看使用面向对象编程似乎是无害的,尤其是在绿地投资上。但是长期使用面向对象编程又会导致哪些后果呢?面向对象编程是一个定时炸弹,当代码基足够大时,将在将来某个时候爆炸。

项目被推迟、错过最后期限、开发人员精力被耗尽,添加新功能几乎是不可能的。组织将代码库标记为“遗留代码库”,开发团队计划重写代码库。

面向对象编程与人脑思维相悖,人类的思维过程集中在“做”事情上——散步,和朋友聊天,吃比萨饼。我们的大脑进化成了做事的方式,而不是把世界组织成抽象对象的复杂层次。

面向对象编程代码充满了不确定性——与函数式编程不同,我们不能保证在给定相同输入的情况下得到相同的输出。这使得编程推理非常困难。举一个极其简单的例子——输出2+2或执行calculator.Add(2, 2) 的结果大部分等于4,但有时可能也等于3 、5,甚至是1004。Calculator对象的依赖关系可能以微妙但显著的方式改变计算结果。

对弹性框架的需求

不管编程范式是怎么样的,优秀的程序员会写出好的代码,糟糕的程序员会写出坏的代码,然而,编程范式应该限制糟糕的程序员造成太大的破坏。糟糕的程序员从来没有时间学习,他们只是疯狂地在键盘上乱按。不管是否愿意,你都会遇到糟糕的程序员,他们中的一些人会非常非常糟糕。不幸的是,面对对象编程没有足够的约束力来防止糟糕的程序员造成太多的破坏。

如果没有一个强有力的框架来支撑工作的话,程序员很难写出好的代码。有些框架关注一些非常特殊的问题(例如Angular或ASP.Net)。

框架的抽象定义是:“一个基本的支持结构”——框架关注更抽象的东西,比如代码组织和处理代码复杂性。尽管面向对象编程和函数编程都是编程范例,但它们也是高级框架。

限制我们的选择

c++是一种可怕的[面向对象]语言……将你的项目限制为C意味着人们不会用任何愚蠢的“对象模型”来把事情搞砸。

Linus Torvalds, Linux创始人

Linus Torvalds以他对c++和面向对象编程的公开批评而闻名。有一件事他是百分之百正确的,那就是限制程序员的选择。事实上,程序员的选择越少,他们的代码就越有弹性。如上面引用的句子所说,Linus Torvalds强烈建议使用一个好的框架来构建代码。

图片来源:Unsplash/specphotops

许多人不喜欢道路限速,但限速对于防止车祸致死是必不可少的。同样地,好的编程框架应该提供防止人们做傻事的机制。

好的编程框架可以帮助人们编写可靠的代码。首先,它应该通过提供以下内容来帮助降低复杂性:

1. 模块化和可重用性

2. 适当的隔离状态

3. 高信噪比

不幸的是,面向对象编程给开发人员提供了太多的工具和选择,却没有施加合适的限制。尽管面向对象编程承诺会解决模块化和提高可重用性,但却未能兑现其承诺(稍后将对此进行更多阐述)。面向对象编程代码鼓励使用共享的可变状态,这一点多次证明是不安全的。面向对象编程通常需要大量样板代码(低信噪比)。

函数编程

什么是函数编程?有些人认为它是一个高度复杂的编程范式,只适用于学术界,不适用于“现实世界”。这与事实相去甚远!

函数式编程有很强的数学基础,并且植根于λ微积分。然而,它的大部分想法都是针对主流编程语言的弱点而提出的。函数是函数编程的核心抽象。如果使用得当,函数提供了在面向对象程序设计中前所未有的代码模块化和可以重复使用性。它甚至以解决可空性问题的设计模式为特色,并提供了一种出色的错误处理方式。

函数式编程做得很好的一点是帮助我们编写可靠的软件。对调试器的需求几乎完全消失了——是的,不需要遍历代码并查看变量。

我们所做的面对对象编程都错了

 

我对之前为这个主题创造了“对象”这个术语感到抱歉,因为它使许多人把注意力集中在较次要的概念上。事实上,最重要的是传递信息。

Alan Kay, 面向对象编程发明者

 

通常,人们认为Erlang不是一种面向对象的语言。但是Erlang可能是唯一主流的面向对象语言。是的, Smalltalk当然是合适的面向对象语言——但是,并没有得到广泛的应用。Smalltalk和Erlang都按照面向对象编程的发明者Alan Kay最初设计的方式使用面向对象编程。

信息

AlanKay在20世纪60年代创造了“面向对象编程”这个词,他有生物学背景,并试图使计算机程序像活细胞一样进行通信。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值