ORM是否会对OO设计起反作用?

时间:2010-04-12 20:14:27

标签: orm oop behavior

在OOD中,一个物体的设计据说以其身份和行为为特征。

过去使用过ORM,我认为主要目的是围绕存储/检索数据的能力。也就是说,ORM对象不是按行为设计的,而是数据(即数据库表)。案例和要点:许多ORM工具都带有一个点到数据库表和点击对象生成器。

如果对象不再以行为为特征,那么在我看来,这将使对象的身份和责任变得混乱。随后,如果对象没有由责任定义,这可以帮助实现紧密耦合的类和整体糟糕的设计。

此外,我认为在应用程序设置中,您将面临可伸缩性问题。

所以,我的问题是,你认为ORM会对OO设计起反作用吗?或许潜在的问题是它们是否会对应用程序开发起反作用。

9 个答案:

答案 0 :(得分:10)

良好的数据库设计要求与良好的OO设计要求之间存在众所周知且经常忽略的阻抗不匹配。大多数开发人员(根据我的经验)或者不理解这种阻抗不匹配或者不关心。因为从数据库开始并从中生成对象(而不是反过来)更常见,所以是的,你最终会得到很好的对象,这些对象很好地作为持久层,但从OO角度看是次优的。 (反过来,从对象模型生成数据库,让我想要刺出我的眼睛。)

为什么从面向对象的角度来看,它们是次优的?因为ORM生成的对象不是业务对象,即使是部分类等也是如此。业务对象模型行为。 ORM对象模型持久性。我不打算用十段来论证这种区别。这是Rocky Lhotka在他关于Business Objects及其CSLA framework的书中所涵盖的内容。无论你是否喜欢或使用CSLA,我认为他的观点是坚实的。

答案 1 :(得分:4)

  

如果对象不再以行为为特征,那么在我看来,这将是混乱的   对象的身份和责任。

有问题的对象将数据库读取和写入定义为行为。他们除此之外别无其他。

情况的实际情况非常简单:面向对象本身并不是目的,它是达到目的的手段 - 但在某些情况下,它对提高最终结果没有太大作用。 ORM的许多用途构成了一个例子 - 它们是数千种CRUD应用程序的变体,它们不需要或不想将任何真实行为附加到它们处理的大多数数据上。

整个应用程序通过而不是将大量(如果有的话)数据的“行为”编码到应用程序本身的代码中来获得灵活性。相反,它们通常更好地将其作为“哑”数据,它们只是从UI传递到数据库并返回到报告等。有点小心,这可以允许大量的用户自定义,当您尝试将数据视为具有编码到应用程序中的真实行为的真实对象时几乎不可能匹配。

当然,还有另外一个方面:它可以使确保数据完整性变得更加困难,或者只是恰当地使用数据 - 我看到在计算中意外使用错误字段的代码,所以他们平均办公室数字而不是平方英尺的办公室大小。两者都是用户定义的字段,只是说内容应该是数字。应用程序无法知道一个完全有意义,另一个根本没有。

答案 2 :(得分:3)

  

案例和要点:许多OR / M工具都带有一个点对数据库表和点击对象生成器。

是的,但是有相同的,甚至更大的数字或ORM解决方案基于您的对象并生成数据库表。

如果你从数据开始,然后跟踪强制自动生成的对象有对象行为,是的,你可能会感到困惑......但是如果你从对象开始并将数据库生成为辅助层,你最终会即使数据库可能没有尽可能优化,也可以使用更多可用的东西。

如果您正在寻找不使用ORM的理由,请不要使用它。我个人觉得它为我节省了数千行代码,这些代码完成了ORM所做的琐碎事情。

答案 3 :(得分:2)

我不相信ORM会对OO设计起反作用,除非你想坚持持久性是行为中不可或缺的一部分。

我将持久性与商业行为分开。您当然可以自由地将业务行为添加到ORM为您生成的任何对象。

答案 4 :(得分:2)

我也看到了ORM系统,这些系统往往来自OO模型并生成数据库。

如果有的话,我会说ORM更倾向于产生良好的OO代码而不是产生良好的数据库代码。

理想情况下,成功的ORM将两个世界联系起来,从业务领域的问题解决和实现角度来看,您的应用程序代码将非常出色,而您的数据库代码和模型将从规范化,性能和ETL /报告/复制等方面获益匪浅透视图。

答案 5 :(得分:2)

在将数据与行为分开的系统上,它绝对会适得其反。

Orm系统倾向于分析现有的数据库表,以便用您的语言创建愚蠢的“对象”。这些东西不是真正的对象,因为它们不包含商业行为,但由于人们拥有这些结构,他们往往希望使用它们。

Ruby on Rails(Active Record)实际上将您的数据绑定到“Live”类 - 这要好得多。

我从来没有见过一个我真正喜欢的系统--ActiveRecord很接近,但它做了一些我不太满意的红宝石假设 - 最大的是提供公共制定者和放大器。默认情况下是吸气剂。

但总结一下 - 我看到很多优秀的OO程序员因为ORM而编写了搞砸的代码。

答案 6 :(得分:1)

与此类型的大多数问题一样,这取决于您的使用情况。

使用ORM工具的主要方法是:

  1. 按数据定义对象,在整个应用程序代码中使用此对象(BAD BAD BAD)
  2. 仅将ORM对象用于数据访问,使用解释层定义自己的对象(更好)
  3. 如果从头开始,第三种方法是从对象模型设计数据。 (尽可能最好)

    所以是的,如果您通过数据表定义对象并在整个代码中使用它,那么您将不会使用OOD并引入非常糟糕的设计和维护问题。

    但是如果你只使用ORM对象作为数据访问工具(替换ADO),那么你可以自由地使用好的OOD和ORM。当然,构建解释层需要更多的代码,但是可以实现更好的实践,而不需要比旧的ADO代码更多的代码。

答案 7 :(得分:0)

我是从C#角度回答这个问题,因为那是我开展大部分工作的地方....

我明白你的意思,但我认为有了创建部分类的能力,你仍然可以创建任何你喜欢的行为的对象,并且仍然可以获得OR / M带来的数据检索功能。

答案 8 :(得分:0)

从我所看到的ORM中,他们并没有违背OO原则 - 事实上与他们完全正交。 (有关信息 - 对ORM技术来说很新,Java透视)

我的理由是,ORM可以帮助您将类的数据成员存储到持久性存储,而无需与该存储耦合并自行编写该代码。您仍然决定数据成员并编写类的行为。

我猜你可以滥用ORM来打破OO原则,但是你可以用任何东西做到这一点。您可以使用工具从预先存在的表创建骨架数据类,但您仍然可以创建方法等。