解答 05.1 — フレームワークが無いと何が辛いか(requiredBoilerplateSteps)¶
このノートブックは 05.1-what-framework-does.ipynb の練習問題の解答です。
先に自分の力で解いてから、答え合わせに使ってください。
解答: requiredBoilerplateSteps¶
05.1 で実測した通り、hasBody に関わらず常に必要な4つの定形処理(ログ出力・認証チェック・
エラー応答・成功応答)と、hasBody のときだけ追加で必要になる2つ(JSONデコード・バリデーション)
があります。
In [1]:
// requiredBoilerplateSteps は、hasBody に応じて「そのハンドラに必要な定形処理」の一覧を返す。
func requiredBoilerplateSteps(hasBody bool) []string {
steps := []string{"ログ出力", "認証チェック"}
if hasBody {
steps = append(steps, "JSONデコード", "バリデーション")
}
steps = append(steps, "エラー応答", "成功応答")
return steps
}
チェック(問題ノートブックと同じ期待値)¶
In [2]:
import "reflect"
import "fmt"
func mustEqual(got, want any, name string) {
if reflect.DeepEqual(got, want) {
fmt.Printf("✅ Passed: %s\n", name)
return
}
panic(fmt.Sprintf("❌ %s\n got = %v (%T)\n want = %v (%T)", name, got, got, want, want))
}
In [3]:
%%
mustEqual(requiredBoilerplateSteps(false), []string{"ログ出力", "認証チェック", "エラー応答", "成功応答"}, "ボディ無し操作(GET/DELETE)の定形処理")
mustEqual(requiredBoilerplateSteps(true), []string{"ログ出力", "認証チェック", "JSONデコード", "バリデーション", "エラー応答", "成功応答"}, "ボディ有り操作(POST/PUT)の定形処理")
fmt.Println("🎉 すべてのチェックが通りました")
✅ Passed: ボディ無し操作(GET/DELETE)の定形処理 ✅ Passed: ボディ有り操作(POST/PUT)の定形処理 🎉 すべてのチェックが通りました
解説¶
- 「常に必要な4つ」と「ボディがあるときだけ必要な2つ」を分けて組み立てる — これが
05.1 で実測した「ハンドラ × 定形処理」の表をそのままコードにした形です。
hasBodyという 1個の bool だけで、6通りではなく2パターンに集約できることがポイントです appendで共通部分(steps)に条件付きの要素を足していく — スライスを一度作ってから 条件次第で伸ばす、という組み立て方は、05.2 で「ミドルウェアの一覧を条件によって変える」 ときにも同じ形で登場します- この関数自体はまだ何も自動化していません(依然として「必要な処理のリストを返すだけ」)。
05.2 では、このリストの各要素が実際のミドルウェア関数として実装され、
Frameworkがリクエストごとに自動で順番に呼び出すようになります — 「何が必要か」(このレッスン)から「それをどう自動化するか」(05.2)への橋渡しです。