時間がないときの機能追加(スプラウト/ラップ)
時間がないときは既存のソースにリファクタリングを行わずに機能追加をする。
その時に以下の二点を気をつける
- 既存ソースにテストを書けなくても新しいコードにはテストを書く
- 既存のソースの変更は最小限にとどめる
後述の方法で実現する
スプラウトメソッド
変更箇所を丸々メソッドとして作成し、既存箇所からはメソッド呼び出しのみにし、 既存箇所に入れる変更を最小にする。
テストコードのない既存箇所にロジックを入れてしまうと、変更箇所のテストが難しい。 ひとまず新しく作る箇所だけはテストで保護する。
これ以上レガシーコード(=テストのないコード)を増やさない工夫ともいえる。
ラップメソッド
変更箇所の前後に処理を入れないといけない場合、 新規のメソッドで既存処理をラップし、新規のメソッド内、かつ既存のメソッド外に処理を書く。 既存の処理の中身は極力触らない。
臭いものには蓋、という工夫ともいえる。
スプラウトクラス/ラップクラス
メソッドでやったことを同じようにクラスでも行う。
- スプラウトクラス:変更箇所を新規クラスとして用意し、既存クラスからは呼び出し箇所だけを変更することにより、変更箇所を最小にする。
- ラップクラス:既存のクラスを拡張したサブクラス上スーパークラスのインスタンスをもたせた上で新規処理を書く
ちなみにラップクラスはデザインパターンのDecoreterと同一である。
デメリット
両者とも自体を悪化させることはなくても 既存コードの質は一切よくならない。 今は時間がないから仕方ないのだろうが、 既存コードのリファクタリングはどこかで時間を用意して計画的にやるべきだ。
所感
これ以上悪くしない。少しでも前進する
〜メソッドの方は普通にプログラミングをやっていれば思いつくと思う。(同じようなソースを何度か実装したことがある) クラスの方は微妙。私にオブジェクト指向のセンスがないのかもしれない。 デザインパターンだけではなく、リファクタリングパターン的なものを極める世界もありそうだ。