コードを書いていきどんどん機能を追加していくと、ひとつのクラス階層がいろんな仕事をすることになってしまうことがある。このようなときは継承を分割し、委譲を使って整理する。
手順
- ・元のクラス階層での仕事を列挙
- ・移動する仕事を決定
- ・移動する仕事のクラスを作成
- ・元のクラス階層からクラスを抽出
- ・委譲するフィールドを作成
- ・元のクラス階層のサブクラスに対応して、新しいクラスのサブクラスを作成
- ・元のサブクラスから新しいサブクラスへメソッドを移動
- ・サブクラスからメソッドがなくなったら、サブクラスを削除
- ・サブクラスで重複していたメソッドやフィールドをスーパークラスへ引き上げる
いままで勉強してきたリファクタリングに比べると結構変更することが多く、大掛かりなもの。
まず今のクラス階層がどのような仕事をしているのかしっかりと把握して、どれを移動するのか判断しなくてはならない。図や表を書いて分かりやすくするとよいだろう。
クラスを分割するという点ではデザインパターンのBridgeパターンともいえる。(id:toburau:20070812)
とにかく継承は最後の手段と考え、本当に継承の必要があるのか、それはもっと機能を分割できないかなど普段から意識しながらコードを書いていく必要があるだろう。