PagerDutyのElixir上でビジネスロジックを一元化した話がおもしろかった

次の記事を読みました。

How I Centralized Our Scattered Business Logic Into One Clear Pipeline For Our Elixir Webhook Service | PagerDuty

一見最初のコードも何の問題もないように見えます。 全体としてやりたいことはできてるし、それぞれのモジュールも割とシンプル。

でも、注意深く見るとビジネスロジックとしての判断が複数のモジュールに散らばっているのが分かります。

  • Parserがexpireかどうかを見てエラーを出している(中身の意味を解釈して、判断してしまっている)
  • Senderが返ってきたレスポンスを受け取り、成功失敗を判断し、次のロジック(DBモジュールへの保存)を呼んでいる

説明にフォーカスするために例がシンプルになっているけど、さらにビジネスロジック多い場合、 問題があったときにどこをみたらよいかや、新たなビジネスロジックを追加したいときに目星をつける場所に迷うのが目に浮かびます。

一元化されたコードはビジネスロジックを書く場所が1箇所なのでその辺の迷いがなくなっています。 こういうときに with 句が便利。 with については次の記事も参考になります。with に渡すパターンマッチを工夫することでエラーケースをうまく分岐しています。

Elixir’s with statement is fantastic - AgentRisk: Superhuman Wealth Management

さらに複雑なビジネスロジックパイプラインを記述できるライブラリ、Opusも興味深い。小さなプロジェクトで試してみたい。