2017-02-16 4 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

이러한 시나리오를 리팩터링하는 방법은 여러 가지가 있습니다.

확실히 여기에서 상속을 고려해 볼 수 있습니다. 하지만 계층 구조가 얼마나 깊은 지에 따라 그리고 공통 코드를 공유하기 위해 계층 구조에서 도우미 클래스 나 중간 클래스를 만들어야하는지 여부에 따라 구성을 고려할 것입니다.

무엇이 #makeUp은 소녀의 유형에 따라 다르지만 어쩌면 구성 요소와 비슷한 방식으로 함께 조각 할 수있는 작은 단위의 코드 (구성 요소)를 만들 수있는 의미 상 유사점이있을 수 있습니다.

+0

감사합니다! 나는 구성을 들여다 보려고 노력할 것이다. –

1

type 속성을 기반으로 Girl에 대한 응용 프로그램에 다른 작업/스위치가 있는지에 따라 상속이 호출됩니다. 메이크업을()하고 해당 열거 형에 대한 바로 그 방법을 구현 - 그 유일한 스위치 인 경우

, 당신은

는 하나 개의 추상 메소드를 열거 소녀를 정의, 아래와 같이 할 수 있습니다.

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()); 

이것은 당신의 시도 리팩터링에 가깝게하는 것입니다하지만 의사 결정을 해결하지 않습니다. 아마도 올바른 메이크업 유형을 선택하는 데 도움이되는지도를 가질 수 있습니다.