Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 轨道';服务对象';最佳实践-类方法或实例化_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 轨道';服务对象';最佳实践-类方法或实例化

Ruby on rails 轨道';服务对象';最佳实践-类方法或实例化,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在根据我一直在学习的一个研讨会实施“服务对象”,我正在构建一个RedditAPI应用程序。我需要对象返回一些东西,所以我不能只执行初始化器中的所有内容。我有两个选择: 选项1:类需要实例化 class SubListFromUser def user_subscribed_subs(client) @client = client @subreddits = sort_subs_by_name(user_subs_from_reddit) end privat

我正在根据我一直在学习的一个研讨会实施“服务对象”,我正在构建一个RedditAPI应用程序。我需要对象返回一些东西,所以我不能只执行初始化器中的所有内容。我有两个选择:

选项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
@subreddits = SubListFromUser.user_subscribed_subs(@client)

或者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)
致电:

@subreddits = SubListFromUser.new(@client).user_subscribed_subs
@subreddits = SubListFromUser.user_subscribed_subs(@client)
在这种情况下,什么是“最佳实践”?我不应该使用object.new(args.method)有什么原因吗?我认为它提供了一个更干净的服务级别,但我不确定这种方法的技术细节,以及它是否有缺点


编辑:或者选项3——我完全错了,有一个更好的方法:)

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

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


我认为类版本可能会通过子类化带来更具创造性的重用,但这也带来了它自己的一系列麻烦,除非设计得尽可能正确。

在许多情况下,您需要为流程生命周期保留一个状态,例如
客户端。与其让它作为参数“遍历”所有需要它的方法,不如将它作为类变量保留。但为了更简洁的语法,我建议将这两种方法结合起来:

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

您认为2不能工作,您使用类方法
self.user\u subscribed\u subs(client)
并设置实例变量
@client=client
,现在这个
@client.subscribed产生错误,因为
@client
返回
nil
它确实工作,但我没有考虑实例变量,你说得对,我应该把它们拿出来。我很快就为这篇文章做了修改,但忘记了修改,抱歉。我同意使用实例变量,但我没有想到这一点。我自己确实更喜欢“类版本”,我正在努力使这个演示应用程序尽可能“正确”。我只是想确保这不是一个大的不不不接近它的新类的方式,所以感谢您的输入!