SE(たぶん)の雑感記

一応SEやっている筆者の思ったことを書き連ねます。会計学もやってたので、両方を生かした記事を書きたいと考えています。 でもテーマが定まってない感がすごい。

CodeKataで遊ぶ Kata09: Back to the Checkout

CodeKataやってみた記事、第九弾です。

今回は、Kata09: Back to the Checkoutをやっていきます。

codekata.com

今回は、実際にコードを書く問題です。

以前書いた、CodeKata第一回の問題を元にしているため、Back to the Checkoutという題名のようです。

codekata.com

hiroronn.hatenablog.jp

  • 概要
    • 価格表
    • 実装指針
  • 目的
  • 自分なりの答え
    • 価格戦略
      • シンプルなもの
      • 複雑なもの
    • ルール群
    • 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)を知らない方法で、これを実装できますか?

とあります。いわゆる抽象化のことです。

また、価格戦略を簡単に追加できるように考慮して、作成します。

いつものように、続きは一応隠します。(直接見ると隠れません)

続きを読む