この文書はCode Health: Eliminate YAGNI Smellsの翻訳です。
ソフトウェア開発の主なコストは保守にある。 保守コストを下げるひとつの方法は、実際に必要になるまで実装しないというもので、これはYAGNI (You Aren't Gonna Need It, そんなの必要ないって)原則として知られている。 不要なコードをどうやって見つければよいだろうか?
コードの臭い とはデザイン上の欠陥を大抵の場合、示すコードパターンのことです。例えば、基底クラスやインタフェースをサブクラスが1つしかなくても作るのは、より多くのサブクラスがこの先、必要となると見越してのことだろう。しかし、そうせずに反復型開発とデザインを実践しよう: そのサブクラスは本当に必要になるまで追加しないで。
次のC++コードは多くのYAGNIの匂いがする
class Mammal { ...
virtual Status Sleep(bool hibernate) = 0;
};
class Human : public Mammal { ...
virtual Status Sleep(bool hibernate) {
age += hibernate ? kSevenMonths : kSevenHours;
return OK;
}
};
一つのクラスだけしか実際には必要ないにも関わらず、メンテナーは両方のクラスを理解し、ドキュメント化し、テストする責任がある。コードはhibernate(冬眠)がtrueの場合を処理しなくてはならないが、実際にはすべての呼び出しではfalseである。また、Sleepは(Status型が返り値であるため)エラーを返すかもしれないが、実際にはそれは起きない。これにより決して実行されない不要なコードを生む。こういった匂いを消し去ることはコードを簡単にする:
class Human { ...
void Sleep() { age += kSevenHours; }
};
さらに他のYAGNIの匂い
- コードがテストからしか実行されない。(コードはdead on arrivalともいわれる1)
- クラスがサブクラスを持つようにデザインされている(仮想メソッド、protectedメンバーなどを持つ)が、実際にはサブクラスを持たない。
- publicやprotectedのメソッドやフィールドだが、privateにできる
- パラメータや変数やフラグが常に同じ値をとっている
ありがたいことに、YAGNIの匂い(および一般的なコードの匂い)は単純なパターンを探すだけで見つかることが多く、単純なリファクタリングによって消すことができる。
今日使われないコードを追加しようと考えている?信じてほしい、そんなの必要ないって!
-
はじめて聞きました。 ↩