2009-07-14 12 views
3

Was ist der beste Weg zur Wiederverwendung von Switch-Logik. Ich habe diese switch-Anweisung, die immer in meinem Code erscheint. Anstatt es dann einzufügen, möchte ich eine Funktion erstellen, die andere Delegaten anruft und diese Delegierten als Parameter weitergibt.Wiederverwendung von Switch-Anweisungslogik

Oder gibt es einen besseren Weg?

Funktion 1:

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

Funktion 2:

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

Sie benötigen weitere Informationen für uns zu helfen. Welche Teile des Schalters sind invariant? Nur die Fälle selbst oder die Aktionen? Was ist mit der Variable, die du anschaltest, ist das die gleiche oder variiert sie? –

+0

Es hört sich an, als würde er sagen, dass die Fälle invariant sind, aber die Aktionen ändern sich ... aber ja, wir brauchen mehr Details. – Dave

+0

die Fälle bleiben gleich, die Aktionen ändern sich – zachary

Antwort

9

Sie könnten auch ein Wörterbuch (oder Func statt Aktion) oder so ähnlich (unter Berücksichtigung Ihrer Funktionen eine ähnliche Signatur) . Dann könnten Sie stattdessen einen Schalter zu verwenden, können Sie so etwas wie haben:

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

antwortete ich eine ähnliche Frage here mit einem ähnlichen Beispiel.

Versuchen Sie auch, enums anstelle von Zeichenfolgen in Ihrer switch-Anweisung zu verwenden.

+0

+1 für Table-driven Methoden ch.18 of Code Complete –

4

Sehen Sie, wenn Sie dies über eine Schnittstelle und verschiedene Implementierungen der Schnittstelle umgestalten können.

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

* seufz * Du hast mich dazu geschlagen! War fast schon fertig: p – Svish

+0

Sorry @Swish, ich bin mir sicher, dass du mich das nächste Mal schlagen wirst. Es ist schon einmal passiert. :) –

0

Wie ich versuchen, Ihre Frage zu verstehen, möchte ich auf folgendes gehen:

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 

Ich hoffe, es hilft.

Tiger