かとじゅんの技術日誌

技術の話をするところ

テストファーストは設計手法

ご無沙汰しています。最近、アジャイルなプロジェクトに参加している関係もあり、テストファースト(別名、テスト駆動開発=TDD)をガチでやっています。
みなさん、テストファーストとか聞くと、「なーんだ、テストか。実装には興味あるけど、テストは興味ねー」いいそうですね。でも、そんなことないんですよ。テストを利用して、より良い設計や実装を目指すための手法です。


細かい実践方法はid:t-wadaさんのブログや記事に任せるとして、メリットは二つあると思っています。


まず1点目。実装コードを書けるのは、テストが失敗した後だけです。こうすることでインターフェイス*1を先に考えて設計し実装できるようになります。内部の実装から始めてしまうと、このインターフェイスを基軸とした設計ができずに、無用な複雑さを織り込む可能性がでてきます。つまり、本質的な設計に集中したいなら、まずはインターフェイス指向で考えて実装するべきだということです。


2点目としては実装したクラスはいつも自分だけが利用するとは限りません。仕事で開発するなら言うまでもありません。この場合は、実装者の視点が逆に仇になる場合があります。ビジネスと同じように顧客のニーズをつかんでいない商品が使いにくかったり、売れなかったりするのと同じように、コードも例外ではありません。コードも利用者の視点で設計と実装がなされなければ結局使いにくいものとなってしまいます。分かりやすくて、使いやすいインターフェイス設計を行うにはテストから考えるほうがよいのです。


そして、テストと関係が深いのはリファクタリングです。プロジェクトが忙しくなってくるとリファクタリングが置き去りになることが多いのですが、変更に対する柔軟性を保ちたければ積極的に実践しなければいけません。急がば回れでしょうか。後で大きなツケを払うのではなく、日々のテストファーストを行う中で少しずつでもリファクタリングを心がけたいところです。汚くて動かないコードは設計の最初のステップ。そして汚くて動くコードは成功への第一歩。そして、リファクタリングで綺麗で動くコードはシンプルで、わかりやすく、変更に強い構造への進化というところでしょうか。この黄金の回転は強い意志で実行してきたいところですッ!

*1:Javaのインターフェイスという意味ではなく、オブジェクトが持つ振る舞いの仕様を指します