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

发布于:2020-12-24 16:14:12

0

90

0

oop 面向对象程序设计 函数式程序设计

在1981年8月的Byte杂志的Byte杂志中,David Robson公开承认自己与许多熟悉的命令式,自上而下的软件背道而驰,从而成为许多人对“面向对象的软件系统”的介绍,编程习惯。许多不知道计算机如何工作的人都觉得面向对象编程的想法很自然。相反,许多有计算机经验的人最初认为面向对象的系统有些奇怪。

可以说,几代人以后,将代码组织成更大的,有意义的对象以对问题的各个部分进行建模的想法一直困扰着程序员。如果将它们用于自上而下的编程或函数式编程(将代码元素视为精确的数学函数),则需要一些时间来习惯。在最初的大肆宣传承诺对模块化和组织大型代码库进行改进之后,该想法被过度应用。在OOP之后是OOA(面向对象的分析)和OOD(面向对象的设计)之后,很快感觉到,您在软件中所做的一切都必须分解为对象及其相互之间的关系。然后评论家赶到了现场,其中一些人非常失望。

一些人声称,在OOP下,编写测试会更加困难,并且需要格外小心地进行重构。重用代码时会产生额外的开销,Erlang的创建者将其描述为一个案例,当您想要一个香蕉,但是却得到了一只拿着香蕉的大猩猩。一切都带有隐性,不可避免的环境。

描述这种解决问题的新方法的其他方式包括命令式程序员之间的类比:“厨师或化学家,遵循食谱和公式以达到期望的结果”,而面向对象的程序员之间的类比为“相关的希腊哲学家或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中的闭包概念也是如此。

虽然继承是面向对象的特定概念,但有人认为继承可以通过组合更好地实现。如果失去继承,则对象和方法将迅速溶解为结构和过程的语法糖。注意:继承对于允许多态性也是必要的,我们将在下面讨论。

多态性。从字面上讲,此概念可以改变形状,它允许一个对象或方法(无论是通用对象,接口还是常规对象)充当其他对象和方法的模板。有多种形式的多态性。单个函数可以重载,变形并适应其所在的任何类。面向对象的编程倾向于使用许多子类型多态性和即席多态性,但是同样,这不限于OOP。

好像在2020年一样,OOP并没有其他编程范例可以做的那么多,而优秀的程序员将在克服复杂性的斗争中一起使用多种范例中的策略。例如,如果您查看与OOP与功能编程下的问题相关的最频繁出现的标签,则JavaScript会同时弹出。


会发生什么?

OOP取得了巨大的成功。这种成功可能是由OOP支持并受其支持的庞大行业的结果。

那么开发人员自己呢?我们今年的开发人员调查显示,他们获得了越来越多的购买影响力。好吧,如果我们也看看开发人员更喜欢使用哪种工具,Haskell和Scala就是最受欢迎的编程语言之一。 Scala让您获得第二高的薪水。因此,也许有了更多的FP福音,他们也会爬上最受欢迎的语言。

但是有一些动静,像Twitter这样的大公司几乎完全在Scala代码上运行其后端。最近一直使用Haskell和许多主要OOP语言的Facebook也采用了功能功能。 .NET具有LINQ和Java 8引入的Lambda。尽管在ES6中引入了类,但是JavaScript的功能越来越强大。 Swift可能是介于面向对象和功能语言之间的快乐媒介。因此,也许无需选择:您也可以使用Cake和EatCake()类。

特别感谢Ryan,他的出色见解和编辑对这篇文章有所帮助。