Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 为什么面向对象模型如此占据/垄断?_Oop_Orm - Fatal编程技术网

Oop 为什么面向对象模型如此占据/垄断?

Oop 为什么面向对象模型如此占据/垄断?,oop,orm,Oop,Orm,别误会,OOP目前是构造大型代码库的最好方法 但是为什么人们试图把任何东西塞进OO视图呢 例如:每本关于OOP的教科书都包含一个“介绍示例”,试图用OO继承、组合和聚合结构来表达现实世界的一个小视图。同时,我们都知道,它永远不会产生OO模型本身承诺的万能OO结构!作者们只是制造了一种错觉 我个人的观点是,OO很适合构造代码,但它不适合表示真实世界的数据及其关系。无论关系模型如何优越,可能任何其他模型都是优越的 在OO设计中,只要有可能,就推荐组合而不是继承。所以,一流书籍所建议的那种基于继承的对

别误会,OOP目前是构造大型代码库的最好方法

但是为什么人们试图把任何东西塞进OO视图呢

例如:每本关于OOP的教科书都包含一个“介绍示例”,试图用OO继承、组合和聚合结构来表达现实世界的一个小视图。同时,我们都知道,它永远不会产生OO模型本身承诺的万能OO结构!作者们只是制造了一种错觉

我个人的观点是,OO很适合构造代码,但它不适合表示真实世界的数据及其关系。无论关系模型如何优越,可能任何其他模型都是优越的

在OO设计中,只要有可能,就推荐组合而不是继承。所以,一流书籍所建议的那种基于继承的对象世界的强大模型只是一种幻觉。那么,OO本身可能是一种幻觉?当前以组合为中心的OO模型只不过是简单的数据结构,带有一些标准化的语法糖——这与OOP之前的方法没有太大区别

另一个例子:想象一个真实世界的非常复杂的模型。除此之外,还有石块和人类。在OO模型中,人是哺乳动物,动物是有机生命形式,等等(你知道,OO强加的严格严格的继承层次)。石头块是非有机的东西,也许它们是刚体或其他什么东西,没关系

如果你是一名艺术家,你必须找到一块石头,它可以为给定宽度、高度和厚度的人像制作一个很好的“模板”(?),那么你必须编写一系列特例OO代码,从人类模型和石头模型中检索这些属性。或者,您的全世界模型是为了支持几何查询而构建的——这样就很容易了!但这就导致了这样一个结论,OOP在以一种允许我们在不同用例中使用它的方式来表示数据方面很差劲。OOP只允许我们精确地表示那些我们事先设计好的用例的数据。不多了。除了那些预先确定的情况之外,任何用途都只能通过大量的修改来完成关系模型至少尝试以可重用的方式表示数据。(可重用:OOP曾经占用过这个词)

为什么那么讨厌

我在一个使用ORM的项目上工作,但它太差劲了。它从数据库建模开始(因为ORM的限制),然后是学习ORM的细节(以及它的错误和进一步的限制),然后是对隐式发生的东西的恐惧(newthing();thing->save()创建了一个新行,但是“thing”的根在哪里?为什么人们试图使对象“独立”呢尽可能地,但在后面创建了对每表单例的更为根深蒂固的依赖,这些依赖与连接单例通信……哦,天哪……我离题了)

许多本可以在几行SQL和一个漂亮的小查询API中完成的事情都是在数百行或数千行“业务逻辑”代码中完成的(当然是在应用程序层,而不是在数据所在的数据库中,以及像count()或sum()这样的聚合函数便宜的地方)。我认为当人们能够在OOP中工作时,他们会感觉更好。但这太愚蠢了

ORM的创建者只是想让用户远离“肮脏的东西”。但正是这些人不应该编写ORM——一个完美的例子:我坚信ORM创建者类型的人甚至不知道数据库表可以包含复合主键!;-)

那么,为什么OOP如此占人眼球?这只是一个半生不熟的抽象概念,但人们对它发誓,如果你问一些人,他们甚至会告诉你OOP将创造世界和平


为什么OOP这么做是占据/垄断?

< PoP只是工具箱中的另一个工具,但是要记住,OO现在已经成为主流编程语言的焦点,超过20年了——从C++开始,再移动到java和C语言。这可能与为什么模型目前“如此占主导地位”有关。

面向对象的要点不一定代表世界上每一个对象的每一个方面。关键是要表现出你所关心的东西。例如,假设有一所房子。从事房地产工作的人会关心位置、售价等。我不知道,一个建筑商可能会关心蓝图ID之类的东西。关键是,你对重要的东西建模,而忽略其他的。如果您需要更多信息,请稍后添加


是的,这使得“House”类适合正在构建的应用程序,可能不适合其他应用程序。OOP的总体目标不是重用类,尽管有时会发生这种情况。关键是将数据与可能影响数据的操作捆绑在一起,从而从概念上将问题从数百个变量和函数减少到几个具有已知和已测试的接口和相关行为的对象。

因为最终它很好地近似于我们自己建模的方式。对此经常提出的反对意见是,计算机没有对象的概念,都是1和0,但这种分析是空洞的,就像说人类所有的思想都只是神经元和电脉冲一样(可能是这样,但这不是一种看待事物的有用方式)

所以你不喜欢继承?我也没有。行为的继承是穷人的代码重用。另一方面,接口的继承性很好,因为它给了我们多态性

你不喜欢我?没有人强迫你使用它们。OOP和RDMS之间存在冲突,我认为这不容易解决,大多数ORM都试图解决这一问题