Wie könnte ich diesen C ++ Code verbessern?

8

Ich möchte Ihren Vorschlag für den folgenden Pseudo-Code. Bitte schlagen Sie vor, wie ich es verbessern könnte, ob ich einige Entwurfsmuster verwenden könnte oder nicht.

%Vor%

Ich hoffe, Sie verstehen es. Die Sache ist, ich habe eine große Anzahl von IDs und jeder hat seine eigenen Operationen , und ich denke, es ist ein bisschen hässlich, 10 Bildschirme mit viel zu haben if's und else if's .

    
Geo 27.10.2008, 08:41
quelle

8 Antworten

14

Halten Sie für jede ID eine Klasse bereit, die eine gemeinsame Schnittstelle implementiert. Grundsätzlich das Strategie-Muster IIRC.

Sie würden also (Pseudo-) Code wie:

nennen

StrategyFactory.GetStrategy(tokens[0]).parse(tokens[1..n])

    
Epaga 27.10.2008, 08:43
quelle
8

Schreiben Sie zuerst die Syntax Ihrer Unterstützung auf und schreiben Sie dann den Code, um ihn zu unterstützen.

Das Verwenden der BNF-Notation ist großartig dafür. Und die Verwendung der Spirit-Bibliothek für den Code-Teil ist ziemlich einfach.

%Vor%

Dies kann leicht in einen Spirit-Parser übersetzt werden. Jede Produktionsregel würde ein Einzeiler werden, jedes Endsymbol würde in eine Funktion übersetzt werden.

%Vor%     
xtofl 27.10.2008 11:09
quelle
4

Sie können sich "Table Driven Methods" ansehen (wie in "Code Complete", 2. Auflage, Kapitel 18 beschrieben). Ich denke, das ist was Cheery beschreibt. Ein Vorteil davon ist die einfache Erweiterbarkeit. Sie müssen nur einige Einträge zur Tabelle hinzufügen. Diese Tabelle könnte fest codiert oder sogar zur Laufzeit geladen werden.

Ähnlich wie Epagas Vorschlag können Sie auch versuchen Löse dies über Polymorphismus, indem du spezialisierte Klassen Aktionen für die verschiedenen Fälle ausführst. Der Nachteil hier ist, dass Sie neue Klassen im Falle von Änderungen schreiben müssen.

    
foraidt 27.10.2008 09:00
quelle
2

Sie möchten dies in mehrere Funktionen aufteilen, eine für jede ID und eine für jede Operation.

Eine Richtlinie, die ich normalerweise verwende, ist eine Bildschirmhöhe. Wenn ich eine Funktion nicht vollständig auf meinem Bildschirm haben kann, denke ich darüber nach, Dinge aufzuteilen. Auf diese Weise müssen Sie nicht nur scrollen, um zu sehen, wohin die Funktion geht. Wie gesagt, es ist eine Richtlinie, keine Regel, aber ich finde es praktischer, die Kontrolle über die Struktur zu haben.

Wenn Sie dann einen OO-Ansatz wählen und dies zu einer Menge von Klassen machen möchten, können Sie dies gerne tun, wenn Sie einen Vorteil sehen. Achte jedoch auf alle Klempnerarbeiten, die damit verbunden sind. Vielleicht möchten Sie es einfach halten.

Dave

    
Dave Van den Eynde 27.10.2008 08:51
quelle
2

Ich habe eine Lösung für dieses Problem gefunden, die gut funktioniert: eine Hash-Tabelle von Funktionen.

Beim Kompilieren eines Perfect Hashfunktion für jede Operation unterstützte erstellt wird und der Betrieb wird mit einer Funktion zum Anruf zugeordnet ist (der Funktionszeiger ist der Wert in der Hash der Zeichenfolge Befehl ist der Schlüssel).

Während der Laufzeit wird der Befehl Funktionalität mithilfe der Befehlsfolge finden, die Funktion in der Hash-Tabelle genannt. Dann wird die Funktion so aufgerufen, dass sie den "Daten" -String als Referenz übergibt. Jede Befehlsfunktion parst dann den verbleibenden String gemäß seinen Regeln aus ... das Strategie-Muster gilt auch an diesem Punkt.

macht den Code Arbeit wie eine Zustandsmaschine, die (IMHO) der einfachste Weg, Netzwerk-Code zu nähern.

    
paxos1977 27.10.2008 16:20
quelle
1

Erstellen Sie eine Karte von Funktionen. Dann hätten Sie Code wie:

%Vor%

Obwohl ich Ihre Vorgehensweise sowieso nicht verstehe, werden Sie eine Sprache schreiben, die schwer zu handhaben und unflexibel ist. Denken Sie darüber nach: Ein kleiner Unterschied in der Anzahl der Argumente verursacht in dieser Sprache echtes Chaos. Daher sind Sie immer auf 1-3 Argumente pro Befehl beschränkt.

Ich würde lieber eine Lexer / Parser-Generator-Kombination verwenden, aber wenn Sie das tun wollen, was Sie tun werden, würde ich vorschlagen, dass Sie sich zuerst mit Zeilenumbruch, dann mit Leerzeichen trennen und daher einen klaren Weg haben um zu sehen, ob es 2 oder 3 Argumente geben sollte.

Es ist wichtig, selbst wenn Ihre Sprache maschinell erzeugt wird, was ist, wenn Ihr Generator einen Fehler hat? Scheitern früh, scheitern oft.

    
Cheery 27.10.2008 08:53
quelle
1

Du könntest das Befehlsmuster verwenden ...... jede deiner Aktionen würde ihre ID und ihre Operation kennen und sich zur Laufzeit einer Liste hinzufügen ... dann würdest du einfach den richtigen Befehl nachschlagen, passierst es egal welchen Kontext es braucht und es wird die Operation ausführen.

    
Keith Nicholas 27.10.2008 09:06
quelle
1

Der tabellengesteuerte Ansatz scheint dazu zu passen, wie mxp sagte. Wenn Sie verschiedene Parameter für Ihre Funktionen haben, können Sie eine Spalte in der Tabelle haben, die die Anzahl der Parameter für die Funktion in derselben Zeile angibt.

    
c0m4 27.10.2008 09:08
quelle