内容
継承の取り扱い
リファクタリング名 | 対象 | 対応 |
---|---|---|
フィールドの引き上げ | 2つのサブクラスが同じフィールドを持っている。 | そのフィールドをスーパークラスに移動する。 |
メソッドの引き上げ | どのサブクラスでも同じ結果になるメソッドがある。 | メソッドをスーパークラスに移す。 |
コンストラクタ本体の引き上げ | 複数のサブクラスに内容がほとんど同一のコンストラクタがある。 | スーパークラスのコンストラクタを作成して、サブクラスから呼び出す。 |
メソッドの引き下げ | スーパークラスのふるまいが、一部のサブクラスでしか使われない。 | メソッドをサブクラスに移す。 |
フィールドの引き下げ | スーパークラスのふるまいが、一部のサブクラスでしか使われない。 | フィールドをサブクラスに移す。 |
サブクラスの抽出 | クラスが一部のインスタンスだけしか使わないメンバを持っている。 | それらのメンバのためにサブクラスを作る。 |
スーパークラスの抽出 | 同じような機能を持つ2つのクラスがある。 | 片方のクラスをスーパークラスにして、共通するメンバをスーパークラスに移す。 |
インタフェースの抽出 | 複数のクライアントが、あるクラスのひとまとまりのインタフェースを使っている。または2つのクラス間でインタフェースの一部が共通である | その共通部分をインタフェースとして抽出する |
階層の平坦化 | スーパークラスとサブクラス(またはモジュールとそのモジュールをインクルードするクラス)に大差がない | 両者を1つに統合する |
Template Methodの形成 | サブクラスがスーパークラスのインターフェイスの一部しか使っていない、あるいはデータの継承を望まない | スーパークラスのためのフィールドを作り、スーパークラスに処理を委譲するようにメソッドを調整してから、継承構造を解消する |
委譲による継承の置き換え | サブクラスがスーパークラスの一部のインターフェースだけを使っている。あるいはデータを継承したくない | スーパークラス用のフィ0ルドを作成して、メソッドをスーパークラスに委譲するように変更し、継承をやめる |
継承による委譲の置き換え | 委譲を使っているが、インターフェイス全体のために多数の委譲メソッドを書いている | 委譲先のクラスをモジュールにして、委譲元のクラスでインクルードする |