つくる: 検証つき関数群
エラー設計込みで組む
第4章の内容を全部使います。
プレーンテキスト
func 関数に切り出す
複数戻り値 値とエラーを一緒に返す
if err != nil 受けて分岐する
errors.New 理由を持つエラーを作る
fmt.Errorf 値を混ぜたエラーを作る作るのは、出品を受け付ける処理です。検証して、手数料を引いて、結果を返します。
プレーンテキスト
きのこ図鑑 受取額1080円関数を3つに分ける
1つの関数に全部書くと、どこが検証でどこが計算か読み取れません。役割で分けます。
プレーンテキスト
validate 検証する。問題があれば error を返す
feeOf 手数料を計算する
submit 上の2つを使って結果を組み立てるsubmit から見ると、検証は「通ったか通らないか」だけ、手数料は「いくらか」だけです。中身を知らなくても組み立てられます。
エラーを返すか、文字列を返すか
submit は表示用の文字列を返します。ですが内部の関数はエラーを返すべきです。
Go
func validate(name string, price int) error // これでよい
func validate(name string, price int) string // 呼ぶ側が判断できない文字列で返すと、呼ぶ側は「これは成功のメッセージか、失敗の理由か」を文字を見て判断することになります。error なら nil かどうかで機械的に分かります。
表示に直すのは、いちばん外側でやる。 これは Go に限らず通じる考え方で、第8章で HTTP のステータスコードを決めるときにも同じ判断が出てきます。
検証の順番
前のレッスンと同じく、上から順に見て最初の問題を返します。
プレーンテキスト
1. 商品名が空
2. 価格が0以下
3. 価格が上限超え複数の問題を全部集めて返す設計もありますが、入門では最初の1つで止めるほうが素直です。
順番に作る
プレーンテキスト
1. validate を書いてテストを流す(エラー系のテストが通る)
2. feeOf を書く
3. submit で組み立てる要件
validateは検証してerrorを返す。問題が無ければnil- 検証の順番は 商品名が空 → 価格が0以下 → 価格が上限超え
- 上限超えのエラーだけ
fmt.Errorfで実際の価格を含める feeOfは価格の10パーセントを切り捨てて返すsubmitは成功なら商品名 受取額N円、失敗ならエラーの理由を返す
入出力例
submit("きのこ図鑑", 1200) → "きのこ図鑑 受取額1080円"
submit("古い辞書", 999) → "古い辞書 受取額900円"
submit("", 1200) → "商品名が空です"
submit("きのこ図鑑", 0) → "価格が0以下です"
submit("高級品", 2000000) → "価格 2000000 は上限を超えています"
submit("高級品", 1000000) → "高級品 受取額900000円"ヒント
編集 ゆめさく編集部