2010-05-24 2 views
22

일부 값에 따라 일부 함수를 호출하는 파서를 작성하고 있습니다. 대리인이나 스위치가있는 사전?

switch(some_val) 
{ 
    case 0: 
     func0(); 
     break; 
    case 1: 
     func1(); 
     break; 
}  

또는 대의원이 같은 사전에

:

delegate void some_delegate(); 
Dictionary<int, some_delegate> some_dictionary = new Dictionary<int, some_delegate>(); 
some_dictionary[0] = func0; 
some_dictionary[1] = func1; 

some_dictionary[some_value].Invoke();  

이 두 가지 방법은 동일하고 선호

나는이 같은 간단한 스위치이 로직을 구현 할 수 있습니까?

답변

9

, 그들은 동일한있어 (I은 사전에 생각) : 특정 값이 해당 결과가있는 경우 모두 그냥 확인. 그러나 존재하지 않는 키에 액세스하려고하면 사전에서 범위를 벗어나는 예외를 throw합니다.

주로 재사용 가능성을 고려해야합니다. 이 지점 논리를 한 지점에서만 만들 필요가 있다면 스위치 케이스를 사용하는 것이 변수를 저장하는 것보다 더 적합 할 것입니다. 별도의 지점에서 반복적으로 액세스해야하는 경우에는 사전을 사용하여 switch 문을 반복해서 다시 붙여 넣지 않도록하십시오. 이니셜 라이저와 함께, 그것은 훨씬 더 콤팩트하고 읽을 수 있기 때문에

+4

잘라 내기 및 붙여 넣기 프로그래밍에 대한 구식 대안을 사용할 수도 있습니다. switch 문을 메서드에 넣습니다. –

2

둘 다 똑같습니다 (열쇠가 이력서에 표시되는지 확인해야합니다).

가독성 문제 일뿐입니다. 무엇이 가장 중요하게 보이는지, 코드를 읽는 사람들이 선호하는 것은 무엇입니까?

접근의 관점에서

+0

yuor 답변 주셔서 감사합니다. 이제 둘 다 똑같이됩니다. 다른 경우에는 질문이 의미가 없을 것입니다. –

11

난 강력하게, 사전 선택을 선호 :

var actions = new Dictionary<int, Action> 
{ 
    {1,() => Console.WriteLine("One!")}, 
    {2,() => Console.WriteLine("Two!")} 
} 

는 또한, 당신은 좀 더 유연성을을; 당신은 당신이하고있는 일에 따라 조건과 행동을 프로그램 적으로 추가 할 수 있습니다.

+0

속도는 어떻습니까? –

+7

스위치보다 느립니다. , 거기 조심하십시오; 조숙 한 최적화는 모든 악의 근원입니다. 좋은 디자인, 가독성 및 재즈에 대한 코드를 작성하고 속도가 너무 느린 경우에만 속도 부분에서 작업하십시오.속도 차이는 완전히 무시할 수 있지만 가독성의 차이는 실제적이고 분명합니다. –

+0

감사합니다.이 경우에는 시간이 너무 중요하지 않으므로 대표단과 함께 Dectionary를 사용합니다. –

6

팀의 일반적인 프로그래머가 내가 자주 다루는 프로그래머라면 가장 간단한 옵션, 즉 스위치를 사용해야합니다. 대표자들은 필요하지 않은 '똑똑한'솔루션을 좋아하는 것 같습니다.

+1

ccomet에 동의합니다. 스위치가 코드에서 한 번만 발생하면 가장 좋은 옵션이지만 2 개 이상의 메소드에서 중복되는 경우 사전이보다 명확한 접근 방식입니다. 불충분하거나 무관심한 프로그래머는 완전히 다른 문제입니다. 필자는 "최저 공통 분모"코드를 작성하는 것이 유익하지 않다고 생각합니다. 팀이 학습에 관심이 없다면 새로운 일자리를 얻으십시오. ;) –

+1

@Jacques 왜 switch 문을 양쪽 모두에서 호출되는 메서드로 리팩터링하지 않을까요? –

0

리소스 파일의 문자열을 전환해야하는 경우 (예 : 세계화 목적) 사전/위임 방법을 사용해야합니다.

4

필자는 필요에 따라 람다 식을 교체 할 수있는 사전 접근법을 좋아합니다. 이것은 프로그래머가 복잡한 의사 결정 트리를 사용하는 프로그램에 관련된 경우를 대비하여 도구 가방에 보관하는 위대한 트릭입니다. 런타임에 스위치 케이스 블록을 수정하는 것은 매우 다루기 힘들 것이므로 가장 좋은 대답은 람다와 관련이 있습니다.

한때 나는 switch 문을 동적으로 만들 필요가있는 상황이었습니다. 이 방법은 훨씬 더 읽기 쉬운 솔루션을 제공했습니다.