【问题标题】:Alternatives to Object-Oriented Programming?面向对象编程的替代方案?
【发布时间】:2011-03-28 22:03:20
【问题描述】:

OOP 可能是当今软件设计中最常用的编程范式。我的问题是——还有哪些其他范式可以与之竞争并可以代替 OOP?为了澄清这个问题,我不是在问还有哪些其他范式。有很多,但我想知道是哪一个……

  • 已在实践中使用,而不仅仅是在理论上。
  • 可以与 OOP 竞争,因此它可以以最小的痛苦用于大型项目。
  • 可用于开发具有业务逻辑、数据库等的桌面应用程序。
  • 不与 OOP 一起使用,而是作为 OOP 的替代品。

如果有的话,它的优点/缺点是什么,为什么它比 OOP 更好/更差,什么语言最适合使用它,在流行语言中使用它怎么样,是否有任何设计模式,它可以完全取代 OOP 吗?

【问题讨论】:

  • @Justin Ardini:我知道有很多,但是哪一个可以与 oop 竞争? @Tobiasopdenbrouw & Macros:好的,改变了。
  • OOP 之所以流行是因为它很流行,如果你不接受 OOP koolaid,你将没有任何项目可做......
  • 面向数据的编程更容易,您关心对象集合及其关系,而不是“db object”方法提供封装的单个对象。 JSON 和 sexpressions 使 SQL、CSS、HTML、Excel、shell 脚本变得流行且有用,但“编程”意味着 OOP 或过程。尽管 OOP 占代码的 20%,但 OOP 因其 Python/JavaScript 程序的可维护性而受到感谢。闭包和 JSON 可以在 90% 的时间里用来代替对象,并且更简单易用。

标签: oop programming-languages paradigms


【解决方案1】:

Functional programming 是另一种流行的编程范式,主要在学术界。函数式编程语言的最佳示例是HaskellStandard ML

函数式编程和面向对象编程的根本区别在于,您是在数据流而不是控制流的意义上进行编程。请参阅 Simon Peyton-Jones 的演示文稿 Taming Effects with Functional Programming 以获得很好的介绍。

业界使用的函数式编程的一个很好的例子是Erlang。它主要用于电信、分布式和容错系统。请参阅 Joe Armstrong 的演示文稿 Erlang - Software for a concurrent World

还有一些更新的函数式编程语言将函数式编程与 OOP 相结合。两个很好的例子是 .NET 平台的 F# 和 Java 平台的 Scala;他们通常可以使用平台上以其他语言编写的现有库。

现在新的编程语言的趋势是Multi-paradigm,将面向对象编程和函数式编程等多种范式结合在同一种语言中。

【讨论】:

  • Scala 旨在整合面向对象和函数式语言的特性。
  • 很好的答案,但我认为函数式编程和面向对象的编程不是奖牌的两个方面,它们可以完美地共存(正如你所提到的)。更像是这样:过程 VS 面向对象,命令式 VS 函数式。 Lisp 是一种流行的过程函数式语言,Java 是一种面向对象的命令式语言。
  • @ventr1s:是的,函数式编程可以替代 OOP,但它最有可能在 Scala 和 F# 等语言中与 OOP 一起使用。
  • @ventr1s:业界函数式编程的一个很好的例子是用 Erlang 编写的分布式 NoSQL 数据库 RIAK。 riak.basho.com
  • @ventr1s:请参阅有关函数式编程和设计模式的问题:stackoverflow.com/questions/327955/…
【解决方案2】:

在 OOP 出现之前,程序处理就是一切,已经产生了一些大型的现实世界应用程序(事实上,它们中的大多数是最初的)和许多操作系统。

它当然可以用于具有最小痛苦和最大性能的大型产品

【讨论】:

  • 是的,无数的指标研究表明它在大约 150K LOC 处耗尽了气体。查看 Petzold 大约在 Windows SDK 时代的一篇关于结构化编程如何在复杂性负载下解体的论文:具有 8 个参数的函数,2 个是具有 6-10 个成员的结构。将数据推入和推出每个计算单元最终是行不通的。
  • 好的,但是 - 有多少应用程序变得这么大? OOP 的问题在于它非常难以理解,并且是为大量应用程序设计的——但即使是小型应用程序也是默认设置。这会导致不必要地过度复杂化较小的应用程序,从而产生相反的效果。
  • 面向对象编程有时会导致应用程序变长,因为需要构造函数和较长的 getter/setter 方法。这些早期的过程语言(如 C)不支持元编程,没有多态系统、闭包或 JSON/通用数据表示的简单语法。 C 甚至不支持可选参数。 Monads 和 Macros 可用于构建强大的嵌入式领域特定语言。
  • 具有 8 个参数的函数 - 听说过默认参数吗?对 HashTables + 闭包(如 JavaScript、Python 等)的程序性 + 一流支持怎么样?它们具有 OOP 的许多优点,而无需太多代码。
