Ruby on rails 我们是否将Rails ActiveRecord用作混合结构,即数据结构+;对象
我已经使用Rails超过4年了,所以很明显我喜欢Rails,喜欢用Rails的方式做事,有时我会不知不觉地陷入黑暗 我最近收到了Bob叔叔的干净代码。我在第6章,有点困惑,作为rails开发人员,我们是否违反了OO设计的基本规则,即Demeter法则或封装法则?Demeter定律指出,一个对象不应该知道另一个对象的内部,也不应该调用方法返回的对象上的方法,因为这样做意味着一个对象对另一个对象知道得太多 但我们经常调用模型中另一个对象的方法。例如,当我们有一个像“订单属于用户”这样的关系时。然后,我们经常会执行order.user.name,或者为了防止它看起来像火车失事,我们设置了一个代理来执行order.nameRuby on rails 我们是否将Rails ActiveRecord用作混合结构,即数据结构+;对象,ruby-on-rails,ruby,oop,activerecord,Ruby On Rails,Ruby,Oop,Activerecord,我已经使用Rails超过4年了,所以很明显我喜欢Rails,喜欢用Rails的方式做事,有时我会不知不觉地陷入黑暗 我最近收到了Bob叔叔的干净代码。我在第6章,有点困惑,作为rails开发人员,我们是否违反了OO设计的基本规则,即Demeter法则或封装法则?Demeter定律指出,一个对象不应该知道另一个对象的内部,也不应该调用方法返回的对象上的方法,因为这样做意味着一个对象对另一个对象知道得太多 但我们经常调用模型中另一个对象的方法。例如,当我们有一个像“订单属于用户”这样的关系时。然后,
如果你太过遵循纯粹主义的方法,那么你就会陷入像Java那样的混乱,它使用了所有正确的设计模式,但是没有人能记住打开一个文件并读取其内容所需的八行代码 Rails的ActiveRecord框架是Martin Fowler的实现。Rails中的活动记录当然不仅仅是愚蠢的数据结构或DTO,因为它们有行为:它们执行验证,它们可以告诉您它们的属性是否发生了更改等等。您可以自由地在其中添加自己的业务逻辑
Rails通常鼓励良好的实践,例如MVC和语法分析,使做坏事变得困难和/或丑陋。Rails就是Rails。还有什么要说的呢。是的,Rails中的一些习惯用法违反了良好的设计原则。但我们容忍这一点,因为这是铁路的方式 话虽如此,在大多数rails应用程序中使用的模型太多了。我经常看到视图代码直接访问模型。我看到业务规则被折叠到活动记录对象中。更好的方法是将业务规则与活动记录隔离,并将视图与模型隔离。这不会违反任何rails习惯用法,并且会使rails应用程序更加灵活和可维护 关于“得墨忒尔定律”,我没有提到距离的概念。我的意思是,“所涉及的对象有多密切的关系?”我认为,这将决定我是否愿意遵循“得墨忒尔定律” 在ActiveRecord的情况下,大多数LoD冲突中涉及的对象都不可分割地绑定在一起,形成一种紧密的关系。更改这些对象的内部数据结构需要更改数据库以反映新结构。数据库的表通常被“绑定”到一个数据库中,该数据库甚至通过外键约束(或至少包含主键和外键)反映这些“关联” 因此,我通常不关心在AR对象之间跟踪LoD。我知道,由于他们的天性,他们彼此紧密地联系在一起
另一方面,我更关心更遥远的对象之间的LoD,特别是那些跨越MVC边界或任何其他此类设计设备的对象。是的,ActiveRecord故意破坏封装。这与其说是Rails的限制,不如说是它所基于的模式的限制。Martin Fowler对ActiveRecord的定义与Rails使用的模板非常相似,他在以下的ActiveRecord一章中也有这样的描述: 另一个反对主动的论点 记录是这样一个事实:它是成对的 数据库的对象设计 设计。这使得它更加困难 将任一设计作为项目进行重构 继续前进 这是其他框架中Rails的一部分。福勒自己说,ActiveRecord主要用于 …对于域逻辑而言,这不太重要 复杂…如果您的业务逻辑是 复杂,你很快就会想用你的 对象的直接关系, 收藏、继承等等。 这些不容易映射到活动记录 Fowler接着说,对于具有复杂域逻辑的更为严肃的应用程序,最好使用能够更好地分离层的逻辑。这是Rails被普遍视为Rails的积极举措的原因之一,因为Merb在ActiveRecord之外还使用了DataMapper模式
我不确定Demeter是否是ActiveRecord的主要关注点。相反,我认为破坏数据层和域层之间的封装会破坏Bob叔叔的做法。我认为德米特是如何遵循开放/封闭原则的一个更具体的例子。但我认为所有这些背后更广泛的想法都是一样的:类应该做一件事,并且对未来的变化具有鲁棒性,而ActiveRecord在某种程度上不是 永远不要把书看得太重。当然,除了“代码完整”之外。这些“规则”和“法律”只是使代码干净的建议。如果违反规则更干净,那么就这么做。如果我知道这种违反不会导致长期的设计问题,而且最重要的是如果有一种方法可以在不违反任何规则的情况下实现更干净的代码,那么这将是一条更可取的途径:)Rails肯定鼓励良好的实践,正如你提到的一个基本前提是MVC、瘦控制器和胖模型等等。然而,关于你回答的第一部分,我不确定是否有人真的会因为followin而陷入混乱