つくる: 検証つき関数群
エラー設計込みで組む
第4章で学んだ、関数を呼び出してエラーの有無で分岐する形を組み合わせます。検証、手数料計算、表示の整形は完成済みです。演習では submit からそれらを使います。
func 関数に切り出す
複数戻り値 値とエラーを一緒に返す
if err != nil 受けて分岐する
errors.New 理由を持つエラーを作る
fmt.Errorf 値を混ぜたエラーを作る作るのは、出品を受け付ける処理です。検証して、手数料を引いて、結果を返します。
きのこ図鑑 受取額1080円役割で関数を分ける
1つの関数に全部書くと、どこが検証でどこが計算か読み取れません。役割で分けます。
validate 検証する。問題があれば error を返す
feeOf 手数料を計算する
submit 検証と計算を呼んで結果を組み立てる
receiptMessage 受取額を表示用の文字列にするsubmit から見ると、検証は「通ったか通らないか」だけ、手数料は「いくらか」だけです。中身を知らなくても組み立てられます。
エラーを返すか、文字列を返すか
submit は表示用の文字列を返します。検証を担当する validate は、文字列ではなくエラーを返します。
Go
func validate(name string, price int) error // これでよい
func validate(name string, price int) string // 呼ぶ側が判断できない文字列で返すと、呼ぶ側は「これは成功のメッセージか、失敗の理由か」を文字を見て判断することになります。error なら nil かどうかで機械的に分かります。
表示に直すのは、いちばん外側でやる。 これは Go に限らず通じる考え方で、第8章で HTTP のステータスコードを決めるときにも同じ判断が出てきます。
検証の順番
前のレッスンと同じく、上から順に見て最初の問題を返します。
1. 商品名が空
2. 価格が0以下
3. 価格が1000000円より大きい複数の問題を全部集めて返す設計もありますが、入門では最初の1つで止めるほうが素直です。
順番に作る
1. 用意された検証関数を呼び、エラーがあれば理由を返す
2. 成功したときだけ手数料を引き、表示用の関数に渡す補助関数を組み合わせる
たとえば所要時間を表示する処理なら、計算と文字列作りを別の関数に任せられます。
Go
remaining := minutes - restMinutes(minutes)
return durationMessage(remaining)ここでは restMinutes が休憩時間を計算し、durationMessage が表示用の文字列を返す完成済みの関数です。演習の receiptMessage(name, received) も同じ役割なので、表示の型紙を書き直す必要はありません。
要件
- 完成済みの
validate(name, price)を呼ぶ - 検証の順番は商品名が空、価格が0以下、価格が1000000より大きい。1000000ちょうどは成功する
- エラーがあれば
Error()で理由を取り出して返す - 成功したときだけ完成済みの
feeOf(price)を使って価格から手数料を引く - 成功時は完成済みの
receiptMessageを使って商品名 受取額N円の表示を返す - 補助関数と定数は変更せず、
submitだけを完成させる
ヒント
編集 ゆめさく編集部