Rails,服务对象:传递整个对象或只传递ID

时间:2014-12-01 20:14:23

标签: design-patterns ruby-on-rails-4 service-object

我将应用程序重构为服务对象,以使模型更小,实际代码文件更有条理。

为此,我正在利用对给定对象执行操作的服务对象。但是,我遇到的困境之一是我是将整个对象传递给服务还是仅传入ID。

一个典型的例子是更新用户的电子邮件地址。我之所以使用服务对象而不仅仅是模型中的方法,是因为此电子邮件还必须与不属于用户模型的外部第三方系统同步。

class User::UpdateEmail
  # Passing entire user object
  def self.update_for_user(user, new_email)
    if user.update_attributes(email: new_email)
      # do some API calls to update email in external services
      true
    else
      false
    end
  end

  # Just passing user ID
  def self.update_for_user_id(user_id, new_email)
    user = User.find(user_id)
    if user.update_attributes(email: new_email)
      # do some API calls to update email in external services
      true
    else
      false
    end
  end
end

一方与另一方有什么好处吗?他们俩似乎"做同样的事情,它看起来像个人偏好我,但我很好奇,如果我遇到一个情况,我传入一个完整的用户对象,并以某种方式它变得陈旧,而服务对象的工作。

如果我传入整个用户,那么调用服务对象的类需要进行检查以确保用户存在等等,而如果我只是传递user_id,那么服务对象现在必须确保有效对象等。

这种面向服务的运营是否存在商定或预期的标准或模式?我想确保在整个应用程序中使用一致的方法,并且以后也不要强迫自己陷入困境。

1 个答案:

答案 0 :(得分:0)

嗯...这取决于:

如果您正在使用后台作业,则只能传递ID! 如果您不这样做,也许是反对,并且总是问自己是谁对此负责。

如果您将事物传递给的对象是负责任的对象,并且必须知道该对象,那么也许该对象应该照顾它的查找,而只需一个id就足够了。查找将在该负责的对象中进行。

如果您要将事物传递给的对象是任何对象,则不关心它是哪种类型,因为它是动态处理的。 (随之而来),然后可能是整个对象。取决于它有多大...

您必须能够根据情况进行判断,没有1-general-rule-or-solution的情况是,每个对象都应承担单个责任。甚至可以在红宝石中弯曲或破碎

通常:

尝试使各事物保持松散耦合,清晰和简单,每件事物都有其单一责任。 避免将不需要彼此了解或捆绑在一起的东西捆绑在一起。

我建议您阅读:
Sandy Metz撰写的Ruby中的Practical Object-Oriented Design
它有很好的例子,并清楚地解释了这些概念。