如果每个人都讨厌OOP,为什么它仍然如此广泛传播? - StackOverflow


OOP取得了巨大的成功。但是成功仅仅是偶然吗?并且它还能在2020年提供其他编程范例无法提供的独特功能吗?
在1981年8月的Byte杂志中,David Robson公开了他的文章,该文章成为许多人进入“ 面向对象的软件系统 ” 的敲门砖,他承认这与许多熟悉命令式、自上而下的编程习惯是背道而驰的。 
“许多不知道计算机如何工作的人都觉得面向对象编程的想法很自然。相反,许多有计算机经验的人最初认为面向对象系统有些奇怪。”
可以说,几代人以后,将代码组织成更大的有意义的对象(对问题的各个部分建模)的想法继续困扰着程序员。如果将它们用于自上而下的编程或函数式编程(将代码元素视为精确的数学函数),则需要一些时间来习惯。
在OOP最初的大肆宣传期承诺对模块化和组织大型代码库进行改进之后,想法被过度应用。在OOP之后紧跟着OOA(面向对象分析)和OOD(面向对象设计)之后,感觉就像您在软件中所做的一切都必须分解为对象及其相互之间的关系一样。很多评论家发表了非常失望的看法。
一些人声称在OOP下编程会更加困难,并且需要格外小心地重构。重用代码时会产生额外的开销,Erlang的创建者曾把这种OOP代码比喻成:当您需要香蕉但却抱着吃香蕉的大猩猩。一切都带有隐性、不可避免的上下文环境。(banq注:老子在道德经中说:大道就像深渊中的鱼,当你把鱼打捞上来时以为得到大道,其实失去了大道)
命令式和面向对象的类比:命令式是厨师或化学家,遵循食谱和公式以达到所需的结果;而面向对象是有关的希腊哲学家或19世纪自然主义者用适当的分类法对编程世界实现描述。  
 
成功只是巧合吗? 
目前,OOP仍然是主要的范例之一。但这可能是由于碰巧是OOP的语言的成功所致。Java,C ++和Kotlin统治了Android的移动领域,而Swift和iOS的Objective-C统治了移动领域,因此除非您了解面向对象的方法,否则您将无法开发移动软件。对于网络,它是JavaScript,Python,PHP和Ruby。
为什么OOP有这么多被广泛使用的语言?理查德·费尔德曼(Richard Feldman)在讲话中指出,这可能只是巧合。C ++是由Bjarne Stroustrup在1980年代初期开发的,最初是对C编程语言的扩展。C ++以C为基础,增加了面向对象的功能,但Feldman认为它在从C进行整体升级方面变得很流行,包括类型安全性,并增加了对自动资源管理,通用编程和异常处理等的支持。
然后Java希望吸引C ++程序员,并在OOP方面加倍投入。最终,Sun Microsystems希望通过使采用Java的开发人员最熟悉的方式来重复C ++技巧。 
由于当时Java与Web浏览器的独家集成,数百万开发人员迅速转向Java。这样看来,OOP似乎只是在兜圈,而不是推动成功。
 
OOP可以做什么呢?
OOP有一些有价值的方面,即使它有缺点,也有一些方面使其无处不在。让我们看一下OOP的基石。

  • 封装

这意味着,如果可能的话,通常会将数据从语言的其他部分隐藏起来(放在胶囊中)。OOP默认封装数据;对象包含数据和影响该数据的方法,良好的OOP实践意味着您提供了getter和setter方法来控制对数据的访问。这样可以防止可变数据被随意更改,并使应用程序数据更安全。 
据说,这是OOP的最大好处之一。尽管它最常与面向对象的编程相关联,但概念本身实际上与它是分开的,可以在不使用对象的情况下实现。抽象是此处封装的补充概念。在封装隐藏内部信息的地方,抽象提供了易于使用的公共数据接口。在任何情况下,它都不是唯一的OOP功能,并且可以通过隔离系统功能或模块数据以及模块中对这些数据的操作的模块来完成。
  • 继承

因为可以将对象创建为其他对象的子类型,所以它们可以从那些对象继承变量和方法。这允许对象支持由先前类型定义的操作,而不必提供自己的定义。目的是不要重复自己—难以维护同一代码的多次使用。但是函数式编程也可以通过可重用的函数来实现DRY。内存效率也是如此。即使继承确实对此有所贡献,FP中的闭包概念也是如此
虽然继承是面向对象的特定概念,但有人认为相比继承可以通过组合更好地替代实现。在继承中对象和方法会变异为结构和过程的语法糖。注意:继承对于允许多态性也是必要的,我们将在下面讨论。
  • 多态性

从字面上讲,这种改变形态的概念是允许一个对象或方法(无论是通用对象,接口还是常规对象)充当其他对象和方法的模板。有多种形态的多态性。单个函数可以重载,变形并适应其所在的任何类。面向对象的编程倾向于使用许多子类型多态性和ad-hoc多态性,但是同样,这不限于OOP。 
好像在2020年一样,OOP并没有其他编程范例可以做的那么多,而优秀的程序员将在克服复杂性的斗争中一起使用多种范例中的策略。例如,如果您同时查询与OOP与函数式编程中相关的最频繁出现的关键词问题时,则JavaScript会同时出现。 
 
会发生什么?
但是,OOP取得了巨大的成功。这种成功可能是由OOP支持并受其支持的庞大行业发展的结果。
那么开发人员自己呢?我们今年的开发人员调查显示,他们获得了越来越多的购买影响力。好吧,如果我们也看看开发人员喜欢使用什么,Haskell和Scala就是最受欢迎的编程语言之一。Scala获得第二高的薪水。因此,随着FP函数式传道越多,他们会爬上名单最流行的语言了。
尽管有一些动静,但像Twitter这样的大公司几乎完全在Scala代码上运行其后端。最近一直使用Haskell和许多主要OOP语言的Facebook也采用了函数式功能。.NET具有LINQ和Java 8引入的Lambda。尽管在ES6中引入了类,但是JavaScript的函数越来越强大。Swift可能是介于面向对象和函数语言之间的快乐媒介。因此,也许没有必要选择:你可以同时有class Cake和eatCake()。