gpt4 book ai didi

design-patterns - Rails,服务对象 : pass entire object or just an ID

转载 作者:行者123 更新时间:2023-12-02 04:52:04 26 4
gpt4 key购买 nike

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

为此,我使用了对给定对象执行操作的服务对象。但是,我面临的困境之一是我是将整个对象传递给服务还是只传递一个 ID。

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

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,那么服务对象现在必须确保有效对象等

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

最佳答案

嗯...这取决于:

如果您正在使用后台作业,您应该只传递 ID!如果您不这样做……也许反对,并始终问问自己谁/什么对此负责。

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

如果您将 thing 传递给的对象采用任何对象并且不关心它是什么类型,因为它会动态处理它。 (因为它来了)然后可能是整个对象。取决于它有多大...

您必须能够根据具体情况进行判断,没有1-general-rule-or-solution,除了每个对象都应该有单一的责任。甚至可以用 ruby 弯曲或折断

一般情况:

尽量保持松散耦合、清晰和简单,每件事情都有其单一职责。避免将不需要相互了解或捆绑在一起的事物捆绑在一起。

我推荐你阅读:
Ruby 中的实用面向对象设计,作者:Sandy Metz
它有很好的示例并清楚地解释了这些概念。

关于design-patterns - Rails,服务对象 : pass entire object or just an ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27236477/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com