generated at
スプラウトメソッド
>新緑の再誕



c#
public void Damage(int damage){ this.hp -= damage; if(this.hp <= 0){ this.alive = false; } }

みたいなDamageメソッドがあるとして、ここに
「ダメージが1000以下だったら無効化するバリアー処理を追加して」
と要望が来たときにどうするか

愚直にやると
c#
public void Damage(int damage){ if(damage <= 1000){ // 無効化処理 return; } this.hp -= damage; if(this.hp <= 0){ this.alive = false; } }

と、メソッドの中に処理を追加しがち。
この場合、無効化処理の単体テストがDamageメソッドのテストにもなっている。

レガシーコード改善ガイドでは、既存メソッドの中に処理をそのまま追加することは良くない兆候でもあると述べている。

スプラウトメソッドでは、そのまま処理を追加するのではなく、メソッドをスプラウト(発芽)する
c#
public void Damage(int damage){ // スプラウトメソッド Barrier(damage); this.hp -= damage; if(this.hp <= 0){ this.alive = false; } }

こうすることで、新しいコードのBarrier メソッドは単体テスト実行できる。


スプラウトメソッドの長所と短所
長所
古いコードと新しいコードを明確に区別できるようになる
新しいコードはテストで保護できるようになる
短所
元のコードに愛想をつかしたと言っているようなもの
元のコードはテストで保護されないまま