私はルビーで取り組んでいるプロジェクトを持っています、そしてそれは何人かの労働者からの多額の仕事を必要とします。ほとんどのビジネスロジックはこれらのワーカーに含まれており、非常に複雑になっています。私が考案した手法は、composeメソッドのパターンをモデル化していますが、状態を維持するためにインスタンス変数に大きく依存しています。私がこれを設定した方法は論理的に思えますが、これが間違っているかどうか、またはこれを設定できる最もクリーンな方法ではないかどうかについて、コミュニティからフィードバックを受け取りたいと思います。
私は基本的に、一種のスイッチとしてワーカー実行(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
各メソッドは同じロジックに従います。ルールを確認し、満足できない場合は、アクションを実行し(電子メールを送信するなど)、falseを返し、実行を停止します。満足のいく場合は、トランザクションを完了してtrueを返すために必要ないくつかの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
このコードをテストするために、各メソッドが依存するインスタンス変数をスタブします。私のテストはインターフェースではなく実装を認識しているので、これはコードの臭いであることを理解しています。そうは言っても、私はこれらのメソッドのすっきりとしたインターフェースが好きで、ソースをスキャンして何が起こっているのかを正確に知ることができると感じています。
私が間違っている場合、誰かが時間をかけてこれを行う正しい方法(または少なくとも別の方法)を説明してもらえますか?私はいつも、すべてが互いに積み重なっているように見える多くの小さなステップを実行しなければならないオブジェクトを処理する方法を理解するのに問題がありました。