2008-09-15 14 views

Antwort

0

Für Fälle, in denen Sie in einem Protokollkopf von einem Feld abspringen, um Sie zur nächsten Verarbeitungsstufe für dieses Protokoll zu leiten, können Arrays von Funktionszeigern verwendet werden. Sie verwenden den Wert aus dem Protokollkopf, um in das Array zu indizieren und die Funktion für dieses Protokoll aufzurufen.

Sie müssen behandeln alle möglichen Werte in diesem Array, auch diejenigen, die nicht gültig sind. Schließlich erhalten Sie ein Paket mit dem ungültigen Wert, entweder weil jemand einen Angriff versucht oder weil eine zukünftige Version des Protokolls neue Werte hinzufügt.

0

Wenn es sich um ein einziges Protokoll handelt, dann ist eine switch/case-Anweisung die beste Wahl. Sie sollten jedoch alle einzelnen Nachrichtenhandler in ihre eigenen Funktionen zerlegen.

Wenn Ihre switch-Anweisung irgendeinen Code enthält, um die Nachrichten tatsächlich zu behandeln, wäre es besser, sie zu brechen. Wenn es mehrere ähnliche Protokolle behandelt, können Sie eine Klasse erstellen, die alle auf derselben abstrakten Klasse basiert, und wenn die Verbindung herkommt, können Sie bestimmen, um welches Protokoll es sich handelt, und eine Instanz der entsprechenden zu decodierenden Handler-Klasse erstellen und handle die Kommunikation.

0

Ich würde denken, das hängt weitgehend von der Sprache, die Sie verwenden, und welche Art von Datensatz Objekte, die Sie für Sie verfügbar haben. In Python zum Beispiel könnten Sie ein Dictionary-Objekt für alle verschiedenen Verarbeitungsanweisungen erstellen und es einfach durchlaufen, um die richtige Methode/Funktion zum Aufrufen zu finden.

Fall/Switch-Anweisungen sind keine schlechten Dinge, aber wenn sie riesig werden (wie sie es mit massiven Mengen von Protokollhandlern können), dann können sie unhandlich werden, damit zu arbeiten.

1

Es klingt wie die "while + switch/case" ist eine StateMachine-Implementierung. Ich glaube, dass eine gut durchdachte Zustandsmaschine oft die einfachste und lesbarste Art ist, ein Protokoll zu implementieren.

Wenn es um Staatsmaschinen geht, kommt das Territorium mit einigen der traditionellen Programmierregeln zu brechen. Regeln wie "jede Funktion sollte weniger als 25 Zeilen sein" funktionieren einfach nicht. Man könnte sogar behaupten, dass Staatsmaschinen getarnte GOTOs sind.