[わんくま同盟 名古屋勉強会 #20] TDD ワークショップのお題

2012/1/14 わんくま同盟 名古屋勉強会 #20 で開催する TDD ワークショップのお題です。

LruCacheMap (TDDBC 東京 1.0 などでのお題を改造)

■ 要求

キャッシュの最大数に達したときに、最も使われていないデータから順に消される Map のような仕組みが欲しい。
void Put(string キー, string データ)    ※ Java 系では put(string キー, string データ)
string Get(string キー)

[以下の例は、キャッシュサイズ=2 のとき]

・ひとつも使われていない場合は、最初に追加したものから消える
lru.Put("a", "dataA");
lru.Put("b", "dataB");
lru.Put("c", "dataC");    // 先に入れた "dataA" が消える
lru.Get("a");    // ⇒ null
lru.Get("b");    // ⇒ "dataB"

・Get() されたら、そのときに使われたとみなす
lru.Put("a", "dataA");
lru.Put("b", "dataB");
lru.Get("a");    // ⇒ "dataA" // "dataA" を「使った」
lru.Put("c", "dataC");    // 使われていない "dataB" が消える
lru.Get("a");    // ⇒ "dataA"
lru.Get("b");    // ⇒ null

 

■ お題

上の要求を、3つのステップに分けて、お題とします。

◆ お題その1: Map (のようなもの)

クラス名: LruCacheMap
メソッド:
void Put(string キー, string データ)    ※ Java 系では put(string キー, string データ)
string Get(string キー)
※ 必要なら public メソッドも追加して良い。

  • データに null は入る。
  • キーに null は不可。 Put()/Get() とも、「引数に null が渡された」という例外が発生する。
  • 同じキーで Put() できる。 データが置き換わる。
  • Get() は、該当するデータがないときは null を返す。

 

◆ お題その2: キャッシュサイズの導入
  • LruCacheMap に入るデータは 2件までとする。
  • 2件入っているときに、さらに異なるキーを Put() すると、 最初のデータが消える。

 

◆ お題その3: 「データを使う」という概念の導入
  • Get() でデータを取り出した時、 そのときに「使われた」と考える。
  • Put() されたときも、「使われた」と考える。
  • 2件入っているときに、さらに異なるキーを Put() すると、 最も以前に「使われた」データが消える。(要求では、2通りに分けて表現されていた)

※ 「使われた」ことをどうやって表現するか? 時刻? 並び順?

 

■ レビュー

ワークショップ後半では、みんなでレビューをします。

  1. 各言語チームから、ひとりずつ発表者を選出。
  2. スクリーンにコードを表示しながら、発表者が解説。
  3. 全員で質疑応答。

[発表するときの観点]
テストコードを全部説明していると長くなるので、観点を絞ってください。

  • これは良く出来た! --- 上手くできたこと、閃いたテストケースの書き方、美しくできた製品コード、など。
  • なにが問題だったか? --- テストケースを書くときに問題になったこと、また、その解決方法。
  • やり残したリファクタリング (もっともやっておきたいことを、ひとつだけ)