2014-05-11 2 views
3

메서드 시그니처의 논리에 enum을 사용합니까?

public enum EnumTest{ 
valueA, 
valueB 
} 

우리가 뭔가를 할 것입니다 소비자 호출이 열거의 현재 값을 기준으로하는 방법을 가정 한 후 수 있습니다 우리는 (데모를 위해서 사소한 예) 열거를 가정합니다. 이 일을하는 것이 낫다. 그것은

열거 형을 취하는 메서드가 있고이 열거 형의 값에 따라 동작을 수행합니다. ie

public void DoSomething(EnumTest emumVal){ 
//common code here  

switch(enumVal){ 

case EnumTest.valueA: doSomething(); 
         break; 
case EnumTest.valueB: doSomethingElse() 
         break; 
} 
} 

이것은 내가 조언을 구하는 사람들 사이에서 가장 좋아하는 방법 인 것처럼 보이지만 방법은 한 가지만하고 한 가지만 수행해야한다는 것을 알고 있습니다. 이 열거에 따라 약간 다른 일을 갖는 것은 더 열거 형이 다른 옵션을 열거 각각에 대해 명시 적 방법을 가질 것으로 보인다

를 추가하는 경우이 방법은 매우 크고 다루기가 될 수있는 가능성이 있다고 생각하는 나에게 잎 .ie

public void DoSomethingForValueA(){ 

} 

public void DoSomethingForValueB(){ 

} 

그러나 일부 동료 프로그래머는 과도하며 시간 낭비라고합니다.

나는 이런 식으로 올바른 방법이 무엇인지 궁금해하고 있었습니까?

답변

2

둘 다 정확합니다. 캡슐화와 SRP에 관심이 있다면 두 번째 페이지로 이동하십시오.

public void LogWarning() { Log(Severity.Warning); } 
public void LogError() { Log(Severity.Error); } 
private void Log(Severity severity) { ... }; 

첫 번째 것도 맞지만 열거 형이 커질 수 있으며 옵션을 기반으로 다른 방법을 호출하는 상황에 처하게됩니다. 몇 가지 옵션과 임원에게 몇 줄의 코드가 있다면 첫 번째 코드가 더 간결합니다.

API의 명확성에 따라 달라집니다. 매개 변수를 취하는 한 가지 방법은 매개 변수가없는 유사한 이름을 가진 10 가지 방법보다 분명히 더 간결합니다.

0

아니요. 각 메소드마다 별도의 클래스를 만들고 가상 호출을 사용하여 호출 할 메소드를 선택합니다. 뭔가 like this.

동일한 API를 통해 호출되지만 약간 다른 기능을하는 두 개의 알고리즘이있는 경우 가장 관용적 인 방법은 API를 정의하는 기본 클래스 또는 인터페이스를 만든 다음 구현하는 각 알고리즘에 대한 클래스를 만드는 것입니다 이 인터페이스. 새로운 알고리즘을 추가하기를 원한다면이 방법이 포함 된 클래스를 변경할 필요가 없으므로 새로운 클래스를 추가하기 만하면됩니다. 따라서 개방형 폐쇄 원칙을 준수해야합니다.

관련 문제