OOP技术死亡[关闭]


9

我已经多次听说过面向方面的编程,主要是它是编程中的“下一代”技术,并且将“杀死” OOP。

这样对吗?OOP会死吗?或者这可能是什么原因?

Answers:


40

每当有人告诉您一种软件技术会杀死另一种软件技术或主导整个市场/使用/受众时,请记住以下几点:

一个理智的(动态的但稳定的)生态系统由各种各样的物种组成。

这意味着,任何新的炒作技术都会经历炒作曲线,最终会随着时间和经验的发现而找到特定的目的。

炒作曲线

这也意味着,如果需要的话,诸如面向方面的编程之类的极端概念很有用,这意味着,由于隐含的成本,并非总是如此,而且不是非常频繁。

但是它已经有了它的位置,例如OOProgramming,通用编程,函数式编程,过程式编程等。

您是否注意到在现实生活中使用更广泛(并引起争议的流行)和广泛传播的语言是“不纯净的”?那是因为允许几个范例使它们在随时间变化的上下文中变得更加灵活,并且它们填补了更多的使用空间。


1
为“不纯” +1。除了非常特殊的用途/学术以外,纯OOP语言已经死了。
2011年

我们认为纯OO语言是什么?短暂聊天?
哲豪·毛

20

OOP不会因为AOP而死。AOP增加了一些价值,但它与OOP完美共存。我认为函数式编程也不会杀死OOP。OOP太适合各种问题领域了,用功能范式代替它是没有意义的。


1
这是非常主观的。我认为OOP不适合特定问题领域,它不适合特定开发人员制定解决方案的方式。OOP不会消亡,因为开发人员无法进行范例切换。
雷诺斯2011年

6
GUI是OOP最适合的经典示例。即使语言不是,也很难想象GUI工具箱的API不是OO。(当然,这不是通常使用“问题域”一词的方式)。给出一个实际的问题域的示例,其中OOP非常适合:仓库自动化。对存储和取回车辆及其活动进行建模是OOP的自然感觉。
user281377 2011年

2
@ammoQ,用OO表示GUI太可怕了。这就是为什么所有API都趋向DSL(WPF等)的原因。不难想象,比如说Tk-那里没有OOP的任何痕迹,但是它仍然很棒(对于编程而言,不是为了外观),比任何过度使用的Java OO工具包都要好得多。OOP非常适合任何基于代理的模拟(如您列出的模拟),但这只是现有问题的一小部分。
SK-logic

6
看一下我可以找到的tk的第一个例子,那不是OO吗?在教程中:“小部件是对象,代表按钮,框架等的类的实例”。tkdocs.com/tutorial/concepts.html而且,DSL本身非常依赖于OO编程。因此,我不太了解您想说什么?
印加

3
@ Sk-logic,@ ammoQ,@ Raynos,@ jkocking,我将其推广为一个独立的问题:programmers.stackexchange.com/questions/88385 / ...我非常有兴趣对此进行更多说明,我非常有兴趣学习。
印加

12

范式来了又去,但是遗留代码是永远的。总是需要维护C ++代码,因此OOP永远不会完全消失。


6
+1代表一个真正出色的短语:“来来去去,但遗留代码永远存在”
NoChance 2012年

8

简短的回答:不,我不这么认为。

更长的答案:根据我对AOP的了解,它本身并不是编程范例(例如,它不能替代OOP),但更多的是,它是一个工具包,可帮助您编写更短的方法,更简单的单一职责类等等。但是它不能代替OOP。

(至少部分)替代或添加到OOP的是函数式编程,它实际上一个不同的编程范例(尽管它可以与OOP混合,例如在Scala编程语言中)。它更喜欢不变的数据结构和各种奇特的功能,这些特征往往会使OOP开发人员感到沮丧,尤其是在并发方面。


功能性<->势在必行。OOP与之平行。我认为程序在OOP的另一端,但我不确定。当然,功能范式早于OOP范式是
一件

2
@Raynos,没有直线。OOP只是大量(无限)可能的抽象语言中的一种微小的语言学抽象。当然,将自己限制在其中任何一个方面都是非常愚蠢的。
SK-logic

6

由于OOP在许多情况下被认为是事实上的方法,因此如今谈论得很少。AOP从来没有像任何形式的群众运动那样起步。

http://imgur.com/9VmKC


5

我记得第一次在OOPSLA '97教程中听说过面向方面的编程。他们说那将在那时杀死OO。从那时起,面向对象的发展仅超出了最疯狂的期望。AOP仍然鲜为人知,对计算行业几乎没有影响。我认为答案很明显,AOP并不是OO杀手。


1

看一下一些现有的AOP系统。它们取决于您是否以某种形式编写了一些代码-例如,Spring AOP依赖于您在类上定义了方法。Castle Windsor支持C#,这是一种面向对象的语言。

从理论上讲,您可以从OOP切换到结构化编程,并且仍然保留AOP,但是在实践中,这很困难。子类化,覆盖相关方法以调用适当的before / after过滤器,以及在依赖项注入过程中将其传递很容易。

与重写静态方法调用以路由到设计用于调用用户定义的过滤器的蹦床方法相比,这很费劲。

因此,从通用实现的角度来看,AOP需要OOP。


0

虽然OOP当然不是灵丹妙药,但对于AOP可以说是一样的。它支持基于组件的设计,但是在更大的方案中,您的组件是新对象,而组件接口基本上是方法的事务性列表,这不是真正的OOP。

进一步的AOP和基于组件的设计支持Anemic数据模型,该模型比我本人更聪明。

http://martinfowler.com/bliki/AnemicDomainModel.html

(我知道上面的文章很旧,但相关性令人惊讶)

最重要的是,AOP系统可以保留,但也远非完美。没有系统是完美的。

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.