我有一个在红宝石方面工作的项目,它需要一些工人做大量工作。大多数商业逻辑都包含在这些工人内部,他们变得相当复杂。我设计了模型来构造方法模式,但非常依赖实例变量来保持状态。我设置这个方法似乎是合乎逻辑的,但是我想从社区那里得到一些反馈,了解这是否是错误的,或者我能够设置这个方法的最清洁的方法。
我基本上使用工人表演(Sidekiq)方法作为开关
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
每种方法都遵循相同的逻辑。 检查规则如果不令人满意, 执行动作( 发送电子邮件, 随便... ) 并返回错误, 从而停止执行 。 如果满意, 保存完成交易和返回真实所需的一些 ivar 数据, 从而进入下一步 。
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
为了测试这个代码, 我将每种方法所依赖的参数变量截断。 我理解这是一个代码气味, 因为我的测试意识到了执行而不是界面。 也就是说, 我喜欢这些方法的干净界面, 我感到可以扫描源头, 并知道到底发生了什么。
如果我做错了,有人能花点时间解释一下这样做的正确方式(或至少是另一种方式)吗? 我总是有问题要解决那些必须执行许多小步骤的物体,而所有这些步骤似乎都在相辅相成。