2025/09/05 14:00 The Key Points of Working Effectively with Legacy Code

やあ、ロボ子!今日はレガシーコードについて話すのじゃ。

レガシーコードですか、博士。なんだか難しそうな響きですね。

難しくないぞ!Michael Feathers先生によると、レガシーコードとは「テストのないコード」のことじゃ。

テストがない、ですか。それでは、どのように扱えば良いのでしょうか?

まずはテストを追加するのじゃ!そして、その後でコードを変更する。これが鉄則だぞ。

なるほど。でも、コードを変更する前にテストが必要で、テストを作るにはコードを変更する必要がある…というジレンマがありますね。

そう!そこで解決策じゃ!まず変更点(Seam)を見つける。次に依存関係を断ち切って、テストを作成!最後にコードを変更して、リファクタリングするのじゃ!

Seam…ですか?

Seamというのは、コードの振る舞いを変更するために、ソースコードを変更せずに済む場所のことじゃ。オブジェクト指向言語なら、オブジェクトがSeamになることが多いぞ。

オブジェクトがSeamになる、ですか。具体的にはどういうことでしょうか?

例えば、あるクラスのメソッドをオーバーライドしたり、インターフェースを実装した別のクラスを差し込んだりすることで、既存のコードを変更せずに振る舞いを変えることができるのじゃ。

なるほど!それから、ユニットテストも重要だと。

そうじゃ!ユニットテストは高速に実行される(1テストあたり100ms未満)必要があるぞ。あと、データベースとかネットワークとか、インフラに依存しちゃダメ。

インフラに依存しない、ですか。モックなどを使うということでしょうか?

その通り!そして、Characterizationテストも大事じゃ。これは、コードの実際の振る舞いを把握するためのテストなのじゃ。

Characterizationテスト…初めて聞きました。

要は、今のコードが何をするのかを記録して、それが変わらないように保証するテストじゃ。スナップショットみたいなものだと思えば良いぞ。

なるほど、現状維持のためのテストなのですね。

それから、Sprout & Wrapテクニックも便利じゃ。リファクタリングする時間がない時に、コードを追加するためのテクニックじゃ。

Sprout & Wrap…ですか?

Sproutは、新しいコードを別の場所に作って、テストしてから既存のコードから呼び出す方法じゃ。Wrapは、既存のメソッドをリネームして、新しいメソッドでそれをラップして、新しいロジックを追加する方法じゃ。

既存のコードを直接変更せずに済むんですね。

そうそう!あと、Scratch Refactoringもおすすめじゃ。これは、コードに慣れるために、変更を元に戻すことを前提に自由にコードを修正して理解を深める方法じゃ。

まるで実験みたいですね。

そして、ライブラリへの依存は避けるのじゃ!カスタムの抽象化層でラップすることで、将来的な変更やアップグレードに柔軟に対応できるようにするのじゃ。

なるほど、依存性を減らすことで、変更に強くなるんですね。

最後に、Michael Feathers先生の「Working Effectively with Legacy Code」は、レガシーコードに取り組むためのバイブルじゃ!ぜひ読んでみてくれ!

ありがとうございます、博士!早速読んでみます。

ところでロボ子、レガシーコードって、まるで化石みたいじゃない?

そうですね、博士。古い時代の技術が詰まっている、という意味では。

せやろ?でも、化石燃料と違って、レガシーコードは燃やしちゃダメだぞ!ちゃんとリファクタリングして、未来に繋げるのじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
