2017-02-16 10 views
1

リファクタリングが必要なアプリケーションを継承しました。以下は私に頭痛を与えている。元のソースコードは、次のようにあまりにも多くのスイッチの例があります。スイッチケースが多すぎるリファクタリングコード

class Girl { 
    //... 
    void traditionalMakeUp() { 
     switch (type) { 
      case FRENCH: 
       frenchMakeUp(); 
       break; 
      case AFRICAN: 
       africanMakeUp; 
       break; 
      case NORWEGIAN: 
       norwegianMakeUp(); 
       ..... 

      case KOREAN: 
       koreanMakeUp(); 
       ..... 
     } 
    } 
} 

私はこのようにそれをリファクタリングしようとしています:

abstract class Girl { 
    //... 
    abstract void makeUp(); 
} 

class French extends Girl { 
    void makeUp() { 
     // makeUP 
    } 
} 
class African extends Girl { 
    void makeUp() { 
     // makeUP 
    } 
} 
class Norwegian extends Girl { 
    void makeUp() { 
     // makeUP 
    } 
} 

// Somewhere in client code 
girl.makeUp(); 

それはそれを行うための正しい方法ですか?私のスイッチに20以上のケースがない場合、戦略パターンは問題ありません。

さらに、私は戦略デザインパターンに合うように20以上のクラスを追加することを嫌っています。それをリファクタリングする別の良い方法がありますか?

+0

それぞれの変種 'makeUp()'メソッドは何をしますか? – Naros

+0

@Naros makeUp()は国籍によって異なります。ノルウェー語のmakeUp()ロジックはフランス語などのmakeUp()ロジックとはまったく異なります。 –

+0

スイッチのケース数は多かれ少なかれ固定されているか、あるいは成長する可能性はありますか? 'makeUp()'メソッドの平均コード行は何ですか? 'makeUp()'メソッドは他のクラスにも依存していますか、それとも完全に独立したコードですか? –

答えて

1

このようなシナリオをリファクタリングする方法は複数あります。

ここでは継承は確かに一つの選択肢です。しかし、階層の深さや、共通コードを共有するために階層内にヘルパークラスや中間クラスを作成する必要があるかどうかによって、構成を検討します。

女の子の種類によって何が異なるのでしょうが、おそらくコンポーネントのような小さな要素を組み立てることができる意味的類似点があります。

+0

ありがとう!私は構図を調べようとします。 –

1

typeに基づいてGirlのアプリケーションに他の操作/スイッチが存在するかどうかに応じて、ここで継承が呼び出されます。

それが唯一のスイッチである場合、あなたは以下のように行うことができ、

は、1つの抽象メソッドを列挙ガールの定義 - (メイクアップ)し、その列挙型のために右がそのメソッドを実装します。

public enum Girl { 

    FRENCH { 
     public void makeUp() { 
      Utility.frenchMakeUP(); 
     } 
    }, 

    AFRICAN { 
     public void makeUp() { 
      Utility.africanMakeUP(); 
     } 
    }, 

    NORWEGIAN { 
     public void makeUp() { 
      Utility.norwegianMakeUP(); 
     } 
    }, 

    KOREAN { 
     public void makeUp() { 
      Utility.koreanMakeUP(); 
     } 
    }; 

    public abstract void makeUp(); 

} 

ユーティリティクラスは次のようになります。

public class Utility { 

    public static void frenchMakeUP() { 

    } 

    public static void africanMakeUP() { 

    } 

    public static void norwegianMakeUP() { 

    } 

    public static void koreanMakeUP() { 

    } 

} 

クライアントコード

Girl girl = Girl.FRENCH; 
girl.makeUp(); 

あなたはさらに整理することができますどのように多くの機能が存在し、どのようにmakeUp()にしてから、共通の機能、すなわちコール、Utility.koreanMakeUP()を組み合わせることに応じて、複数のユーティリティクラスを整理することができます。

0

ここでは女の子のための構成とメイクのための継承をしたいと思います。あなたのドメインに応じて、フランスの女の子がアフリカのメイクを着ることは大丈夫かもしれません。女の子にMakeUp型のオブジェクトが含まれていますか?クライアントコードで

public class FrenchMakeUp extends MakeUp 
{ 
    @Override 
    public void apply(){...} 
} 

public class Girl 
{ 
    public void makeUp(MakeUp makeUp) 
    { 
     makeUp.apply(); 
    } 
} 

girl.makeUp(new FrenchMakeUp()); 

これはあなたの未遂リファクタリングに近いことであるが、それは意思決定を解決しない

それから私のような何かをするだろう。おそらく、正しいメークアップタイプを選択するのに役立つマップを持つことができます。