面向对象的编程范式由于反模块化和反并行性而过时了吗?[关闭]


23

我已经读过CMU教授罗伯特·哈珀(Robert Harper)发表的有争议的文章《向新生学习FP》。他声称CMU将不再在入门课程中教授面向对象的编程,因为它“不适合现代CS课程”。

他声称:

面向对象的编程从入门课程中就完全消除了,因为它的本质是反模块化的和反并行的。

为什么将OOP视为反模块化和反并行的?



14
Buhwaaaah ?!OO使模块化和并行性比在过程中更容易,并且FP不相互排斥。使我困惑。
Matt Ellen

4
他们重新设计了他们的课程,因此他必须出售新程序,并且在没有任何数据的情况下提出大胆的主张。没有证据表明复杂的功能程序比其OOP对应程序具有更多的并行性或模块化。
davidk01 2011年

4
@Matt Ellen:OOP与FP绝对互斥。FP基于几个关键概念,其中一个是没有可变状态。OOP的依据是可变状态的存在,该状态的访问通过将其包装在“对象”中来控制。根据定义,可变状态和不可变状态几乎是互斥的。是的,的确可以使用许多OOP语言编写功能性样式的程序,但这与使用FP语言不同。是的,并非所有的FP语言都是纯真的。但这并不是说FP与OOP兼容。
我的正确观点

2
@JUST:我对您有一个互斥的想法。我认为纯净的和不纯净的FP是FP的子集,因此,如果您假设可变性对于OOP是必不可少的,那么OOP不会与FP互斥。我也不同意可变性对于OOP是必不可少的。您可以使用消息传递来实现一个完全面向对象的系统,而永远不会改变任何东西。
马特·艾伦

Answers:


30

请考虑,哈珀教授CS入门课程的需求与现实生活项目的需求有很大不同。他的工作是向新生传授基本概念(例如,模块化,并行性,归纳法)。因此,非常重要的一点是,所选择的语言(和范式)可以尽可能少地使用仪式(句法和概念)来表达这些概念。在这种情况下,熟悉程度,工具支持,可用的库,执行性能等都是完全无关的。因此,在考虑以下内容时,请记住这一点...

OO是反模块化的观点是由于对其他类的大量依赖关系导致的,即使设计良好的类的对象往往最终也会失败。当您查看过去几年依赖注入框架,文章,书籍和博客文章的泛滥时,即使在OO的支持者的眼中,这也是一个问题,这一点变得很清楚(模拟和存根的兴起也很有趣)。

另一个提示是设计模式重要性以及实现它们的复杂性(与其他编程范例相比),例如工厂,构建器,适配器,桥,装饰器,外观,命令,迭代器,介体,观察者,策略和模板方法,也许Composite在某种程度上与提高OO代码的模块化有关。

继承也存在问题(例如脆基类问题)和(亚型)多态性情愫一个溢出的向上多个类,其中的变化可以通过整个继承链纹波之间的算法的实现(向上向下!)。

与计算(又称为可变性与不变性)相比,反并行的指控与状态强调有关。前者使人们更难以表达子计算的依赖性(这是Harper的并行性!),因为通常无法从状态的管理位置(也就是声明实例变量的文件)推断出外部参与者会在什么时候改变它。

对不变性和计算的强调使子计算的依赖关系表达更加容易,因为没有状态管理,只有函数/计算在要表达子计算的依赖关系的位置组合在一起。


10
功能阵营中的并行性要求常常被夸大了。函数式语言的编译器使用更基础的理论,因此实现者在将代码转换成机器代码之前有更多的方法来重组代码,但这并不意味着如果您为OO程序员提供适当的并行性抽象,他们将无法编写干净的并行代码。到目前为止,过程程序员只获得了锁和线程,我认为这些工具做得很好。
davidk01 2011年

2
尽管我通常同意您在这里所说的一切,但我想指出,所有编程范例中都包含设计模式。对于函数式编程,我要指出诸如monads和map / reduce之类的东西。
ANM

@ davidk01以Go为例。它支持面向对象的编程,并具有出色的并发原语。更重要的是,它并发编程并没有纯粹的功能。
weberc2 2014年

19

这可能是一个大胆的主张,但是我有点怀疑,这个罗伯特·哈珀从未真正写过真正的软件。他似乎只关心ML和静态类型系统。尽管可能有这么大的贡献,但我看不出他关于OOP的主张如何具有相关性。

本文没有争议。争议涉及审查,辩论和讨论。您在这里所遇到的是一些无知的学者,他们在一个陈述中就提出了两个非常基本的指责,而又不愿提出任何论据。

  1. 关于OOP是反模块化的说法完全是胡说八道。我什至不知道该如何响应,不仅没有提供任何参数,而且设计的OOP 一种通过封装和抽象的方式在各个模块之间建立非常低耦合的模块化方法。

  2. 声称OOP是反并行的,这表明缺乏了解。OOP不会锁定任何有关并发的决定。OOP仅指示隐藏它们:如果构建正确,则不能说对象的实现是否并行。
    因此,最终OOP和并行编程是正交的。actor模型是一种优雅的并发模型,可以直接反映在对象系统中(但不必如此),从而将两者强大地结合在一起。

