面向对象编程的替代方法?


81

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

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

并且,如果有的话,它的优缺点是什么,为什么它比OOP更好/更糟糕,哪种语言是最好的使用方式,如何在流行的语言中使用它,具有任何设计模式,是否可以完全取代OOP?


1
@Justin Ardini:我知道有很多,但是哪一个可以与oop竞争?@Tobiasopdenbrouw&Macros:好的,变了。
DariuszWoźniak

OOP之所以受欢迎是因为它很受欢迎,如果您不吞下OOP koolaid,您将没有任何项目可以做...
aoeu256

面向数据的编程更加容易,在这种情况下,您关心的是对象集合及其关系,而不是单个对象,在这种情况下,“ db object”方法提供了封装。JSON和sexpressions使SQL,CSS,HTML,Excel,shell脚本变得流行和有用,但是“编程”表示OOP或过程。尽管OOP占代码的20%,但是OOP感谢Python / JavaScript程序的可维护性。Closures和JSON可以在90%的时间中代替Objects使用,并且更简单易用。
aoeu256

Answers:


50

函数式编程是另一种流行的编程范例,大多数情况下是在学术界。函数式编程语言的最佳示例是HaskellStandard ML

函数式编程和面向对象的编程之间的根本区别是,您从数据流而不是控制流的角度进行编程。见演示函数式编程驯服影响西蒙·佩顿-琼斯的一个很好的介绍。

Erlang是行业中使用的函数式编程的一个很好的例子。它主要用于电信,分布式和容错系统。见演示二郎山-软件并发世界乔·阿姆斯特朗

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

现在,新编程语言的趋势是多范式Multi-paradigm),其中将诸如面向对象编程和函数式编程之类的多种范式组合在同一语言中。


4
Scala旨在集成面向对象和功能语言的功能。
菲利普

5
好的答案,但是我认为函数式程序设计和面向对象的程序设计并不是奖牌的两个方面,它们可以完美地共存(如您所述)。它更像是这样:过程VS面向对象,命令式VS功能。Lisp是一种流行的过程函数语言,Java是一种面向对象的命令式语言。
FHD

1
@ ventr1s:是的,函数式编程可以代替OOP,但很有可能与Scala和F#等语言中的OOP一起使用。
乔纳斯(Jonas)2010年

1
@ ventr1s:业界函数式编程的一个很好的例子是用Erlang编写的分布式NoSQL数据库RIAK。riak.basho.com
乔纳斯(Jonas)

2
@ ventr1s:请参阅有关函数式编程和设计模式这个问题:stackoverflow.com/questions/327955/...
乔纳斯

11

在OOP出现之前,过程处理就是一切,它已经产生了一些大型的实际应用程序(实际上,大多数是原始应用程序)和许多操作系统。

当然,它可以以最小的痛苦和最大的性能用于大规模产品中


4
是的,无数指标研究表明,它在大约150K LOC时用尽了天然气。查看一下Petzold前后的Windows SDK,了解结构化编程如何在复杂性负载下分解的论文:具有8个参数的函数,具有6-10个成员的结构是2个结构。最终无法将数据推入和推出每个计算单元。
罗布2012年

1
可以,但是-有多少应用程序变得如此庞大?OOP的问题在于,它的理解极其复杂,并且是为大型应用程序设计的-但即使是小型应用程序,它也是默认的。这具有相反的效果,即不必要地使较小的应用程序过于复杂。
niico

面向对象的编程有时会由于需要构造函数和较长的getter / setter方法而导致应用程序更长。这些早期的程序语言(例如C)不支持元编程,不支持多态,闭包或JSON /通用数据表示的简单语法。C甚至不支持可选参数。Monad和Macros可用于构建功能强大的嵌入式特定领域语言。
aoeu256 '16

具有8个参数的函数-是否听说过默认参数?对HashTables的过程+一流的支持+ JavaScript,Python等闭包呢?它们无需太多代码即可拥有OOP的许多优点。
aoeu256 '17

4

向量关系数据建模用于在网络信息模型代理Global Information Network Architecture中创建具有域相关语义的可执行信息模型。


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是构建大型复杂关系的不错选择。对于许多其他任务而言,并非总是如此。


1

FP-函数式编程是一种非常流行的编程范例,已经存在了很长时间,并且在最近几年中开始变得越来越重要。FP主张不变性胜于可变性,递归和无副作用的功能。流行的fp语言的一些示例是Erlang,Scala,F#,Haskell和Lisp(以及其他)。


-5

当前没有可以真正取代OOP的范例。OOP(的好处)的问题在于,它为您做了大量工作-自动释放资源,验证数据等,并且使验证代码变得容易-更不用说世界上绝大多数现有的库用OOP语言(如C ++,C#或Java)编写。没有如此大规模的图书馆,这种相处的现实令人怀疑。

在利基或学术界,您会发现很多函数式编程。但是,如果您真的想做一个大型项目,那么OOP是唯一的方法。

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


3
OOP不会做任何事情。它可以使它们变得更容易,但前提是OO框架的设计必须包括它们(如.Net中的文本),或者您愿意编写它们。
马特·艾伦

从技术上讲,您是对的。但是,现实是所有流行的OO语言都将资源管理作为面向对象的功能。您将很难找到不包含它的直接对象支持语言。OP显然对实践感兴趣,而不对理论感兴趣。
小狗

3
资源管理不是面向对象的功能-资源管理是命令式编程语言的功能,命令性编程语言可以是面向对象的也可以不是面向对象的。我不知道有任何纯功能语言会迫使您显式管理系统资源。
马修·J·莫里森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.