Rails的服务对象的最佳实践 – 类方法或实例化

我按照我一直在研究的工作室实现“服务对象”,我正在构建一个reddit API应用程序。 我需要对象返回一些东西,所以我不能只执行初始化程序中的所有内容。 我有这两个选项:

选项1:类需要实例化

class SubListFromUser def user_subscribed_subs(client) @client = client @subreddits = sort_subs_by_name(user_subs_from_reddit) end private def sort_subs_by_name(subreddits) subreddits.sort_by { |sr| sr[:name].downcase } end def user_subs_from_reddit @client.subscribed_subreddits :limit => 100 end end 

叫:

 @subreddits = SubListFromUser.new(@client).user_subscribed_subs 

或者Option2将它作为类方法:

 class SubListFromUser def self.user_subscribed_subs(client) sort_subs_by_name(client, user_subs_from_reddit) end private def self.sort_subs_by_name(subreddits) subreddits.sort_by { |sr| sr[:name].downcase } end def self.user_subs_from_reddit(client) client.subscribed_subreddits :limit => 100 end end 

叫:

 @subreddits = SubListFromUser.user_subscribed_subs(@client) 

在这种情况下,什么被认为是“最佳实践”? 有没有理由我不应该使用object.new(args).method? 我认为它提供了一个更清洁的服务类,但我不确定这种方法的技术性,如果它有缺点。

编辑:或者选项3 – 我说这一切都错了,有一个更好的方法:)

在Ruby中,我发现没有太大的区别。

我发现在“静态”版本中使用类变量有点令人不安。

我认为类版本可能会通过子类化实现更多创造性的重用,但除非事情设计得尽可能正确,否则会带来一系列令人头疼的问题。

在许多情况下,您需要保持流程生命周期的状态,例如client 。 而不是让它“通过”你所需要的所有方法“旅行”,作为一个参数,将它作为一个类变量更有意义。 但为了更清晰的语法,我建议将两种方法结合起来:

 class SubListFromUser def initialize(client) @client = client end private_class_method :new # only this class can create instances of itself def user_subscribed_subs @subreddits = sort_subs_by_name(user_subs_from_reddit) end private def sort_subs_by_name(subreddits) subreddits.sort_by { |sr| sr[:name].downcase } end def user_subs_from_reddit @client.subscribed_subreddits :limit => 100 end class << self def user_subscribed_subs(client) new(client).user_subscribed_subs # create instance of this class and run a process end end end 

作为类方法调用:

 @subreddits = SubListFromUser.user_subscribed_subs(@client)