2009-07-14 4 views
3

스위치 논리를 다시 사용하는 가장 좋은 방법은 무엇입니까? 내 코드에 계속 나타나는 switch 문이 있습니다. 오히려 붙여 넣기 복사하십시오. 다른 대리자를 호출하고 이러한 대리자를 매개 변수로 전달하는 함수를 만들고 싶습니다.스위치 문 논리 다시 사용

더 좋은 방법이 있습니까?

기능 1 :

switch (test) 
     { 
      case "x": 
       DoSomethingX(); 
       break; 
      case "y": 
       DoSomethingY(); 
       break; 
      case "z": 
       DoSomethingZ(); 
       break; 
     } 

기능 2 :

switch (test) 
    { 
     case "x": 
      DoSomethingXxxx(); 
      break; 
     case "y": 
      DoSomethingYyyy(); 
      break; 
     case "z": 
      DoSomethingZyyy(); 
      break; 
    } 
+0

도움이 필요한 정보를 더 제공해야합니다. 스위치의 어느 부분이 불변인가? 사례 자체 또는 행동뿐입니까? 전환하는 변수는 무엇입니까? 변수가 같거나 다양합니까? –

+0

사건이 변하지 않는다고 말하는 것처럼 들리지만 행동은 바뀌지 만 ... 자세한 내용이 필요합니다. – Dave

+0

사례가 동일하게 변경되지 않음 – zachary

답변

9

당신은 또한 사전 (또는 대신 액션의 Func을) 또는 같은 것을 가질 수있다 (당신의 기능이 유사한 서명이 고려) .

public class MyClass 
{ 
    Dictionary<string, Action> myDictionary; 

    public MyClass() 
    { 
     BuildMyDictionary(); 
    } 

    private Dictionary<int, Action<int, int>> BuildMyDictionary() 
    { 
     myDictionary.Add("x", DoSomethingX); 
     myDictionary.Add("y", DoSomethingY); 
     myDictionary.Add("z", DoSomethingZ); 
     myDictionary.Add("w", DoSomethingW); 
    } 


    public void DoStuff() 
    { 
     string whatever = "x"; //Get it from wherever 
     //instead of switch 
     myDictionary[t](); 
    } 
} 

내가 비슷한 예와 비슷한 질문 here 대답 : 그럼 당신은 대신 스위치를 사용하여, 당신은 뭔가를 할 수있다.

또한 switch 문에서 문자열 대신 enums를 사용해보십시오.

+0

+1 코드 표 18의 표 구동 메소드 ch.18에 대해 –

4

인터페이스 및 인터페이스의 여러 구현을 사용하여 리팩터링 할 수 있는지 확인하십시오. 나는 당신의 질문을 이해하려고 노력으로

public interface Test { 
    void DoSomething(); 
} 

public class TestX : Test { 
    void DoSomething() { 
    } 
} 

public class TestY : Test { 
    void DoSomething() { 
    } 
} 

public class TestZ : Test { 
    void DoSomething() { 
    } 
} 


void func(Test test) { 
    test.DoSomething(); 
} 
+1

* 한숨 * 당신은 저를 이겼습니다! 거의 완료되었다 : p – Svish

+0

미안 @ 스바 이쉬, 다음 번에 나를 이길거야. 전에 일어난 일입니다. :) –

0

, 나는 다음에 갈 수 있습니다

public enum Test{ 
    X, Y, Z 
} 

/** 
* test function call 
* @a_Test - enumeration class for Test 
*/ 
public void test(Test a_Test){ 
switch(a_Test){ 
    case X: 
     x(); 
     break; 
    case Y: 
     y(); 
     break; 
    case Z: 
     z(); 
     break; 
}//switch 
}//test 

나는 그것이 도움이되기를 바랍니다.

호랑이