2011-08-24 1 views
21

일부 오래된 코드 (일부 여유 시간 있음)를 검토 중이며 다소 긴 switch 문을 발견했습니다.switch 문 대신 액션 사전 사용

private Dictionary<string, Action> createView 
    { 
     get 
     { 
      return new Dictionary<string, Action>() 
      { 
       {"Standard", CreateStudySummaryView}, 
       {"By Group", CreateStudySummaryByGroupView}, 
       {"By Group/Time", CreateViewGroupByHour} 
      }; 
     } 
    } 

당신이 좋은 연습을 고려 것인가, 또는 superflous 및 불필요한되는이 단순히 사건은 다음과 같습니다 인해 새로운 지식을 얻고, 나는 이후 다음과 같은 형태를 리팩토링했다? 저는 배운 새로운 기술을 보장하기 위해 열심히 노력하고 있습니다. 단지 그것을 위해서 영리하지 못하며 실제로 코드에 이점을 추가합니다.

감사합니다.

답변

15

긴 switch 문은 고전적인 악취이며 항상 리팩터링 대상입니다.

여기서 수행 할 "표준"단계는 Replace Conditional with Polymorphism입니다. 이것은 마틴 파울러 (Martin Fowler)의 저서 Refactoring (1999 년 11 년 전 발행)에 나와있는 단계 중 하나입니다.

이제는 객체와 같은 기능을 쉽게 처리 할 수있게되었습니다 (예 : 작업). 이것은 좋은 해결책 일 수도 있습니다.

아니, 나는 당신이 그것을 위해서 영리하다고 생각하지 않는다. 앞으로 다른 옵션을 추가하고 싶다면 무엇을해야하는지 쉽게 알 수 있습니다.

+0

+1 링크를 제공해 주셔서 감사합니다. 전에 리팩토링 카탈로그를 보지 못했습니다. –

2

일단 코드를 작성하면 코드가 너무 많이 변경되지 않으므로 switch과 관련이 있습니다. 표면적으로 당신의 사전 접근 방식은 더 역동적 인 것에 잘 적응합니다. 그것은 더 많은 요구 사항을 기반으로합니다.

이 방법을 사용하여 코드를 스위치로 바꾸는 방법은 대부분 개인적으로하지 않습니다. 내 솔직한 의견은 단지 그것을 위해서 영리한 것이지만 여전히 쉽게 유지할 수 있다는 것입니다. 내가 본 것처럼 모범 사례에 대한 개인적인 취향이 가장 큰 요소입니다.

다른 한편으로 다른 사람들이 말했듯이, 이것은 긴 switch 문에 대한 실행 가능한 해결책이 될 수 있습니다. 그런 다음 다시 Strategy Pattern과 같은 것이 행동 변화를 지원하는 좋은 방법이 될 것입니다.

7

앱에 따라 항상 새 사전 객체를 생성하지 않아도되지만 클래스 멤버처럼 선언하고 처음 액세스 할 때 초기화하고 항상 같은 인스턴스를 반환합니다. 그러나 그것이 실제로 당신의 필요에 부합하는지 말하기는 어렵습니다. 이 같이 내가

public class MyClass 
{ 
    Dictionary<string, Action> dict = null; 

    private Dictionary<string, Action> createView 
    { 
     get 
     { 
      if(dict == null) 
      { 
       dict = new Dictionary<string, Action>() 
       { 
       {"Standard", CreateStudySummaryView}, 
       {"By Group", CreateStudySummaryByGroupView}, 
       {"By Group/Time", CreateViewGroupByHour} 
       }; 
      } 

      return dict; 
     } 
    } 

} 

편집보기 개념 관점에서

의미 나 사전 TryGetValueswicth/case를 교체하는 것은 꽤 좋은 솔루션입니다. 이 도움이

희망 ...

5

이 방법은 우수합니다.

Action 이상으로 사용합니다. 필터와 셀렉터에도 효과적입니다. 예 :

var filters = new Dictionary<string, Func<MyEntity, bool>>() 
{ 
    // ... 
}; 

var query = entities.Where(filters["X"]); 
+0

좋은 접근 방법이기도합니다. 언어의 기초를 배웠으니 이제는 복잡한 부분에 대해 더 배우는 것이 훨씬 편안해졌습니다. 그리고이 작은 트릭을 발견하는 것은 재미 있습니다. :) –