OOP是现实世界中占主导地位的编程模型吗?


20

对象永不?好吧,几乎没有

在ACM通讯的VIEWPOINT部分中,我找到了一篇有趣的文章,标题为“ Objects Never?Well,Hardever Ever ”。这与“对象优先”或“对象迟”的观点截然不同。他建议“从不设对象”或“由对象开设研究生院”。

作者讨论了OOP,并提出了有关在现实世界编程环境中如何使用OOP的问题。他认为OOP不是主要的编程模型。他声称,例如,有70%的编程是针对OOP不太适合的嵌入式系统完成的。

当一些大学的教授想谈论OOP的好处时,他们谈论的是代码重用。他又说,作为另一个例子,这不是现实世界中的真实情况。重用代码比大学声称的要难:

我声称使用OOP并不像大多数人所相信的那样普遍,它不如其支持者所声称的那样成功,因此,没有理由证明它在CS课程中的中心地位。

我很高兴知道堆栈溢出中的人们对此有何看法?从程序员的角度来看,OOP是占主导地位的编程模型吗?

如果我应该只选择/学习/使用一种方法,那么它是否是面向对象的?为什么?


26
“ 70%的编程是针对嵌入式系统完成的”?是每个项目,每个开发人员还是每个LOC?我感觉“所有程序”的70%是在Excel中完成的。甚至非程序员也可以编写电子表格。
LennyProgrammers 2010年

1
@ Lenny222:如果您想让我猜的话,那么70%的程序分布式副本都在嵌入式软件中,或者类似的东西。现在,一些嵌入式工作是用C ++完成的,并且通常是经过砍伐的版本,留下了C和对象,因此,争论嵌入式从来都不是面向对象的似乎是不屑一顾的。
David Thornley 2010年

9
我认为占主导地位的编程模型已经存在并将成为泥潭。
whatsisname 2011年

那篇文章对“类”和“子系统”之间做了一个离奇的区分,我什至都不知道。它讨论了DiskBrake extends BrakeOOP 如何对汽车不利,因为在“现实世界”中,这种通信是“通过网络信号和总线协议”实现的-像DiskBrake implements BrakeInterface什么?也许这是我自己的《 << 43年的经验》,但是对我来说,这些例子完全无法支持作者的主张。
OJFord

2
现在,该链接位于付费专线后面。无论如何,OOP在大多数情况下都是定义不足和高估的地方。但是,我们只能说“大多数”新程序很可能以受Java启发的OOP风格编写,并带有getter和setter以及名为SessionManager的类
Charles Salvia

Answers:


19

在ACM通讯的VIEWPOINT部分

如果您对实际编程感兴趣,那么ACM之类的程序是您想要阅读的最新资料。这些通常是伪科学出版物,在现实世界中没有任何应用。这些通常是出于宣传的非正统观点,是为了使作家与众不同并提升自己。

我声称使用OOP并不像大多数人所相信的那样普遍,它不如其支持者所声称的那样成功,因此,没有理由证明它在CS课程中的中心地位。

我倾向于不同意你的观点。OOP广泛传播并且效果很好。数量上,基于OOP的项目可能已经超过了其他策略的发展(让我们谈论15-20年的现代时间)。

但是,OOP不是灵丹妙药。它适用于某些开发,不适用于其他开发。就像其他方法一样。

但我需要提到的一件事是,课程应传达不同方法的知识。如果基于OOP,那是错误的。如果基于FP,那是错误的。它应该涵盖所有内容或完全不涉及该主题。

PS为什么要关心什么是主导而不是什么?只要选择适合手头项目的数字,然后将数字留给“研究人员”即可。


3
它们是尚未成为主流的计算机领域的研究论文。尽管学术界经常这样做,但学术界通常需要花费很多年才能将其过滤到现实世界中。
2010年

4
@DeveloperArt:请注意,论文作者在软件开发方面拥有43年的经验!
Ehsan

6
艾伦·凯(Alan Kay)在cacm.acm.org/magazines/2010/9/…上添加了一条评论-“相比之下,当我最初创造时,我从未考虑过大多数自称为“面向对象”的系统都接近我的意思。术语。' -哪些与我的帖子相关-“ OO?谁的OO?”
Frank Shearar 2010年

