つくる: Itemで再設計
第5章のコードを書き換える
第5章のつくる回で書いた検索と集計を、Item を使う形に作り直します。新しい知識は出てきません。
第5章の関数はこうでした。
Go
func searchSummary(names []string, prices []int, categories []string, keyword string) string並びが3つ並んでいます。同じ添字が同じ商品を指すという約束が、コードのどこにも書かれていません。
Item にまとめると、こうなります。
Go
func searchSummary(items []Item, keyword string) stringこれがリファクタリングです。 動きは変えず、形だけを良くします。答えが同じであることを、テストが保証してくれます。
メソッドに寄せる
判定や計算を Item のメソッドにすると、集計の側が読みやすくなります。
Go
func (i Item) Matches(keyword string) bool {
return keyword == "" || i.Name == keyword
}呼ぶ側はこうなります。
Go
if !item.Matches(keyword) {
continue
}条件の中身が名前になったぶん、何をしているのか一目で分かります。
|| は「または」です。片方が真なら真になります。キーワードが空、または名前が一致、という条件をそのまま書けます。
何をメソッドにするか
プレーンテキスト
その型のデータだけで判断できる → メソッドにできる
外の情報が要る → 関数のままMatches は Item の名前とキーワードだけで判断できるので、メソッド向きです。一方「一覧の中で最高額か」は他の商品を知る必要があるので、メソッドにはできません。
順番に作る
プレーンテキスト
1. Item に Matches メソッドを付ける
2. 引数を []Item に変える
3. 集計を item.Price で書き直す
4. 該当0件のときを分けるこの演習では、呼び出し側が並びを渡してくるので、関数の中でまず []Item を組み立ててから処理してください。
要件
ItemにMatches(keyword string) boolメソッドを付ける- キーワードが空文字のときは常に true を返す
Matchesを使って絞り込む該当N件 合計M円 平均K円の形を返す- 該当が0件なら
該当なしを返す
入出力例
itemSearch(["きのこ図鑑","中古スマホ","古い辞書"], [1200,24800,800], ["本","家電","本"], "きのこ図鑑") → "該当1件 合計1200円 平均1200円"
itemSearch(["きのこ図鑑","古い辞書"], [1200,800], ["本","本"], "") → "該当2件 合計2000円 平均1000円"
itemSearch(["きのこ図鑑"], [1200], ["本"], "謎の箱") → "該当なし"
itemSearch(["A","B","C"], [100,200,300], ["本","本","本"], "") → "該当3件 合計600円 平均200円"ヒント
編集 ゆめさく編集部