代码之家  ›  专栏  ›  技术社区  ›  nas

我们是否将Rails ActiveRecord用作混合结构,即数据结构+对象?

  •  7
  • nas  · 技术社区  · 16 年前

    我已经使用铁轨4年多了,所以很明显我喜欢铁轨,喜欢按铁轨的方式做事,有时我无意中掉进了黑暗的一边。

    我最近收到了鲍勃叔叔写的干净代码。在第6章中,我有点困惑,作为Rails开发人员,我们是否违反了OO设计的基本规则,即demeter法则还是封装法则?德米特定律指出,一个对象不应该知道另一个对象的内部,也不应该对一个方法返回的对象调用方法,因为当您这样做时,它表明一个对象对另一个对象了解得太多。

    但我们经常从模型中调用另一个对象的方法。例如,当我们有类似“订单属于用户”的关系时。然后,我们经常会做order.user.name,或者为了防止它看起来像火车残骸,我们设立了一个代表来做order.name。

    1. 这难道不仍然像是违反了德米特定律或封装定律吗?

    2. 另一个问题是:ActiveRecord仅仅是一个与数据库接口的数据结构或数据传输对象吗?

    3. 如果是,那么我们不创建一个混合结构,即通过将业务规则放入ActiveRecord模型来创建半对象半数据结构吗?

    4 回复  |  直到 16 年前
        1
  •  15
  •   Robert C. Martin    16 年前

    铁轨就是铁轨。还有什么可说的。是的,Rails中的一些习惯用法违反了良好的设计原则。但我们容忍这一点,因为这是铁路。

    尽管如此,在大多数Rails应用程序中有太多的模型使用。我经常看到视图代码直接访问模型。我看到业务规则被折叠到活动的记录对象中。更好的方法是将业务规则与活动记录隔离,并将视图与模型隔离。这不会违反任何Rails习惯,并且会使Rails应用程序更加灵活和可维护。

        2
  •  7
  •   John Topley    16 年前

    如果你遵循Puristor方法太多,那么你就像Java一样陷入混乱,在那里它使用了所有正确的设计模式,但是没有人能记住你需要的八行代码,只需要打开一个文件并读取它的内容。

    Rails的ActiveRecord框架是Martin Fowler的一个实现 Active Record design pattern . Rails中的活动记录肯定不仅仅是愚蠢的数据结构或DTO,因为它们具有行为:它们执行验证,它们可以告诉您它们的属性是否发生了变化等等,您是自由的,而且确实 encouraged ,在其中添加您自己的业务逻辑。

    Rails通常鼓励良好的实践,例如MVC和语法醋,以使做坏事变得困难和/或难看。

        3
  •  4
  •   Dave Sims    16 年前

    是的,ActiveRecord故意破坏了封装。这不是对Rails的限制,而是对它所基于的模式的限制。Martin Fowler的ActiveRecord定义几乎与Rails使用的模板相同,他在 POEAA :

    另一个反对的论点 主动的 记录 事实上它是夫妻 数据库的对象设计 设计。这就更难了 将设计重构为项目 前进。

    这是一个 common criticism 其他框架的轨道。福勒自己说,ActiveRecord主要用于

    …对于域逻辑来说 复杂……如果您的业务逻辑是 很复杂,你很快就会想用你的 对象的直接关系, 收藏、继承等等。 这些不容易映射到活动记录上。

    福勒接着说,对于具有复杂域逻辑的更严重的应用程序, Data Mapper pattern 更好的方法是分离层。这就是Rails upcoming move to Merb 通常被视为Rails的积极举措,因为Merb除了使用ActiveRecord外,还使用了DataMapper模式。

    我不确定德米特是ActiveRecord的主要关注点。相反,我认为破坏数据层和域层之间的封装会破坏Bob叔叔的 Single Responsibility Principle . 德米特,我认为是一个更具体的例子,如何遵循开放/封闭原则。但我认为所有这些背后的更广泛的想法是相同的:类应该做一件事,并对未来的变化保持健壮,而在某种程度上,ActiveRecord并不是这样的。

        4
  •  1
  •   Robert Walker    16 年前

    关于“德米特定律”,我没有提到距离的概念。我的意思是,“物体有多紧密的联系?”我的观点是,无论我是否愿意遵守“德米特定律”,这都会有所不同。

    在ActiveRecord的情况下,涉及大多数LOD冲突的对象都被不可分割地绑定在一起,形成了密切的关系。更改这些对象的内部数据结构需要更改数据库以反映新结构。数据库的表通常“绑定”到单个数据库中,甚至通过外键约束(或至少包含主键和外键)反映这些“关联”。

    因此,我一般不关心在我的AR对象之间跟踪LOD。我知道,由于它们的本质,它们彼此之间是紧密相连的。

    另一方面,我会更关注更遥远物体之间的LOD,尤其是那些跨越MVC边界的物体或任何其他此类设计设备。

    推荐文章