我将应用程序重构为服务对象,以使模型更小,实际代码文件更有条理。
为此,我正在使用对给定对象执行操作的服务对象。但是,我面临的困境之一是我是将整个对象传递给服务还是只传递一个 ID。
一个典型的例子是更新用户的电子邮件地址。我在模型中使用服务对象而不仅仅是方法的原因是,这封电子邮件还必须与不属于用户模型的外部 3rd 方系统同步。
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 那么服务对象现在必须确保一个有效的对象,等等
对于这种面向服务的操作,是否有商定或预期的标准或模式?我想确保我在整个应用程序中使用一致的方法,并且以后也不要强迫自己陷入困境。