TDD Boot Camp 札幌 2.0 のお題

2011.06.04に札幌で開催されるTDD Boot Camp 札幌 2.0用のお題です。主に参加者向けのエントリーですが、チャレンジしてみたい人はチャレンジしてみてください*1

概要

対象となるプログラムは「固定長バイナリファイルを扱うプログラム」です。図書館等の貸出システムを想定しており、書架の貸出状態を保持する簡易データベースになります。APIを用いてデータストア(バイナリファイル)にレコードの追加や保存を行います。

お題のポイント

プログラム自体は固定長バイナリファイルの仕様さえ理解できればそれほど複雑なモノではありません。しかし、これをユニットテストしよう、となると、一筋縄ではいかなかったりします。
このお題のポイントとしては、一見ユニットテストしずらいプログラムをどのようにしてユニットテストしていくか、にあります。

テスト駆動開発でチャレンジする

当然、テスト駆動開発でチャレンジします。今回も3〜4名で1チームとしましたので、お互いにアイディアを出し合いながら、テスト駆動開発を体験してください。

尚、テスト駆動開発を進めるにあたり、「作り直しコース」と「レガシーコード改善コース」の2つを選択できます。尚、テスト駆動開発ユニットテストに不慣れな場合は、作り直しコースの方が簡単かと思います。

作り直しコース
サンプルで示すコードはプロトタイプとして破棄し、ゼロから作り直してください。
しかし、残念なことにユーザは既にプロトタイプ版を利用しており、データベースファイルは作成されているので、プログラムの仕様は変更してはいけません

レガシーコード改善コース
サンプルで示すコードをそのまま使い、ユニットテストを追加しながら、元プログラムを改修していきます。まったく修正しない状態では、まともにユニットテストが書けませんので、色々と手を入れていく必要があるでしょう。

もし、物足りないと感じるのであれば、「レガシーコードのテストを書くまではレガシーコードを修正してはならない」という制約を課してみましょう。難易度は最高に高くなるはずです。

各言語のレガシーコード

サンプルコードはテストの無いコード、すなわちレガシーコードです。また、「ちょっと君、こんな感じの作ってみてくれないか?」と言われ数時間で作った代物なので、色々と問題も抱えています(いわば、プロトタイプです)。

以下に各言語でのレガシーコードを示します。Smalltalk版、Python版、Ruby版を作成していただいた id:sumim さんありがとうございます!
追記:maraigue(@h_hiro_)さんにC++版も作成して頂きました。

それではみなさまのチャレンジお待ちしております。

*1:トラックバックいただけると幸いです