Featured image of post 偽APIのif/else地獄を、PerlとMooのクラス分割で抜けてFactory Methodにたどり着く全8回【目次】

偽APIのif/else地獄を、PerlとMooのクラス分割で抜けてFactory Methodにたどり着く全8回【目次】

Perl と Moo で、フロントエンド検証用の偽APIレスポンスシミュレーターを作り、シナリオが増えるたびに伸びる if/else を、継承・Moo::Role・オーバーライドで片付けて、最後に Factory Method パターンと名前を付ける全8回の連載の目次です。どこから読むか、困りごとからも選べます。

Perl と Moo で、バックエンドAPIが未完成でも使える偽APIレスポンスシミュレーターを作る全8回の連載です。成功レスポンスだけ返す最小構成から始め、エラーを足すたびに if/else が伸びる様子を確かめ、シナリオごとのクラス分割、Moo::Role による共通ルール、オーバーライド、共通処理の集約を進めます。429 のシナリオを既存コードに触れずに足せることを確かめたあと、最終回で作ったものが Factory Method パターンだったと名前を付けます。

各回は前の回のコードに手を足していく作りなので、通して読むなら第1回からが早道です。このページは目次を兼ねた案内板です。入口は「どこから読むか」で、困りごとが決まっているなら「困りごとから探す」で、順に追うなら「全話一覧」で選んでください。

どこから読むか

  • 第1回 — 最初から順に作るなら。Response クラスと、成功レスポンスを返す MockApi クラスを作る。前提は Moo のクラス定義の基礎
  • 第2回 — if/else が伸びる困りごとから入るなら。エラーレスポンスを足してメソッドが肥大化する様子を確かめる。前提は第1回のコード
  • 第8回 — Factory Method パターンの対応関係から知りたいなら。第7回までに作ったクラスを Creator・Product に対応づける

困りごとから探す

シナリオを足すたびに if/else が伸びて、既存コードを書き換えている

  • 第2回 — エラーレスポンスを足したら、1つのメソッドに分岐が積み重なった
  • 第3回 — 分岐をなくして、シナリオごとに独立したクラスに分けたい
  • 第7回 — 429 のような新しいシナリオを、既存のクラスに触れず足したい

返すオブジェクトの形がそろわない

  • 第4回 — render の実装し忘れを、実行前に見つけたい
  • 第5回 — シナリオごとに別のレスポンスを返したい

同じ処理を、シナリオごとに書いている

  • 第6回 — ログ出力や処理時間の計測を、1か所にまとめたい

全話一覧

  1. PerlとMooで偽APIを作る。成功レスポンスだけ返すミニAPIで、ResponseクラスとMockApiクラスの土台を置く【最小構成】
  2. 偽APIにエラーレスポンスを足したら、メソッドが if/else だらけになる。分岐が増える限界を確かめる【if/elseの肥大化】
  3. if/elseだらけの偽APIを、シナリオごとのクラスに分ける。継承で成功と404を独立させる【継承で分離】
  4. レスポンスのクラスごとに render の有無がばらばら。Moo::Role で必須メソッドを決める【Moo::Role】
  5. シナリオごとに専用のレスポンスを返したい。create_response をサブクラスでオーバーライドする【オーバーライド】
  6. ログ出力と処理時間の計測がシナリオごとにコピペされる。共通の送信フローを基底クラスに集める【共通処理の集約】
  7. 429レート制限のシナリオを足す。既存のコードは1行も書き換えず、新しいクラスを足すだけで済む【オープン・クローズドの原則】
  8. ここまで作った偽APIの設計に名前を付ける。Scenario が Creator、create_response がファクトリメソッドだった【Factory Method】

前提知識

  • Perl v5.36 以降の基本文法(signatures、postfix dereference など)
  • Moo によるクラス定義の基礎(has、extends、with)
  • 「Mooで覚えるオブジェクト指向プログラミング」シリーズを読み終えていると、スムーズに進みます

完成するもの

成功(200 OK)、404 Not Found、401 Unauthorized、429 Too Many Requests(レート制限)、500 Internal Server Error を返す偽APIです。各シナリオは独立したクラスで、新しいシナリオを足しても既存コードを変更する必要がありません。

関連シリーズ

comments powered by Disqus
システム開発・AIワークフローのご相談は Meetsource へ
Hugo で構築されています。
テーマ Stack は Jimmy によって設計されています。