Hatena::ブログ(Diary)

yvsu pron. yas このページをアンテナに追加 RSSフィード

2008-03-28

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

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

404 Blog Not Found:「同じコード」の同じって何さ - TAPのススメ

テストは、どう考えても、「目的」ではなくて「手段」ですよ。

メンテ不能なスパゲティコードだけど、テスト完璧ってソースに修正を入れられますか。

テストパスしてしまえばどうコードしても構わない、というのがTDD」というのは、TDDをかなり狭く捉えているっていうか、誤解している。

TDDの元になっている(と思う)XPは、メンテナブルなコードを書くことを目指している(と思う)。じゃどうやってメンテナブルなコードを書くかという「設計手法」がTDDなわけです。

TDDテスト手法じゃない。設計手法です。テストって単語が入っていると、テストのためって誤解を生むので、最近は、BDD(Behavior Driven Development)という風に言い換えられてきているわけです。

メンテナブルなコードを書くってことが、一番重要だと思いますよ。

TDDPerlを除いていまいち普及してません。」ってのもあまり同意できない。Perl世界は知らないので、Perlで普及しているかはなんともいえないけど、それ以外が、普及していないってのは言いすぎでしょう。

追記:それでは、どうして、メンテナブルなコードを書くためにテストが必要なのか。「仕様の観点からテストを書く」、「テストクリアする必要最小限のコードを書く」ということを繰り返していくと、コードに重複が出てきたり、複雑化していきます。そうすると、必要最小限のコードを書くこともコストがかかるようになってくる。

追加・変更のコストをできるだけ少なくするために行うのが「リファクタリング」です。リファクタリングによって、コードの重複や複雑な部分が取り除かれ、メンテナブルなコードになる。

自信を持って、リファクタリングを行うには、自分の行った変更が、過去に作ったものを壊していないことを確かめるために必ずテストが必要になります。

メンテナブルなコードにするためには、リファクタリングが必要です。そして、リファクタリングを行うためには、テストが必要になります。テストを通していれば、どんなコードを書いてもかまわないということはありません。コードの重複や複雑さは、リファクタリングによって取り除かなければならないのです。

追記2:「最悪コードは書き直せばいい」は、暗黙的に、全部書き直してもかまわないという意味だと思いますが、リファクタリングの観点から言えば、これは、間違いです。書き直すときでも、一度に行う変更は、できるだけ少なくして、常にテストパスしている状態を保たなければいけない。

テストが通るなら、一度に全部書き換えても良いじゃんというのは、「少しテストを書いて少し実装する」というスタイルで開発してきたのと矛盾します。たくさん書くと、それだけ間違える可能性も増える。だから、「少し変更してテストパスさせる」ってことを何度も繰り返すのです。

どうしようもない状態からリファクタリングするのは、非常に大変です。ちょっとでも、不吉なにおいを感じたら、直ぐにリファクタリングしたほうがいい。リファクタリングを先に延ばしていいことは何もないと思います。

それは、一人で開発していようが、多くの人で開発していようが同じです。自分の書いたコードでも、ちょっと時間がたったら、直ぐに他人の書いたコードのように、中身を忘れてしまうから。

仮に記憶力のいい人であっても、良いプログラマなら、悪いところは、直ぐに直そうと思うはずです。気になるところをそのままにするのは、気分が落ち着かないから。

yuum3yuum3 2008/03/28 11:11 2007/10の Shibuya.pm でのアンケートでは(数値はだいたいです)
・テスト駆動開発なんて当たり前だよね? Yes は 7%
・ユニットテストを書くのは当たり前だよね? Yes は 32%

ぴっころ mkIIぴっころ mkII 2008/06/13 16:19 そのコードを使う人にとってはテストが重要。
そのコードを作る人にとってはメンテナブルが重要。

コードは使う人と作る人がいる、そういうことでは?
大抵、使う人の人数 > 作る人の人数なので
Test Driven Development =テスト駆動開発の考え方のベース
となっているのだと読みました。

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証