gpt4 book ai didi

ruby-on-rails - Rails 'service objects' 最佳实践 - 类方法或实例化

转载 作者:数据小太阳 更新时间:2023-10-29 07:06:38 24 4
gpt4 key购买 nike

我正在按照我一直在研究的研讨会实现“服务对象”,我正在构建一个 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).m​​ethod 吗?我认为它提供了一个更干净的服务类,但我不确定这种方法的技术细节以及它是否有缺点。

编辑:或选项 3 - 我的做法全错了,还有更好的方法 :)

最佳答案

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

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)

关于ruby-on-rails - Rails 'service objects' 最佳实践 - 类方法或实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24780526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com