バニラ php で学ぶクリーンアーキテクチャ その 3 - Web 編

前回はクリーンアーチテクチャ (CA) の実装例として コマンドライン (CLI) のツールを作りました。 今回はそれを Web に変更する事で CA の良いところを見ていきます。

TLDR

  • CA で作ると CLI から Web にしても "外側" だけの変更で済むよ
  • 修正範囲も最少限にできるよ

仕様

CLI 版の仕様はこんな感じでした。

  1. 実行すると、指定された商品情報に税込価格を追加して表示する
    • 税込価格は軽減税率を考慮して算出する
  2. コマンドラインツールとして作る。商品 ID を引数で指定する
  3. 商品情報は LTSV 形式で標準出力に表示する
  4. 商品情報として以下の項目がストレージに保存されている
    • 商品 ID
    • 商品名
    • 税抜価格
    • 軽減税率対象か
  5. ストレージはメモリ上に保存される

Web に作りかえるにあたり、以下のように 2, 3, 5 を変更します。

  1. 実行すると、指定された商品情報に税込価格を追加して表示する
    • 税込価格は軽減税率を考慮して算出する
  2. [変更] Web アプリケーションとして作る。商品番号は GET パラメータで指定する
  3. [変更] 商品情報は JSON 形式で返す
  4. 商品情報として以下の項目がストレージに保存されている
    • 商品 ID
    • 商品名
    • 税抜価格
    • 軽減税率対象か
  5. [変更] ストレージはファイルに保存される

実装

Web 版に変更したものが web ブランチ にあるので、 順番に見ていきます。

CLI 版から変更があったもののみ説明します。

main 関数

CLI 版同様、オブジェクトの生成と呼び出しのみ担当しています。 以前は ItemCommand を生成していましたが、 今回は ItemServer を作って実行しています。

Server

main 関数と Controller のつなぎをやります。 この場合、以下をおこなっています。

  • main 関数から渡された GET パラメータを取得する
  • Controller を呼び出す
  • Controller が正常終了した場合、 応答コードと Controller から返ってきた文字列を出力する
  • 例外が発生した場合、例外に合わせた応答コードとメッセージを出力する

Controller

Laravel など、一般的な Web フレームワークのコントローラと同じです。 以下をおこなっています。

  • リクエストからパラメータを取得
  • バリデーションを実施
  • Interactor (ユースケース) の呼び出し
  • 得られた値を Presenter に渡し、表示用に加工

Validator

入力された引数が正しいか検査し、正規化して返します。 渡されるパラメータの形式が違うので、その修正をおこなっています。

StorageClient

CLI 版ではメモリに保存していたデータを ファイルに保存する事としたため、追加し、 逆に、CLI 版であった MemoryStorageClient.php は削除しています。

インタフェースに変更はありません。

Presenter

渡された値を表示用に変換します。 CLI 版では LTSV に変換していましたが、 ここでは JSON に変換しています。

まとめ

以上が変更したクラスの説明となります。

ここで、 diff で変更されたファイルを確認すると、 CLI 版から変更したクラスは Infrastructure, Adapter 層のいわゆる "外側" に属するクラスのみで、 "内側" に属するクラス(UseCase, Entity)には変更が入っていません。

CLI から Web という、比較的大きな変更をしたにも関わらず、 変更した箇所は最低限に抑えられており、 CA の "大切なものを些細なものに依存させない" が有用な考え方である事が示されています。

CA は

  • クラスが増えがち
  • 慣れないとどこに書くか迷ってしまう

な点もありますが、上記のように良い面もありますので、 うまく使っていきたいですね。