为什么OOP仍然如此广泛地传播?

2020-09-03 14:04:03

在1981年8月版的Byte杂志上,David Robson在他的文章开头承认,它与许多熟悉命令式、自上而下的编程习惯不同,这篇文章后来成为许多人对“面向对象的软件系统”的介绍。

“许多不知道计算机如何工作的人觉得面向对象编程的想法是很自然的。相比之下,许多有计算机经验的人最初认为面向对象系统有些奇怪。

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

一些人声称,在OOP下,编写测试更加困难,重构需要格外小心。在重用代码时会产生开销,Erlang的创建者曾将此著名地描述为您想要一根香蕉,但却得到了一只大猩猩拿着香蕉的情况。每件事都伴随着一个隐含的、不可避免的环境。

描述这种解决问题的新方法的其他方式包括将命令式程序员比作“厨师或化学家,遵循食谱和公式以达到期望的结果”,而将面向对象的程序员比喻为“希腊哲学家或19世纪的自然学家,致力于对编程世界的生物和场所进行适当的分类和描述”。

OOP仍然是目前占主导地位的范例之一。但这可能要归功于碰巧是面向对象的语言的成功。Java、C++和Kotlin统治Android和Swift的移动端,Objective-C统治iOS的移动端,所以除非你理解面向对象的方法,否则你不能为移动端开发软件。对于Web来说,它是JavaScript、Python、PHP和Ruby。

问为什么这么多广泛使用的语言都是面向对象的,可能是混淆了因果关系。理查德·费尔德曼(Richard Feldman)在他的演讲中辩称,这可能只是巧合。C++是由Bjarne Stroustrup在20世纪80年代初开发的,最初是作为C编程语言的一组扩展。在C的基础上,C++增加了面向对象的功能,但Feldman认为,它在从C语言的整体升级中变得流行起来,包括类型安全,并增加了对自动资源管理、泛型编程和异常处理等功能的支持。

然后,Java想要吸引C++程序员,并在面向对象部分加倍努力。最终,Sun Microsystems想要重复C++技巧,目标是让采用Java的开发人员最熟悉。

由于Java独家集成在当时的Web浏览器中,数以百万计的开发人员很快就转向了Java。这样看来,OOP似乎只是搭便车,而不是推动成功。

OOP有一些有价值的方面,其中一些方面使其无所不在,即使它有缺点。让我们来看看OOP的基石。

封装。这意味着数据通常对语言的其他部分是隐藏的-如果你愿意的话,放在一个胶囊里。OOP默认情况下封装数据;对象同时包含数据和影响该数据的方法,良好的OOP实践意味着您可以提供getter和setter方法来控制对该数据的访问。这可以保护可变数据不会被随意更改,并使应用程序数据更安全。

据推测,这是OOP最大的好处之一。尽管它最常与面向对象编程联系在一起,但该概念本身实际上是独立于它的,并且可以在不使用对象的情况下实现。在这里,抽象是封装的补充概念;在封装隐藏内部信息的情况下,抽象为数据提供了一个更易于使用的公共接口。在任何情况下,它都不是唯一的OOP特性,可以通过模块隔离系统函数或一组数据以及模块中对这些数据的操作来完成。

继承。由于对象可以创建为其他对象的子类型,因此它们可以从这些对象继承变量和方法。这允许对象支持由前置类型定义的操作,而不必提供它们自己的定义。这样做的目的是避免重复使用相同的代码,因为很难维护相同代码的多次使用。但是函数式编程也可以通过可重用的函数来实现DRY。内存效率也是如此。尽管继承确实有助于实现这一点,但是FP中的闭包概念也是如此。

虽然继承是OOP特有的思想,但有些人认为通过组合可以更好地实现继承的好处。如果失去继承,对象和方法很快就会消失,因为它们是结构和过程的语法糖。请注意:继承也是允许多态性所必需的,我们将在下面讨论这一点。

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

似乎在2020年,OOP并没有那么多其他编程范型做不到的事情,一个好的程序员会在与复杂性的战斗中一起使用来自多个范型的策略。例如,如果您查看与在OOP和Functional Programming下标记的问题相关的最常出现的标记,JavaScript会同时在两者中弹出。

然而,OOP取得了巨大的成功。这一成功可能是支持和支持OOP的庞大行业的结果。

那么,开发人员本身又是怎么回事呢?我们今年的开发商调查显示,他们的购买影响力越来越大。如果我们看看开发人员更喜欢使用什么,Haskell和Scala是最受欢迎的编程语言之一。Scala给你的薪水是第二高的。因此,也许有了更多的FP福音,他们也会攀升到最受欢迎的语言的榜单上。

不过也有一些动向,像Twitter这样的大公司几乎完全在Scala代码上运行他们的后端。最近一直在应用Haskell和许多主要面向对象语言的Facebook也在采用功能特性。.NET有LINQ和Java8引入的lambdas。随着ES6中类的引入,JavaScript的功能越来越强大。SWIFT可能是面向对象语言和函数式语言之间的折衷方案。所以也许不需要选择:您也可以使用您的类Cake和EatCake()。

标签:函数式编程、面向对象编程、面向对象编程