关注与服务

时间:2017-09-27 21:06:53

标签: ruby-on-rails ruby

最近我正在构建一个复杂的逻辑控制器,并且由于“单一责任”原则而想重构它。所以我读到了服务。但有时后来我看到了担忧。我认为它是ruby服务的替代品(因为没有默认的Services文件夹等),但找不到任何好的文章,如“关注与服务”等等。

我听说关注的是控制器的模型和服务,但仍然找不到任何证明这一点的主题或文章。

有人可以解释服务和关注点的差异以及何时使用它们?

2 个答案:

答案 0 :(得分:14)

关注点和服务非常不同的抽象模式用于完全不同的目的。

  • 服务是将操作/功能转换为类。
  • 关注点是mixins

我想要验证用户身份。我可以轻松地编写一个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操作,例如包含关注点的模型的验证和关联。

服务对象主要用于包装对象中的方法。这些在将逻辑拆分为小型可重用组件时非常有用。这些通常用于解耦系统,并使系统更容易理解,因为从根本上说它们会将您从一些多用途类带到多个具有单一用途的类。

我对自己的担忧表示担忧,并且在与他们保持警惕方面往往会犯错误。

在写作的时候,我的回答刚刚出现,我认为应该是接受的答案:)

相关问题