9
@Developer Art:令您感到不满意的是“研究人员”部分。那些古怪的学者。他们曾经为我们做什么?哦。演算,关闭,对象,函数式编程,...但其他比,你有什么学者曾经对我们做了什么?
Frank Shearar 2010年

4
-1计算机科学研究人员是否需要惊吓引号?ACM发表伪科学?认真吗
jprete 2011年

17

如果OOP是您所知道的唯一范例,那么也许您应该了解更多。但是,实际上,OOP到底是什么意思?是Java还是C ++?这是否意味着Smalltalk?这是否意味着可设置的值位和结束时间?(嗨,Scheme!)这是否意味着消息发送?(嗨,Erlang!)

简而言之,这似乎是一个有趣的问题。“ OO 有用吗?” 是一个更好的问题。而且,似乎是这样。(当然是给我的。)


6
+1我怀疑在实践中,OOP除了“一种使用对象的东西编写代码的好方法”之外,已经不再具有其他含义。
拉里·科尔曼

所引用的文章并不认为使用OO语言是oo使用的保证,并质疑是否应该存在所有范式,因为它们在其他工程学科中不存在。
JeffO 2010年

也许作者应该阅读William Cook和Matthias Felleisen,他们花费大量时间讨论编程中的相同与不相同。
Frank Shearar 2010年

9

所有开发人员都在哪里做那些“ 70%的编程”?在所有开发人员中,我知道只有不到1%的人在嵌入式系统上工作。

因此,我们有3个选择:

  1. 我是独一无二的,您所有的朋友都真正从事嵌入式编程
  2. 70%的开发人员被锁在地下室
  3. 该统计数据已组成,文章为废话

除非我看到一些证据表明选项1或2实际上是正确的,否则我将选择选项3。

(顺便说一句,我不考虑现代移动开发嵌入式编程,移动开发通常是面向对象的,毕竟苹果强迫您使用* Objective * C来为iPhone开发)


FWIW,我花了几秒钟的时间,针对“ 70%的编程”提出了六种可能的措施。作者很可能用了第七篇。(此外,嵌入式程序员在那里,他们只是倾向于不在同一个地方闲逛,而常常认为自己是电气工程师或类似的人而不是程序员。)
David Thornley 2010年

1
@David Thornley-仍然在撒谎统计数据,作者明确声称当今世界上绝大多数编程是针对嵌入式系统的-我说这完全是公牛#@ $ t,我敢肯定,我可以发明一个可以表明世界上大多数编程都是在我现在所在的房间(仅与另一位开发人员共享)中完成的,但是我基于此观察得出的任何结论都将与已制定的措施一样毫无价值。
尼尔

1
我是一个嵌入式的家伙。我已经看到了几份报告,指出大约99%的生产/出货的处理器是针对嵌入式系统的(如果真的有必要,我可以返回并引用该报告)。话虽如此,我敢肯定,嵌入式系统中几乎没有70%的程序可以完成。我认为大约有50%的处理器是4位和8位的,但它们可能占所有编程的0.1%(或更少)。正如David所说,有很多方法可以提出“ 70%的编程”。如果这个数字是20-25%,我不会感到惊讶。
Radian 2010年

+1表示“说谎并仍在撒谎”;如此真实,如此真实……
Donal Fellows'Apr

8

我没有跟进的事实,但是OOP并不是主要的编程模型。试想一下,所有内部应用程序都是由参加过视觉基础课程或在Excel中进行过宏编程的人开发的。

许多应用程序都在执行命令式编程,其中所有逻辑都堆积在一个类或视图中。这可能是遍布整个企业的大多数内部简单应用程序。

这样做没有错,有几种方法可以解决相同的问题。有些比其他的更合适。

就像您指出的那样,OOP并非在所有情况下都有用。还有其他型号。


再一次,可能会有一个问题,即什么需要被描述为主导模型。是“使用X型开发的应用程序数量”还是“使用X型开发的代码数量”?无论哪种方式,我仍然认为OOP不会成为主导模型。
Morten 2010年

1
+1为了提出一个观点,尽管OOP可能很受训练有素的专业人员的欢迎,但全世界的行业并不能完全反映这一点,因此有很多直接的命令性代码。
2010年

5

OOP是否是主要的编程模型无关紧要,只需将不同的模型适合不同的情况即可。

没有银弹。

Moti Ben Ari争论的是一个学术断言,这已经毫无意义。但是,他指出自己从未发现OOP是“有意义的”,显然它对成千上万的开发人员和软件工程师都适用,并且已在许多系统中使用...

