@nqounetです。
前回は成功レスポンスだけを返すシンプルなAPIシミュレーターを作りました。しかし実際のAPI開発では、エラーレスポンスも必要です。今回は「エラーも返したい!」という要求に対応しながら、コードがどのように複雑化していくかを体験します。
このシリーズについて
シリーズ全体の目次は以下をご覧ください。
前回の振り返り
前回は、ResponseクラスとMockApiクラスを作成し、成功レスポンスを返せるようになりました。
| |
今回のゴール
成功と失敗、両方のレスポンスを返せるようにします。ただし、その過程でコードがどれだけ複雑になるかに注目してください。
flowchart TD
A["create_response(scenario)"] --> B{scenario?}
B -->|success| C["200 OK"]
B -->|not_found| D["404 Not Found"]
B -->|unauthorized| E["401 Unauthorized"]
B -->|validation_error| F["400 Bad Request"]
B -->|server_error| G["500 Internal Server Error"]
B -->|else| H["die: Unknown scenario"]
style A fill:#f9f,stroke:#333
style B fill:#ff9,stroke:#333
シナリオ引数を追加する
まず、どのレスポンスを返すかを指定できるように、send_requestメソッドにシナリオ引数を追加しましょう。
| |
動きました。しかし、create_responseメソッドの中にif/elseが登場しています。
シナリオが増えるとどうなるか
実際のAPIでは、もっと多くのエラーパターンがあります。認証エラー、バリデーションエラー、サーバーエラーなどを追加してみましょう。
| |
5つのシナリオを追加しただけで、create_responseメソッドは60行を超えてしまいました。
この設計の問題点
現在の設計には、いくつかの問題があります:
- 1つのメソッドに全てのシナリオが詰め込まれている
- 新しいシナリオを追加するたびに、既存のコードを修正する必要がある
- シナリオごとのレスポンス生成ロジックが分離されていない
- テストを書くときに、全てのシナリオを1つのメソッドでテストしなければならない
これは「オープン・クローズドの原則」に違反しています。拡張に対しては開いていて、修正に対しては閉じているべきなのに、新しいシナリオを追加するたびにcreate_responseを修正しなければなりません。
完成コード
今回の完成コード(5シナリオ版)を1ファイルにまとめると、以下のようになります。
| |
まとめ
今回は、エラーレスポンスを追加しようとした結果、if/elseの条件分岐が肥大化する問題を体験しました:
- シナリオが増えるほど、
create_responseメソッドが長くなる - 既存コードを修正しないと新しいシナリオを追加できない
- 責務が1つのメソッドに集中している
次回は、この問題を解決するために継承を使ってシナリオごとの生成クラスに分けていきます。