【解决方案3】:

首先请注意,目前使用的许多编程语言(尤其是“高级语言”)都是多范式。这意味着您永远不会构建纯粹的 OOP 程序(除非您使用 Smalltalk 或 Eiffel 来构建您的大型项目)。

PHP 为例:

  • 包含许多 OOP 元素(从第 5 版开始)
  • 以前主要是程序性的
  • 具有声明式编程元素(例如数组函数)
  • 实现了函数式编程的许多元素(自 5.4 版起)

基本上,PHP 将许多不同的范式粘合在一起(并且本身就是一种“粘合语言”)。

Java 还实现了许多并非来自面向对象范式的概念(例如来自函数式编程)。

查看 Wikipedia 中按类型列出的编程语言列表:https://en.wikipedia.org/wiki/List_of_programming_languages_by_type#Imperative_languages(并非 100% 准确)。

函数式编程(声明式编程的子集)

  • Wideley 已在实践中使用(它成为粘合语言的一部分,如 PHPJava 和许多其他已实现函数式编程概念的语言)
  • 许多想法源于 LISP,绝对值得一看
  • 您可以构建整个应用程序,例如使用 Haskell 因此它可以“替换” OOP

程序化编程

  • C(作为一种主要的过程语言)仍然是使用最广泛的语言之一
  • 许多现代胶水语言一开始都是程序性的
  • 仍有许多程序主要是程序性的(因此,如果您愿意,它可以“替代”OOP)

逻辑编程

  • 最突出的例子是 Prolog。这用于受益于基于规则的逻辑查询的特定任务
  • 不能在构建大型项目方面“替代”OOP,但可以在其他方面替代它

一般的声明性/特定领域语言

  • 在您的项目中使用 SQL?那么它们就不是纯粹的 OOP,SQL 本质上是声明性的。
  • 许多特定领域的语言(如 CSS)都是声明性的

一般的命令式编程

此列表不完整,仅提供一个想法。请注意,在编写大型应用程序时,您通常会使用许多不同的范例,甚至您使用的每种语言都在实现多个范例。

在建模数据时,OOP 通常被认为是构建大型复杂关系的好选择。它并不总是适用于许多其他任务。

【讨论】:

    【解决方案4】:

    向量关系数据建模用于在全球信息网络架构(网络驻留模型代理)中创建具有域相关语义的可执行信息模型。

    【讨论】:

      【解决方案5】:

      FP - 函数式编程是一种非常流行的编程范式,它已经存在了很长时间,并且在最近几年开始变得越来越突出。与可变性、递归和没有副作用的函数相比,FP 更喜欢不变性。一些流行的 fp 语言的例子有 Erlang、Scala、F#、Haskell 和 Lisp(以及其他)。

      【讨论】:

        【解决方案6】:

        目前没有可以真正取代 OOP 的范式。 OOP 的(好处)问题在于它为您完成了大量工作——自动释放资源、验证数据等,并且它使验证代码变得容易——更不用说世界上绝大多数现有的库是用 C++、C# 或 Java 等 OOP 语言编写的。没有这样的大型图书馆等的现实是非常值得怀疑的。

        在小众或学术领域,您会发现很多函数式编程。但是,如果你真的想做一个大项目,OOP 是唯一的选择。

        我认为泛型编程将成为一种新的范式。但是,它实际上仍处于开发阶段,只有 C++/D 提供真正优秀的泛型编程。

        【讨论】:

        • OOP 不做任何这些事情。它可以使它们更容易,但前提是 OO 框架的设计包含它们,例如在 .Net 中,或者如果您愿意编写它们。
        • 从技术上讲,你是对的。然而,现实情况是所有流行的 OO 语言都将资源管理作为面向对象的特性。您很难找到不包含它的直接对象支持语言。而且 OP 显然对实践感兴趣,而不是理论。
        • 资源管理不是面向对象的特性——资源管理是命令式编程语言的特性,它可以是面向对象的,也可以不是面向对象的。我不知道有任何纯函数式语言会强制您显式管理系统资源。
        猜你喜欢
        • 2015-02-08
        • 2010-09-18
        • 1970-01-01
        • 2011-05-25
        • 1970-01-01
        • 1970-01-01
        • 2015-04-28
        • 2012-06-17
        • 1970-01-01
        相关资源
        最近更新 更多