但是,实际上,我的回答的重点是,陈述一个模型或另一个模型是否占主导地位有什么好处,那是盲目的使用它的良好理由吗?当然不是。


如果很多人声称使用一种模型而没有使用,那么这就是一个问题。这个问题看起来很普遍,而不是统治/更好。
JeffO 2010年

4

这实际上是一个很难可靠回答的问题。最大的原因是像我这样的人,他们在定制的内部应用程序中工作,而代码从未离开过我们的建筑物。我们在这里使用OO吗?我并不是说。还有多少其他程序员有类似的工作?他们也不说。我们确实有求职网站,但并非所有职位都已发布,并且并非所有职位都是针对真实职位的,这与招聘人员试图收集姓名列表不同。

即使我确实说过在工作的地方使用OO,这是否也意味着链接文章中的传统定义:对象,类,继承?还是说我主要将对象用作组织代码的一种方式?还是这意味着我真的只是对接口编程而几乎不使用继承?我仍然没有说,但是其中哪些真正算作OO?

直到回答完上述问题,再问问OO是否有用才有意义,更不用说占主导地位了。


2

当然是这样,因为这是管理层锁定的最新流行语。它也提供了比命令式编程更好的封装和抽象性,因此我认为从oop到下一个过渡的过程所花费的时间可能要比oop所必须的更长。

PS2:如果我应该只选择/学习/使用一种方法,那么是OOP还是不是?为什么?

如果您只想学习一个,则应该选择其他领域。

您应该了解类型和封装以及OOP的所有其他优点,然后学习如何使用函数式编程来完成这些相同的事情。


如果您打算学习一种方法,则对选择其他字段的评论+1。太疯狂了
Mat Nadrofsky'1

1

OOP绝对是现实世界中最主要的编程模型之一。

让我们面对现实吧,即使是设计数字硬件的人,也就是芯片设计人员自己,都在过渡到SystemVerilog和SystemC的组合。这些是面向对象的编程语言。

哪里不使用OOP?好吧,如果您正在编码设备驱动程序,那么很难想象为什么需要通用编程或多重继承,或者如果您正在执行AI函数式编程技术,那么从头上变得容易得多。尽管还有很多其他情况,但足以说明,OOP在寡头编程世界中是一个非常强大的地方。


1

我会说不。

我知道那里有大量的代码是使用“面向对象”语言编写的,但通常我发现代码只是将过程包装在类中。(这不一定是一件坏事)。我所看到的用这些语言编写的面向对象更多的代码往往是类之间的依赖关系的可怕混乱,这些依赖关系通常是无法维护的。

OO应该是关于在完全独立的对象之间传递消息的,我们确实在当今的代码中看到了这一点,但是在更大的层面上,即,我们将这些对象实现为dll或程序集或COM对象。我听说过“组件”。

因此,我认为是否使用OO并不重要-如果代码在其生命周期内是可维护的,在设计时就可以重复使用,并且可以快速开发,那么我不在乎如果它是纯过程性的或半面向对象的或完全面向对象的。我怀疑是否有人会告诉您主要样式是否是这些样式中的任何一种,但是我冒昧地猜测,即使将样式分解为类而不是函数,程序样式也将是最常见的样式。


0

我认为区分通过应用面向对象方法获得的解决方案和使用面向对象范例实现的解决方案很重要。我对好的面向对象软件的看法是将两种解决方案结合在一起。如果您考虑对象,并且尊重对象定义和交互,并且可以使用该结构来解决问题,那么您将获得一个灵活而健壮的代码。但是,如果您使用对象来使用过程范式来解决代码,则最终会遇到一些讨厌的组合,这些组合将无法利用Objects的优点。

我真的很喜欢我的代码是面向对象的,而且我已经意识到,起初创建一个好的结构可能会有些烦人,但是当处理当今的灵活性和客户端闪存需求时,我认为值得努力。


0

我不假装知道确切的数字,甚至不做一个粗略的猜测,但是有很多不涉及OOP的编程项目。我与工业机器人合作。这些程序往往是相当简单和直接的过程代码。实际的机器人操作系统更是如此。

我们使用的许多“工具”都是基于OOP的,但是它们在PC上而不是在机器人控制器上运行。其中包括编辑器,模拟和实用程序。

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.