【问题标题】:Better practice to modularize code in mixins? Or just put all the code directly into the model?在 mixin 中模块化代码的更好做法?还是直接将所有代码放入模型中?
【发布时间】:2016-06-27 18:54:56
【问题描述】:

标题说明了一切。我更喜欢将代码模块化为 mixins 并将它们包含到模型中。其他人喜欢将代码直接放入模型中,有可能将模型扩展为 MOUS 的模型,这些模型的大小不寻常。

我想知道你们在开发领域做什么/有什么更好的做法。

【问题讨论】:

  • 有问题的代码对不止一个模型有用吗?
  • 大多数时候没有。我主要是为了模块化相关的模型代码并让我们的模型更小。

标签: ruby-on-rails oop models mixins


【解决方案1】:

将代码模块化作为封装独立关注点或行为的一种方式是一种很好的做法,但要小心将短类定义与“小”对象相关联。物体的“大小”最好通过暴露于其他物体的表面积来衡量;对于 Ruby,未标记为受保护或私有的方法是衡量这一点的好方法。

您还必须了解并考虑与其他对象紧密耦合的对象。当用作 mixin 时,模块可以帮助解决这个问题,但情况并非总是如此。 ActiveRecord 将行为分解为 mixins 以便于组合(例如验证、回调和脏跟踪),但 Base 对象将这些组合在一起,使 ActiveRecord 模型与底层代码库紧密耦合。

这并不总是一件坏事。 David Heinemeier Hansson (@dhh) 提出了一个令人信服的案例,说明为什么这种“违规”有时可以创建非常有用、有益的界面和对象。

在实践中,我避免将很多额外的行为委托给 ActiveRecord 模型。当需要额外的行为时,可以将更具体的对象包裹在模型周围,在分离行为和代码的同时增强它们。例如:

class UserDecorator
  attr_reader :user
  delegate :first_name, :last_name, to: :user

  def initialize(user)
    @user = user
  end

  def name
    "#{first_name} #{last_name}"
  end
end

name 是在User 对象上的一种非常常见的方法,但该行为与持久化的任何内容无关。通过将user#name 添加到ActiveRecord 对象的公共接口,隐含期望user#name= 也存在,并且这些映射到数据存储。通过将这种简单的方法移到更合适的对象上,界面更清晰、更可扩展且更易于测试。

注意:如果您在 User 上定义了零个其他方法,并且您还没有使用装饰器,那么首先在 User 上定义 name 方法并稍后将其提取为增加了复杂性。寻求最复杂的解决方案是构建不必要的复杂应用程序的可靠方法。 ;)

【讨论】:

  • 非常感谢您的详细回复。这很有趣。装饰器似乎有很多用处。看起来它们确实有与继承相同的耦合问题,对吧?除了父模型->子类之外,装饰器是顶部的类,模型是权力的底部?您希望将装饰器保存在 rails 应用程序文件结构中的什么位置?在 Lib 文件夹中? Def 同意:“寻求最复杂的解决方案是构建不必要的复杂应用程序的可靠方法。”任何一天我都会和你一起工作:)
  • 装饰器只是模型顶部界面的一个示例,但是是的,它们有时非常有用。我把装饰器放在app/decorators。继承与耦合没有很强的相关性,所以我不确定我是否遵循您的观点。
  • 这是一个很棒的答案。感谢您让这个地方变得很棒。
  • 再次感谢您的出色回答。我还是有点菜鸟,所以我边走边学,这是非常有用和发人深省的。希望我能多投一票!
【解决方案2】:

最近,我基本上已经将所有业务逻辑从模型中移出,并转移到普通的旧 Ruby 对象中——我猜这是对事物的服务方法。我让 PORO 在我的应用程序中作为正式公民独立存在 - 我不会将它们混入其中。

【讨论】:

  • 我非常喜欢。这似乎也是对 /r/rails 的共识。
  • 我也非常迅速地保持我的控制器非常薄 - 既因为我认为这是一种很好的做法,也因为我鄙视 RSpec 中的控制器测试(非常痛苦)。此外,我最近致力于在我的任何视图中完全实现零模型访问。
  • 您的控制器有危险吗?开玩笑。在我问这个问题的所有地方,共识几乎都是 POROS 就是答案。他们似乎试图通过这些大规模的类来减轻“上帝对象”的问题,而这些类会鼓励这个地方膨胀。这是我的 /r/rails 帖子。实际上,那里有一篇关于“上帝之物”的非常有趣的帖子。 reddit.com/r/rails/comments/4a3z2f/…
  • 两个网站上的好问题和许多有趣的答案。而且,是的,我的控制者一直生活在致命的恐惧中——就像我喜欢的那样!
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 2017-03-20
  • 1970-01-01
  • 1970-01-01
  • 2022-08-23
相关资源
最近更新 更多