Src*_*Src 11 ruby ruby-on-rails
最近我正在构建一个复杂的逻辑控制器,并希望通过"单一责任"原则对其进行重构.所以我读到了服务.但有时后来我看到了担忧.我虽然它是ruby服务的替代品(因为没有默认的Services文件夹等),但找不到任何好的文章,如"关注与服务"等.
我听说关注的是控制器的模型和服务,但仍然找不到任何证明这一点的主题或文章.
任何人都可以解释服务和关注点的差异以及何时使用它们?
fny*_*fny 16
关注点和服务是用于完全不同目的的非常不同的抽象模式.
假设我想验证用户身份.我可以很容易地编写一个authenticate(username, password)函数,但是在类中封装该函数的逻辑可能是有用的:
class AuthenticationService
def initialize(username, password); end
def run(); end
end
Run Code Online (Sandbox Code Playgroud)
除了帮助我在单个类中封装所有身份验证逻辑之外,这允许我创建其他身份验证类.
class GoogleAuthenticationService
def initialize(username, password); end
def run(); end
end
class FacebookAuthenticationService
def initialize(username, password); end
def run(); end
end
Run Code Online (Sandbox Code Playgroud)
另一方面,关注点是将模块中的功能混合到另一个类中.假设您有一个与授权用户有关的Rails控制器.您可能会编写一个实现before_action检查以查看用户是否已获得授权的问题.然后,您可以将该问题混合到要执行该授权检查的任何控制器中.
关注点本质上是模块,允许您将模型的各个方面封装到单独的文件中以干燥您的代码。优点是它们继承自 ActiveSupport:Concern 模块,因此您可以访问 ActiveRecord 操作,例如验证和包含关注点的模型的关联。
服务对象主要用于将方法包装在对象中。这些在将逻辑拆分成小的可重用组件时很有用。这些通常用于解耦系统,并使系统更易于理解,因为从根本上说,它们所做的工作将您从几个多用途的类带到许多具有单一用途的类。
我对担忧有自己的担忧,并且倾向于谨慎对待它们。
Fny 的答案在写作时刚刚出现在我面前,我认为应该是公认的答案:)