Schalter / Gehäuse durch Muster ersetzen

8

Ich habe Code sehr ähnlich zu diesem Beispiel dreimal in einem Code hinter. Jedes Mal, wenn der Switch von einer Option, die an ihn gesendet wird, ausschaltet. Jeder Zeit der Code innerhalb des Falles ist genau das gleiche außer für einen Parameter basierend auf dem Fall. Verwendet einen Schalter / Fall und Methoden den besten Weg um dies zu tun? Sollte ich an etwas Designmuster denken, um die repetitive Switch / Case-Struktur zu vermeiden?

%Vor%     
Chris 01.12.2009, 22:05
quelle

7 Antworten

11

Compiler sind sehr gut darin, Switch / Case-Konstrukte zu optimieren; Die CLR wird es wahrscheinlich in eine Nachschlagetabelle oder etwas Ähnliches verwandeln, so dass das Hand-Rolling einer eigenen Version, wie Henk Holterman es vorschlägt, nicht das ist, was ich empfehlen würde. Die CLR kann bei der Auswahl des besten Algorithmus einen besseren Job machen als Sie.

Wenn es sich um ein Problem von Eleganz oder Wartungsfreundlichkeit handelt und Sie mehrere Schalter / Fälle über die gleiche Klasse verstreut haben, die ähnliche Funktionen ausführen, dann ist eine Möglichkeit, sie zu verbessern, die gesamte Funktionalität eines einzigen "Falls" zu kapseln eigene Klasseninstanz, so:

%Vor%

Dann in Ihrer Klasse / Kontrolle / Seite:

%Vor%

Danach können Sie Ereignisse und andere Methoden starten:

%Vor%

Natürlich ist dies nur ein nützliches Muster, wenn Sie mehrere dieser Schalter / Fälle haben, die Sie in einen umformen möchten. Wenn du nur einen Schalter / Fall hast, wirst du auf diese Weise viel mehr Code haben, also lass es in Ruhe!

Weitere Möglichkeiten zur Verbesserung der Wartbarkeit sind:

  • Ändern der Zeichenfolge in einen Enum-Typ (Optionsname mit Enum.Parse konvertieren);
  • Verschieben aller MyOption / GetOption-Elemente in eine eigene Klasse (wenn Sie mehrere Klassen / Steuerelemente / Seiten haben, die alle mit derselben Auswahl arbeiten müssen);
  • Fügen Sie der MyOption-Klasse einen Methoden-Delegaten hinzu, wenn Sie tatsächlich für jede eine andere Methode aufrufen müssen;
  • Lassen Sie Ihre DropDownList oder andere Steuerelemente nach Möglichkeit direkt auf die MyOption-Instanz verweisen.

Das ist es. Es ist einfach zu schreiben, es ist leicht zu verstehen, es ist einfach zu warten, es spart Ihnen Zeit, wenn Sie viele Switch / Case-Konstrukte haben, und es ermöglicht der CLR immer noch die bestmöglichen Optimierungen durchzuführen. Die einzigen Kosten sind die geringe Menge an Speicher, die benötigt wird, um diese schreibgeschützten Felder zu halten.

    
Aaronaught 01.12.2009, 22:56
quelle
10

Sie können eine Tabelle erstellen, um string in parameter value zu konvertieren.

%Vor%     
Henk Holterman 01.12.2009 22:09
quelle
3

Ich denke, ich würde die switch-Anweisung in eine separate Funktion verschieben und sie würde den Parameterwert für jeden Fall zurückgeben:

%Vor%

Dann können Sie Ihre Arbeitsmethode einfach einmal aufrufen:

%Vor%

Wenn Sie Ihre Arbeitsmethode nicht für die Standardursache ausführen möchten oder wenn Sie mehr als einen Parameterwert haben, können Sie die GetParameter-Methode ändern, um Ausgabeparameter zu verwenden:

%Vor%

Und nenne es so:

%Vor%     
Dr. Wily's Apprentice 01.12.2009 22:33
quelle
2

Der Schlüssel zu diesem Problem besteht darin, dass die in der dropDownList gespeicherten Objekte den Parameter bereitstellen (entweder direkt oder durch Indizierung in ein Array). Dann kann die switch-Anweisung vollständig entfernt werden.

Wenn der Parameter eine Eigenschaft des Objekts ist, das in der Dropdown-Liste angezeigt wird, liefert dies den Wert sehr effizient.

Wenn die Werte in der Dropdown-Liste einen numerischen Index in einem Array von Parameterwerten bereitstellen können, wird dies eine Reihe von String-Vergleichen in Bezug auf die Laufzeit-Effizienz übertreffen.

Jede dieser Optionen ist sauberer, kürzer und einfacher zu warten als das Einschalten einer Zeichenfolge.

    
Jeffrey L Whitledge 01.12.2009 22:13
quelle
1

Vielleicht eine Transformation von Option zum Methodenparameter?

Damit können Sie die switch-Anweisung löschen und die Methode einfach dem transformierten Parameter zuführen.

    
micahtan 01.12.2009 22:07
quelle
0

Das ist wahrscheinlich zu viel für das, was Sie tun, aber der Code könnte sauberer werden.

%Vor%

Dann wird der aufrufende Code ...

%Vor%

Wie ich schon sagte, ist das Overkill, wenn Sie nur einen Parameter setzen (im Prinzip setzen Sie eine Eigenschaft in der Basisklasse aus der Kindklasse). Aber wenn Ihre Logik komplexer ist, könnte dies eine praktikable Option für Sie sein.

    
Austin Salonen 01.12.2009 22:29
quelle
0

Hm, ich denke, dass eine sehr schnelle Lösung das Wörterbuch benutzt. Dictionary ist sehr schnell Struktur, wenn Sie einen Schlüssel verwenden - & gt; Wertlogik. Also, in Ihrem Fall können Sie das verwenden:

%Vor%

Danach können Sie Ihre Funktionen für ALPHA, BRAVA, ... erstellen

%Vor%

und schließlich eine Funktion zurückgeben:

%Vor%

Ich hoffe, es hilft.

    
Petr Tomášek 23.12.2016 17:57
quelle

Tags und Links