第4回Working Effectively With Legacy Code読書会参加

 先日、Working Effectively With Legacy Code読書会の第4回に参加させていただきました。
 毎度の繰り返しになりますが、読書会・懇親会とも、有意義な時間を楽しめました。開催者の方や場所を用意していただいた方には重ねて感謝するばかりです。

 今回は、量はないですが、19章の前半と14章の解説を担当させていただきました。

 担当を簡単にまとめると、14章「Dependencies on Libraries Are Killing Me」は、ライブラリの設計が、テストのしやすさにどのように影響を与えるかについての話でした。具体的には、ライブラリは提供する機能をフェイクオブジェクトに置き換えられるようにしましょう、それができないライブラリはラッピングして使いましょう、という内容です。

 フェイクのライブラリが使えれば、ライブラリ非依存部のコードを書き換えなしでテストできるようになるから、というのがその理由なんですが、普段C++を使っている身として、留意が必要だなと感じました。この章でも述べられていますが、C++はデフォルトでメソッドが非virtualで、そのままだとオーバーライドでフェイクに置き換えられなくなるためです。

 一方、19章「My Project Is Not Object Oriented. How Do I Make Safe Changes?」は、非OO言語、特にC言語で、どうコーディングすればうまくテストを書けるようになるか、という話です。具体的には、手続き型言語の場合での、テストしやすい関数構造や、コードを書き換えずにテストできるようにするテクニック等が紹介されていました。

 筆者はかなり極端なテスト至上主義者という印象は、読書会でも毎度のように言及されていましたが、直近の土俵内にあたるこの章を担当して、更にその実感が強まりました。正直なところ、この章の中盤からのテクニックは、ユニークというか、手を出すのに中々勇気のいるものですね。多用されている関数ポインタや奔放な#includeステートメントは、静的解析ツールやデバッガ(組み込みなら本末転倒ながらテストツールも加わってしまいます)が対応できない領域が多いため、導入は状況に合わせる必要がありそうです。

 あと今回は、日頃書くコードからテストを作りにくい、開発しながらじゃテストは中々書けない等々、テストの理想と現実のギャップに対する悩みが読書会の合間や懇親会などでちらほら出ていたのが印象的でした。参加者の方の一人がそれを「テストは憧れ」と形容していたのですが、低いレベルながらも同じく悩んでいる身として、的を得た表現だと感じました。