不要误解我的意思 - OOP目前是构建大型代码库的最佳选择.
但是为什么人们会尝试将任何内容填入OO视图?
例如:每本关于OOP的教科书都包含一个"介绍示例",试图在OO继承和组合和聚合构造中表达我们现实世界的一个小视图.并且 - 同时 - 我们都知道它永远不会导致OO模型本身承诺的全能OO结构!作者刚刚创造了一种幻觉.
我个人认为,OO很适合构造代码,但它不适合代表真实世界的数据及其关系.恕我直言,关系模型是优越的,可能任何其他模型都是优越的.
在OO设计中,尽可能推荐构图而不是继承.因此,一流图书所暗示的基于全继承的世界对象的强大外观模型只是一种幻觉.那么,OO本身可能是一种幻觉?目前以组成为中心的OO模型只不过是具有一些标准化语法糖的普通数据结构 - 与OOP前方法没有太大区别.
另一个例子:想象一下真实复杂的现实世界模型.除了其他任何东西,还有石块和人类.在OO模型中,人类是哺乳动物,动物是有机生命形式等等(严格的刚性继承等级OO强加,你知道......).石块是非有机的东西,也许它们是刚体或其他什么,无关紧要.
如果你是一个艺术家,你必须找到一个石块,为一个给定宽度,高度和厚度的人类雕像制作一个好的"模板"(?),那么你必须写一堆特殊情况的OO代码到从人体模型和石块模型中检索这些属性.或者,您的整个世界模型都是为了支持几何查询而构建的 - 那么它很容易!但这导致得出的结论是,OOP以一种允许我们在不同用例中使用它的方式来表示数据.OOP只允许我们准确地表示我们事先设计的用例数据.不多了.除了那些预先确定的情况之外的任何使用只能通过大量的小问题来完成.关系模型至少试图以可重用的方式表示数据. (可重复使用:OOP曾经占用过那个词)
为什么那么讨厌?
我正在开发一个使用ORM的项目 - 它很糟糕.它是在对数据库进行建模时开始的(由于ORM限制),然后是时候学习ORM的来龙去脉(以及它的错误和进一步的限制),然后害怕隐含发生的东西(新东西();东西 - > save()创建了一个新行,但是"thing"的根源在哪里?为什么人们试图让对象尽可能"独立",但在后面创建更加根深蒂固的依赖于每个表单个怪物,与连接单身人士沟通..哦,我的上帝..我离题了).
在几行SQL和一个甜蜜的小查询API中可以完成的许多事情都是在数百甚至数千行"业务逻辑"代码中完成的(当然在应用程序层,而不是数据库中的数据)是,以及像count()或sum()这样的聚合函数便宜的地方.我认为人们在OOP工作时感觉更好.但这只是愚蠢的.
ORM的创建者只是想让用户远离"脏东西".但正是这些人不应该写ORM - 完美的例子:我坚信ORM创建者类型的人甚至不知道数据库表可以包含复合主键!;-)
那么,为什么OOP如此占领?这只是一个半生不熟的抽象,但是人们会为一切发誓,如果你问一些,他们甚至可能会告诉你,OOP将创造世界和平.
为什么OOP如此占领/垄断呢?
OOP 只是工具箱中的另一个工具,但请记住,20 多年来,OO 一直是主流编程语言的焦点 - 从 C++ 开始,一直到 Java 和 C#。这可能更多地与该模型目前“如此占据”的原因有关。