最近我正在构建一个复杂的逻辑控制器,并且由于“单一责任”原则而想重构它。所以我读到了服务。但有时后来我看到了担忧。我认为它是ruby服务的替代品(因为没有默认的Services文件夹等),但找不到任何好的文章,如“关注与服务”等等。
我听说关注的是控制器的模型和服务,但仍然找不到任何证明这一点的主题或文章。
有人可以解释服务和关注点的差异以及何时使用它们?
答案 0 :(得分:14)
关注点和服务非常不同的抽象模式用于完全不同的目的。
我想要验证用户身份。我可以轻松地编写一个authenticate(username, password)
函数,但是将该函数的逻辑封装在一个类中可能很有用:
class AuthenticationService
def initialize(username, password); end
def run(); end
end
除了帮助我在单个类中封装所有身份验证逻辑之外,这还允许我创建其他身份验证类。
class GoogleAuthenticationService
def initialize(username, password); end
def run(); end
end
class FacebookAuthenticationService
def initialize(username, password); end
def run(); end
end
另一方面,关注点是将模块中的功能混合到另一个类中。假设您有一个与授权用户有关的Rails控制器。您可能会编写一个实现before_action
的问题,该问题会检查用户是否已获得授权。然后,您可以将该问题混合到您想要执行该授权检查的任何控制器中。
答案 1 :(得分:4)
关注点本质上是允许您将模型的各个方面封装到单独的文件中以干掉代码的模块。它的优点是它们继承自ActiveSupport:Concern模块,因此您可以访问ActiveRecord操作,例如包含关注点的模型的验证和关联。
服务对象主要用于包装对象中的方法。这些在将逻辑拆分为小型可重用组件时非常有用。这些通常用于解耦系统,并使系统更容易理解,因为从根本上说它们会将您从一些多用途类带到多个具有单一用途的类。
我对自己的担忧表示担忧,并且在与他们保持警惕方面往往会犯错误。
在写作的时候,我的回答刚刚出现,我认为应该是接受的答案:)