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 のような新しいシナリオを、既存のクラスに触れず足したい
返すオブジェクトの形がそろわない
同じ処理を、シナリオごとに書いている
- 第6回 — ログ出力や処理時間の計測を、1か所にまとめたい
全話一覧
- PerlとMooで偽APIを作る。成功レスポンスだけ返すミニAPIで、ResponseクラスとMockApiクラスの土台を置く【最小構成】
- 偽APIにエラーレスポンスを足したら、メソッドが if/else だらけになる。分岐が増える限界を確かめる【if/elseの肥大化】
- if/elseだらけの偽APIを、シナリオごとのクラスに分ける。継承で成功と404を独立させる【継承で分離】
- レスポンスのクラスごとに render の有無がばらばら。Moo::Role で必須メソッドを決める【Moo::Role】
- シナリオごとに専用のレスポンスを返したい。create_response をサブクラスでオーバーライドする【オーバーライド】
- ログ出力と処理時間の計測がシナリオごとにコピペされる。共通の送信フローを基底クラスに集める【共通処理の集約】
- 429レート制限のシナリオを足す。既存のコードは1行も書き換えず、新しいクラスを足すだけで済む【オープン・クローズドの原則】
- ここまで作った偽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です。各シナリオは独立したクラスで、新しいシナリオを足しても既存コードを変更する必要がありません。
