『テスト駆動開発』をRustで写経した

テストコード書けないので購入。

TDDとはなんぞやという話をコードを写経させることで身体に叩き込む、という本。
おれはRustに翻訳した。リポジトリはこれ

原著が発行された時代はオブジェクト指向が流行っていたのだろう、文中にやたらと「オブジェクト」という単語が飛び交っている。なので、頭の中では「オブジェクト」を「型」や「値」と読み替えていた(オブジェクト指向を主眼においた本では、「オブジェクト」という単語を「クラス型」という意味で使っているのか「~クラスのインスタンス」という意味で使っているのか読者が判断しなければならないような印象がある)。

Kent Beckのような凄腕プログラマが普段どういう風にコーディングしているか、その一端に触れることができる。
本書の主張の核は以下のような感じ。

  • TDDサイクル
    1. 小さいテストを1つ書く。
    2. すべてのテストを実行し、1つ失敗することを確認する。
    3. 小さい変更を行う。
    4. 再びテストを実行し、すべて成功することを確認する。
    5. リファクタリングを行い、重複を除去する。

後は、実装に時間がかかりそうな作業や実装予定のコード、テストなどは思いついたらその都度Todoリストに書き留めておく。頭の中に記憶しようとしてはいけない。どうせすぐ忘れるのだから。

第1部の実装言語はJava。通貨の為替レート換算を行うミニマムなプログラムを実装する。
意外なことに継承が多用されていて驚いた。たかが数十行のコードですらコールスタックを脳内でシミュレートできない。おれの頭が極端に悪いだけか?

第2部の実装言語はPython。おもちゃレベルのテスティングフレームワークを実装する。
リフレクション機能を使っていたのでこの際にproc-macroを学習しようとしたが、ムズすぎて撤退した。結局、ジェネリクスやらトレイトオブジェクトやらでお茶を濁した。
proc-macroの学習用リポジトリは以下。

反省点

本書のコードをRustに翻訳することに集中しすぎて、肝心のTDDを疎かにしてしまった気がする。最初は素直に本書で使われている言語で書けばよかったかもしれない。