OOP的问题在于,很少有人真正理解Alan Kay定义它的含义。

  1. OOP是一种方法。在某些语言中,它是使用模式实现的,而在另一些语言中,您可以直接使用内置的语言习语(例如Ruby,Objective-C,Smalltalk,Io)。
  2. 与通常的看法相反,OOP与类无关。它与对象有关,而对象与消息传递或封装和抽象的非泄漏方式有关。

这就是Java对OOP为何指尖对海战的原因。对于许多其他所谓的“ OOP语言”也是如此,但是关于Java的事情是,在大学中,人们普遍认为应该使用Java来教授OOP。

我同意那些应该从CS课程中删除使用Java进行OOP的介绍的人的观点。我还认为,显然对OOP缺乏基本了解的人不应该教它。因此,如果Bob坚持学习ML并简单地讲授自己具有扎实的知识,那可能会更好。
目前,OOP更像是一种时尚的礼节,人们喜欢坚持一切。人们说,这伤害了OOP。OOP并不落伍。当人们最终了解它到底是什么而不是什么时(例如,通过使用关键字class500次来解决所有可能的问题),OOP的黄金时代尚未到来。


1
+1用于传递消息,而+1用于“ with Java”。不幸的是,如果他们确实删除了Java,他们只会将其替换为C#并继续其原有的遗产。
gbjbaanb

@ back2dos为评论家+1,为Java -1。当然,Smalltalk比Java“更多的OO”,但是谁使用它呢?像C一样,Objective-C对于初学者来说很难。
maaartinus 2011年

@maaartinus:如果能回答您的问题,您会发现Squeak在教育和学术领域得到广泛使用。至于Java:您可能喜欢,我可能不喜欢。就像咖啡一样,这是个人喜好问题,讨论毫无意义。但是Java不适合OOP的介绍,恕我直言,这是Java性质和OOP概念的不可否认的暗示,而这正是我所说的。Java的普及并不会消除这一点。至于C,建议您阅读joelonsoftware.com/articles/ThePerilsofJavaSchools.html
back2dos

@ back2dos Squeak可能用于这些领域,但是我在大学里学过ML。两者在行业中同样无法使用,并且都因其概念而值得学习。这篇尖锐的文章是我所读过的Joel撰写的最糟糕的文章,篇幅太长,乍一看,该信息似乎是处理段错误的重要性。:D我真的仍然建议使用Java来教授OOP。
maaartinus 2011年

@maaartinus:在大学里学到的东西对应该教什么没什么关系。您仍然没有给出为什么应该使用Java来教授OOP的理由,而我给出了我认为不这样做的充分理由。同样,您显然也无法理解本文的本质:无法像C一样困难地解决问题的人首先不应该学习CS。我认为CS不应该愚弄每个喜欢计算机的孩子都能理解的东西。如果我们无法达成共识,那么进一步的讨论将浪费您的时间和精力。
back2dos

12

您会看到每一个条纹的狂热者。

面向对象编程不是万灵丹。从来没有。这是炒作的受害者。不可避免地,人们会厌倦炒作,并开始产生强烈的反响(无论该范式的实际用途如何)。

从现在起的二十年里,毫无疑问,我们还会对功能编程产生其他抵制。


1
已经有!
quant_dev

1
++“您会看到每一个条纹的狂热者。” 我是一个学者,我的经历就是这样。学者们喜欢发出挑衅性的观点,也许给他们的学生留下深刻的印象。
Mike Dunlavey

5

我不能完全回答这个问题,因为一个人只能猜测其作者的模糊思想。我强烈怀疑这篇文章将使它的作者感到尴尬。关于OOP的任何事情都不能表明它既不是模块化也不是并行的:

模块化:OOP的一个主要方面是它确实是模块化的(但是模块化在不同的上下文中意味着不同的东西)。因此,无论作者是在谈论泛化还是静态编程,他都是错误的。

并行化:关于并行编程,大多数框架都支持中断,线程化和现在适当的并行化,例如我们在.Net framework 4.0中看到的内容以及连接到它的OOP语言。

我怀疑作者已经成为时尚的受害者,因为人们误解函数式编程和OOP在使用上是互斥的。OOP语言中有一些功能样式,这些文献有充分的文档记录,例如,Oliver Sturm在该领域中已经发表过。


4

作者坚持认为,对于新生的程序员来说,OOP太难理解了,这可能是正确的-尽管鉴于CMU的入学要求,但我对此表示怀疑!与纯函数式语言相比,反模块化和反并行语句在狭窄的上下文中可能是正确的,但是几乎不能谴责整个范例(对于那些知道如何使用它的人来说似乎很好用)。

拟议的课程将在一个班级教授函数式编程,在另一个班级教授命令式(过程)编程,并在另一班级教授数据结构。一旦大一掌握了这三样东西,他/她就应该准备学习OOP。

我个人认为这太过分了,但是学者们喜欢尝试新事物和极端事物。作为一种平衡,麻省理工学院曾经(并且可能仍然)在一个新生班上教授所有主要的编程范例。

奇怪的是,两所学校都产生了一些非常优秀的程序员。去搞清楚。

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.