CodeKataやってみた記事、第九弾です。
今回は、Kata09: Back to the Checkout
をやっていきます。
今回は、実際にコードを書く問題です。
以前書いた、CodeKata第一回の問題を元にしているため、Back to the Checkoutという題名のようです。
- 概要
- 価格表
- 実装指針
- 目的
- 自分なりの答え
- 価格戦略
- シンプルなもの
- 複雑なもの
- ルール群
- CheckOut実装
- ルール群の作成
- 方式の利点
- 価格戦略
- おわりに
概要
Checkoutとは、ここではスーパーのレジを指すようです。
ざっくり言うと、レジを作りましょう、という問題です。
スーパーで買い物する際、最も単純な価格決定方法は、単価 * 個数です。
この問題では、さらにまとめ買いが存在します。
例えば、50セントの商品をまとめて3つ購入した場合、130セント(1ドル30セント)になる、といった具合です。
こういう、特殊なルールにも対応できるコードを作成します。
価格表
Item Unit Special Price Price -------------------------- A 50 3 for 130 B 30 2 for 45 C 20 D 15
単価50セントのAを3個購入したら、本来150セントのところを130セントで買えます。 Bも似たような価格設定ですが、CとDは単純に単価 * 個数です。
実装指針
co = CheckOut.new(pricing_rules)
co.scan(item)
co.scan(item)
: :
price = co.total
サイトに載っているRubyの例です。
- CheckOut(レジ)に金額ルールリストを渡す
- 個々の商品を一つずつ渡す(順不同。A→B→A→C→Aのような順番でも、Aを3つ購入になるので、割引が適用される)
- 最後に、レジから合計金額を取得
のように実装します。
肝は、scanに渡される商品に応じて、内部計算を切り替えるところです。
目的
チェックアウト(レジ)が、特定の商品や価格戦略(strategies)を知らない方法で、これを実装できますか?
とあります。いわゆる抽象化のことです。
また、価格戦略を簡単に追加できるように考慮して、作成します。
いつものように、続きは一応隠します。(直接見ると隠れません)
続きを読む