前言
OOP 取得了巨大的成功。但成功只是巧合吗?它还能在今年提供其他编程范式无法提供的独特功能吗?
在 1981 年 Byte 杂志的 8 月版中,David Robson 开始了他的文章,该文章成为对许多人的面向对象软件系统的介绍,他预先承认这与许多熟悉的命令式、自上而下编程不同。习惯了。
“许多不知道计算机如何工作的人发现面向对象编程的想法很自然。相比之下,许多有计算机经验的人最初认为面向对象系统有些奇怪。”
公平地说,几代人之后,将代码组织成更大的有意义的对象来模拟问题的各个部分的想法仍然困扰着程序员。如果他们习惯于自顶向下编程或函数式编程,将代码元素视为精确的数学函数,则需要一些时间来适应。在最初的炒作期承诺改进模块化和组织大型代码库之后,这个想法被过度应用了。随着 OOP 紧随其后的是 OOA(面向对象分析)和 OOD(面向对象设计),您很快就会觉得您在软件中所做的一切都必须分解为对象及其相互之间的关系。然后评论家赶到现场,其中一些人非常失望。
一些人声称在 OOP 下编写测试更难,重构需要格外小心。重用代码时会产生开销,Erlang 的创建者曾将其描述为一个案例,即你想要一根香蕉,但一只大猩猩拿着香蕉。一切都带有隐含的、不可避免的环境。
描述这种解决问题的新方法的其他方式包括将命令式程序员类比为“厨师或化学家,遵循食谱和公式以达到预期的结果”,而面向对象的程序员则类比为“希腊哲学家或 19 世纪的博物学家。对编程世界的生物和地点进行适当的分类和描述。”
成功只是巧合吗?
OOP 仍然是目前占主导地位的范式之一。但这可能是由于恰好是 OOP 的语言的成功。Java、C++ 和 Kotlin 统治着 Android 和 Swift 的移动设备,以及 iOS 的 Objective-C,因此除非您了解面向对象的方法,否则您无法开发移动软件。对于网络,它是 JavaScript、Python、PHP 和 Ruby。
问为什么这么多广泛使用的语言是 OOP 可能会混淆因果关系。理查德费尔德曼在他的演讲中辩称,这可能只是巧合。C++ 由Bjarne Stroustrup在 1980 年代初期开发,最初是作为 C 编程语言的一组扩展。在 C 的基础上,C++ 添加了面向对象,但 Feldman 认为它在从 C 的整体升级中变得流行,包括类型安全,并增加了对自动资源管理、通用编程和异常处理等特性的支持。
然后 Java 想吸引 C++ 程序员,并在 OOP 部分加倍努力。最终,Sun Microsystems 想要重复 C++ 的把戏,旨在让采用 Java 的开发人员最熟悉。
由于当时在 Web 浏览器中的独家集成,数百万开发人员迅速转向 Java。这样看来,OOP 似乎只是搭便车,而不是推动成功。
OOP 能做什么,这是它独有的吗?
OOP 有一些有价值的方面,其中一些方面使它无所不在,即使它有其缺点。让我们看看 OOP 的基石。
封装。这意味着数据通常对语言的其他部分是隐藏的——如果你愿意的话,可以放在一个胶囊中。OOP默认封装数据;对象包含数据和影响该数据的方法,良好的 OOP 实践意味着您提供 getter 和 setter 方法来控制对该数据的访问。这可以保护可变数据不被随意更改,并使应用程序数据更安全。
据说,这是 OOP 的最大好处之一。尽管它最常与面向对象编程相关联,但概念本身实际上与它是分开的,并且可以在不使用对象的情况下实现。抽象是这里封装的补充概念;在封装隐藏内部信息的地方,抽象为数据提供了一个更易于使用的公共接口。在任何情况下,它都不是唯一的 OOP 功能,并且可以通过隔离系统功能或一组数据的模块以及模块内对这些数据的操作来完成。
继承。因为可以将对象创建为其他对象的子类型,所以它们可以从这些对象继承变量和方法。这允许对象支持由前类型定义的操作,而无需提供它们自己的定义。目标是不要重复自己——同一代码的多次使用很难维护。但是函数式编程也可以通过可复用的函数来实现 DRY。内存效率也是如此。尽管继承确实有助于实现这一点,但FP 中的闭包概念也是如此。
虽然继承是一种面向对象编程的特定想法,但有些人认为它的好处可以通过组合更好地实现。如果你失去了继承,对象和方法很快就会作为结构和过程的语法糖而消失。请注意:继承也是允许多态性所必需的,我们将在下面讨论。
多态性。从字面上看,形状变化,这个概念允许一个对象或方法,无论是泛型、接口还是常规对象,都可以作为其他对象和方法的模板。多态性有多种形式。单个函数可以被重载、变形并适应它所在的任何类。面向对象编程倾向于使用大量子类型多态性和临时多态性,但同样,这不是一个仅限于 OOP 的概念。
似乎在 2020 年,OOP 能做的事情并没有其他编程范式做不到的,一个优秀的程序员会在对抗复杂性的过程中同时使用多个范式的策略。例如,如果您查看与在OOP与函数式编程下标记的问题相关的最常出现的标签,JavaScript 会在两者中弹出。
接下来会发生什么?
然而,OOP 取得了巨大的成功。这种成功可能是支持 OOP 并得到 OOP 支持的庞大行业的结果。
那么开发商自己呢?我们今年的开发者调查显示,他们正在获得越来越多的购买影响力。好吧,如果我们也看看开发人员更喜欢使用什么,Haskell 和 Scala 是最受欢迎的编程语言之一。Scala 给你第二高的薪水。因此,也许通过更多的 FP 传播,他们也会爬上最受欢迎的语言列表。
不过有一些动静,像 Twitter 这样的大公司几乎完全在 Scala 代码上运行他们的后端。最近一直在应用 Haskell 和许多主要 OOP 语言的 Facebook 也在采用函数式特性。.NET 引入了 LINQ 和 Java 8 Lambda。尽管在 ES6 中引入了类,但 JavaScript 的功能越来越强大。Swift 可能是介于面向对象语言和函数式语言之间的最佳媒介。所以也许没有必要选择:你也可以拥有你的class Cake和EatCake()它。

本文探讨了面向对象编程(OOP)的成功是否仅仅是巧合,以及它是否仍然提供其他编程范式无法替代的独特功能。OOP的核心概念如封装、继承和多态性被提及,同时指出这些特性并非OOP独有。尽管OOP在移动开发和Web开发中占据主导地位,但现代编程趋势显示,函数式编程的影响力正在增长,一些开发者开始寻求结合多种编程范式的方法。未来,开发者可能会更多地采用混合范式,利用不同编程风格的优点来应对复杂的软件开发挑战。
1193

被折叠的 条评论
为什么被折叠?



