Ruby on rails 轨道';服务对象';最佳实践-类方法或实例化
我正在根据我一直在学习的一个研讨会实施“服务对象”,我正在构建一个RedditAPI应用程序。我需要对象返回一些东西,所以我不能只执行初始化器中的所有内容。我有两个选择: 选项1:类需要实例化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
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
它确实工作,但我没有考虑实例变量,你说得对,我应该把它们拿出来。我很快就为这篇文章做了修改,但忘记了修改,抱歉。我同意使用实例变量,但我没有想到这一点。我自己确实更喜欢“类版本”,我正在努力使这个演示应用程序尽可能“正确”。我只是想确保这不是一个大的不不不接近它的新类的方式,所以感谢您的输入!