Ruby 面向对象处理复杂问题的方法
我有一个用ruby开发的项目,它需要一些工人的大量工作。大多数业务逻辑都包含在这些工作人员中,它们变得相当复杂。我设计的技术为compose方法模式建模,但它严重依赖实例变量来保持状态。我的设置方式似乎合乎逻辑,但我想从社区获得一些反馈,看看这是否是错误的,或者这不是我可以设置的最干净的方式 我基本上使用worker-perform(Sidekiq)方法作为一种开关Ruby 面向对象处理复杂问题的方法,ruby,oop,Ruby,Oop,我有一个用ruby开发的项目,它需要一些工人的大量工作。大多数业务逻辑都包含在这些工作人员中,它们变得相当复杂。我设计的技术为compose方法模式建模,但它严重依赖实例变量来保持状态。我的设置方式似乎合乎逻辑,但我想从社区获得一些反馈,看看这是否是错误的,或者这不是我可以设置的最干净的方式 我基本上使用worker-perform(Sidekiq)方法作为一种开关 def perform(transaction_id, data, account_id) @transaction_id =
def perform(transaction_id, data, account_id)
@transaction_id = transaction_id
@data = data
@account = Account.new(account_id)
@campaign_tag = nil
@match_str = nil
@options = nil
has_starter_tag || return
find_campaign || return
determine_options || return
find_active_option || return
reservation_over || return
already_filled || return
send_to_inventory
end
每种方法都遵循相同的逻辑。检查规则,如果不满意,则执行操作(发送电子邮件,无论什么…)并返回false,从而停止执行。如果满意,则存储完成事务所需的一些ivar数据并返回true,从而进入下一步
def has_starter_tag
result = true
@campaign_tag = find_starter_tag(@account, @data[:variable])
if !@campaign_tag
result = false
send_email_about_badness
log_some_stuff
end
result
end
为了测试这段代码,我存根了每个方法所依赖的实例变量。我知道这是一种代码味道,因为我的测试知道实现而不是接口。这就是说,我喜欢这些方法干净的界面,我觉得我可以扫描源代码,确切地知道发生了什么
如果我做错了,有人能花点时间解释一下正确的方法(或者至少是另一种方法)吗?我一直在思考如何处理需要执行许多小步骤的对象,这些小步骤似乎都是建立在彼此的基础上的。我的直觉是,您试图在某种程度上过度设计这些对象 您所描述的并不是一种设计模式——它只是将所需的功能划分为若干不同的方法。问题在于,这些方法彼此紧密耦合,因此将它们分离除了“分组”功能外,没有什么其他用途。这些函数唯一的共同点似乎是,它们检查某些内容并取消检查失败的作业。撇开重复的功能不谈,您可以通过将所有代码放在一个函数中并用空行分隔各个部分来实现大致相同的效果
有时,在代码中找到一些OOP解决方案或设计模式可能会适得其反。归根结底,真正重要的是,它是否提供了优势?它能保存代码吗?它是否使代码易于维护和扩展?(代码是否需要易于扩展?)?
@campaign
、match_str
和选项
用于什么?首先,我将使具有_starter_标记
和其他方法接受它们各自需要的参数。这将允许您在分离中测试,而不依赖于实例变量。前3个变量本质上是大多数方法用于数据的常量。我可能应该指定这一点,但我在从has\u starter\u tag
外部方法调用的方法中做了大部分工作。这些不访问实例变量,并且是单独进行单元测试的。