ひがやすを技術ブログ

電通国際情報サービスのプログラマ

メンテナブルなコードよりもテストが重要っておかしくない?

その意味で、実はコーディング規約より、メンテナブルなコードよりも役に立つのが、テスト。要はテストをパスしてしまえばどうコードしても構わない、というのがTDD = Test Driven Development =テスト駆動開発の考え方のベースとなっています。

テストは、どう考えても、「目的」ではなくて「手段」ですよ。
メンテ不能なスパゲティコードだけど、テストは完璧ってソースに修正を入れられますか。
「テストをパスしてしまえばどうコードしても構わない、というのがTDD」というのは、TDDをかなり狭く捉えているっていうか、誤解している。
TDDの元になっている(と思う)XPは、メンテナブルなコードを書くことを目指している(と思う)。じゃどうやってメンテナブルなコードを書くかという「設計手法」がTDDなわけです。
TDDはテスト手法じゃない。設計手法です。テストって単語が入っていると、テストのためって誤解を生むので、最近は、BDD(Behavior Driven Development)という風に言い換えられてきているわけです。
メンテナブルなコードを書くってことが、一番重要だと思いますよ。
「TDD、Perlを除いていまいち普及してません。」ってのもあまり同意できない。Perlの世界は知らないので、Perlで普及しているかはなんともいえないけど、それ以外が、普及していないってのは言いすぎでしょう。
追記:それでは、どうして、メンテナブルなコードを書くためにテストが必要なのか。「仕様の観点からテストを書く」、「テストをクリアする必要最小限のコードを書く」ということを繰り返していくと、コードに重複が出てきたり、複雑化していきます。そうすると、必要最小限のコードを書くこともコストがかかるようになってくる。
追加・変更のコストをできるだけ少なくするために行うのが「リファクタリング」です。リファクタリングによって、コードの重複や複雑な部分が取り除かれ、メンテナブルなコードになる。
自信を持って、リファクタリングを行うには、自分の行った変更が、過去に作ったものを壊していないことを確かめるために必ずテストが必要になります。
メンテナブルなコードにするためには、リファクタリングが必要です。そして、リファクタリングを行うためには、テストが必要になります。テストを通していれば、どんなコードを書いてもかまわないということはありません。コードの重複や複雑さは、リファクタリングによって取り除かなければならないのです。
追記2:「最悪コードは書き直せばいい」は、暗黙的に、全部書き直してもかまわないという意味だと思いますが、リファクタリングの観点から言えば、これは、間違いです。書き直すときでも、一度に行う変更は、できるだけ少なくして、常にテストをパスしている状態を保たなければいけない。
テストが通るなら、一度に全部書き換えても良いじゃんというのは、「少しテストを書いて少し実装する」というスタイルで開発してきたのと矛盾します。たくさん書くと、それだけ間違える可能性も増える。だから、「少し変更してテストをパスさせる」ってことを何度も繰り返すのです。
どうしようもない状態からリファクタリングするのは、非常に大変です。ちょっとでも、不吉なにおいを感じたら、直ぐにリファクタリングしたほうがいい。リファクタリングを先に延ばしていいことは何もないと思います。
それは、一人で開発していようが、多くの人で開発していようが同じです。自分の書いたコードでも、ちょっと時間がたったら、直ぐに他人の書いたコードのように、中身を忘れてしまうから。
仮に記憶力のいい人であっても、良いプログラマなら、悪いところは、直ぐに直そうと思うはずです。気になるところをそのままにするのは、気分が落ち着かないから。