Entry

今読んでる本 - 『Working Effectively With Legacy Code』

2009年05月26日

ちょっと洋書を買い込んだので,届いた順から読んでます。まだ1/3くらいしか読んでないんですけど,これはかなりお勧め。

Working Effectively With Legacy Code
Michael C. Feathers
Prentice Hall
売り上げランキング: 4857
おすすめ度の平均: 5.0
5 設計が悪いシステムの保守でお悩みの方へ

本書は,ちとカテゴリ分けが難しいんですけれど,強いて分けると,プログラム保守と保守しやすいコードを書くための実践本といったところになりそうです。ソースコードに対して,機能追加,バグ修正,リファクタリング,最適化といった変更を加える際に必要なノウハウを,単体テスト(unit testing)を中心に解説しています。表題から内容が分かりづらいので,手に取る人が少なそうなのが残念。

まえがき(PREFACE)に本書の志向しているところが書かれていたので,ちと紹介しておきます。

Code without tests is bad code. It doesn't matter how well written it is; it doesn't matter how pretty or object-oriented or wel-encapsulated it is. With tests, we can change the behavior of our code quickly and verifiably. Without them, we really don't know if our code is getting better or worse.

(snip)

Teams take serious chances when they try to make large changes without tests. It is like doing aerial gymnastics without a net.

『Working Effectively With Legacy Code』(Michael C. Feathers,Prentice Hall,2004年,xvi)

ちょー訳しとく。

テストされていないコードはダメなコードです。よく書けているかは関係ありません。体裁良く書けていても,オブジェクト指向で書かれていても,よくカプセル化されていても,ダメはダメです。テストされているコードであれば,速く,しかも検証可能な形で挙動を変更することができます。テストされていないコードの場合,自分が変更したコードが良く転ぶのか悪く転ぶのか,まったく分かりません。

(略)

大きな変更をテストなしに行う場合,開発チームは大変な危険を引き受けることになります。安全ネットなしにアクロバット技(aerial gymnastics)をかますようなものです。

「aerial gymnastics」って,適当な訳語がないんだよな……日本語でエアリアルといったらスキーのアレになっちゃうし。そういえば,うちの新人さんはエアリアルかましまくってるんですけど,ちと注意した方がいいんだろうか……。

引用を元に本書の趣旨をもう一度説明すると,本書は結局のところ,「よくテストできるコードで機能追加等々をする方法」を説明しています。

この頃は(と言っても,ずいぶん前からだが)テスト駆動開発が普及して xUnit をはじめとしたテストツールがよく使われるようになりました。んなもんで,単体テスト自体は開発現場でも積極的に活用されています。けど,少し複雑なシステムを書いていると,「これどうやってテストするんだよ?」といったコードに出くわすこともあったりします。

例えば,テストターゲットのメソッドの引数が,ものすごく複雑かつ大きくて,しかも状態つきのオブジェクト(例えば,HttpServlet クラスのオブジェクトとか)だったりする場合。サーブレットの状態を,テスト用にいつも再現することは,不可能ではないものの非常に骨が折れる仕事になってしまいます。単体テストは,ちょろっとコマコマするテストなので,ちょっとしたアプリケーションができてしまうくらいのテストツールを作るわけにはいきません(テストにバグが入りやすくなってしまう)。こゆ場合,テストターゲットのメソッドがサーブレットの一部メンバを参照しているだけでも,そのメソッドをテストできなくなってしまいます。

本書では,上記のような場合でも,テストしやすくなるようにクラス間の依存性を低める方法や,インターフェイスを使ってモック(スタブ,ドライバ)を噛ませる方法なんかが具体例を交えて説明されています。これは非常に役に立つ。ちなみに,本書は,大体 Java で解説されていて,時々 C/C++/C# が使われています。

また,そもそも他人が書いた初見のコード(これが本書に言う legacy code)を分析して変更を加える箇所を見つける際の見つけ方についても,1章を割いて丁寧に説明しています。呼び出し関係の図の書き方なんかがある。

先日,新人さんの教育では,新規プログラムを作らせるよりも,既存のコードを改修させた方が効率がいいんじゃないだろうか,みたいなことを書いたんですけれど,本書はまさにそのお題です。自分の開発スタイルの改善だけじゃなくて,そっち方面にも活用してみようかと思っていたりします。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN