Ich arbeite an einem Projekt, das Anforderungen verarbeitet, und die Anforderung besteht aus zwei Komponenten: dem Befehl und den Parametern. Der Handler für jeden Befehl ist sehr einfach (<10 Zeilen, oft <5). Es gibt mindestens 20 Befehle und wahrscheinlich mehr als 50.
Ich habe ein paar Lösungen gefunden:
- ein großer Schalter / wenn-sonst auf Befehlen
- Zuordnung von Befehlen zu Funktionen
- Zuordnung von Befehlen zu statischen Klassen / Singletons
Jeder Befehl führt eine kleine Fehlerprüfung durch, und das einzige Bit, das herausgezogen werden kann, ist die Prüfung der Anzahl von Parametern, die für jeden Befehl definiert sind.
Was wäre die beste Lösung für dieses Problem und warum? Ich bin auch offen für alle Designmuster, die ich möglicherweise verpasst habe.
Ich habe mir für jedes die folgende Pro / Contra-Liste ausgedacht:
Schalter
- Profis
- behält alle Befehle in einer Funktion; Da sie einfach sind, handelt es sich um eine visuelle Nachschlagetabelle
- Sie müssen den Quellcode nicht mit Tonnen kleiner Funktionen / Klassen überladen, die nur an einem Ort verwendet werden
- Nachteile
- sehr lang
- Schwer programmgesteuert Befehle hinzuzufügen (Verkettung mit Standard-Groß- / Kleinschreibung erforderlich)
Kartenbefehle -> Funktion
- Profis
- kleine, mundgerechte Stücke
- Kann Befehle programmgesteuert hinzufügen / entfernen
- Nachteile
- Wenn dies in Reihe erfolgt, entspricht dies optisch dem Schalter
- Wenn nicht direkt ausgeführt, werden viele Funktionen nur an einem Ort verwendet
Kartenbefehle -> statische Klasse / Singleton
- Profis
- kann mit Polymorphismus einfache Fehlerüberprüfungen durchführen (nur wie 3 Zeilen, aber immer noch)
- ähnliche vorteile wie map -> function solution
- Nachteile
- Viele sehr kleine Klassen werden Projekt überladen
- Implementierung nicht alle am selben Ort, daher ist es nicht so einfach, Implementierungen zu scannen
Zusätzliche Hinweise:
Ich schreibe dies in Go, glaube aber nicht, dass die Lösung sprachspezifisch ist. Ich suche nach einer allgemeineren Lösung, weil ich in anderen Sprachen möglicherweise etwas sehr Ähnliches tun muss.
Ein Befehl ist eine Zeichenfolge, aber ich kann dies bei Bedarf problemlos einer Zahl zuordnen. Die Funktionssignatur ist so etwas wie:
Reply Command(List<String> params)
Go hat Funktionen der obersten Ebene, und andere Plattformen, die ich in Betracht ziehe, haben Funktionen der obersten Ebene, daher der Unterschied zwischen der zweiten und der dritten Option.