Werden endliche Automaten im OOP generell als schlecht angesehen?
Ich höre das oft. Und nachdem ich an einem wirklich alten, undokumentierten Stück C ++ arbeiten musste, das ich benutze, stimme ich dem zu. Es war ein Schmerz zu debuggen.Was ist mit Lesbarkeits- / Wartbarkeitsproblemen?
FSMs sollten nie als schlecht angesehen werden. Sie sind viel zu nützlich, aber Menschen, die nicht daran gewöhnt sind, werden sie oft als lästig empfinden.
Es gibt zahlreiche Möglichkeiten, eine mit OOP zu implementieren. Manche sind hässlicher als andere. Deine Low-Level-Leute werden Switch-Anweisungen, Sprungtabellen oder sogar "goto" verwenden.
Wenn Sie nach einer saubereren Methode suchen, würde ich Boost State Chart-Bibliothek , die nur für die Implementierung von UML-Zustandsdiagrammen in C ++ erstellt wurde. Es nutzt moderne Template-Techniken, um die Dinge lesbarer zu machen. Es funktioniert auch sehr gut.
Ich kann Ihnen nicht sagen, was Sie sagen.
Aber OO und FSM sorta greifen verschiedene Problembereiche an. In einer Domäne, in der Objekte interagieren - das erfordert einen objektorientierten Ansatz. In einer Domäne, in der sich die Welt in dem einen oder anderen Zustand befindet - das erfordert ein FSM-Design.
Realistisch gesehen, können Sie diese Designs mit unterschiedlichen Abstraktionsstufen mischen, was sauberer ist als nur das eine oder das andere.
FSMs sollten nie als schlecht angesehen werden. Sie sind viel zu nützlich, aber Menschen, die nicht daran gewöhnt sind, werden sie oft als lästig empfinden.
Es gibt zahlreiche Möglichkeiten, eine mit OOP zu implementieren. Manche sind hässlicher als andere. Deine Low-Level-Leute werden Switch-Anweisungen, Sprungtabellen oder sogar "goto" verwenden.
Wenn Sie nach einer saubereren Methode suchen, würde ich Boost State Chart-Bibliothek , die nur für die Implementierung von UML-Zustandsdiagrammen in C ++ erstellt wurde. Es nutzt moderne Template-Techniken, um die Dinge lesbarer zu machen. Es funktioniert auch sehr gut.
Ich denke, wenn der Code gut dokumentiert ist, gibt es kein Problem, ihn mit einem OOP-Ansatz zu implementieren. Die meisten C / C ++ verwenden FSM mit Switch-Anweisungen, die manchmal die Lesbarkeit beeinträchtigen können, wenn die Maschine groß ist.
Kürzlich musste ich eine reguläre Sprache analysieren und ein FSM mit dem OOP-Ansatz implementieren, die Lesbarkeit und Wartbarkeit des Codes waren gut. Ich meine, viel besser als große Switch-Anweisungen.
Ein Tipp, in einem ersten Moment habe ich die FSM mit den Zuständen und den Zuständen mit den Übergängen implementiert. In meinem Fall erwies es sich jedoch als ein besserer Ansatz, eine Klasse zu haben, die die FSM repräsentiert, die eine Sammlung von Zuständen und eine andere von Übergängen enthält. Es erleichterte mir das Klonen der Maschinen (es war eine Voraussetzung für mich) und eine kleinere Übergangsfunktion.
Ich hoffe, es hilft, Carlos.
Ich würde sagen, dass endliche Automaten viel einfacher zu debuggen sind als andere Methoden, um die gleichen Probleme zu lösen (Probleme wie das Anpassen regulärer Sprachen). Was ist schön an FSMs ist alles im Namen ... Sie könnten eine Zustandsmaschine mit 15 Zuständen haben, so dass Sie ein Diagramm auf einem Blatt Papier zeichnen können, das alle Übergänge zeigt. Sie können das Diagramm verwenden, um nützliche Eigenschaften des Systems herauszufinden, z. B. welche Strings es akzeptiert und wie es in Fehlerzustände gerät. Bei komplizierteren Systemen ist das Diagrammieren oft schwierig oder unmöglich.
Sogar die Leute, die sagen, "Gotos sind böse", denken, dass sie der richtige Weg sind, Staatsmaschinen zu implementieren. (Natürlich denken manche Leute, dass Gotos immer böse sind ... aber du kannst nicht allen gefallen).
FSMs können einfach zu verstehen und zu pflegen sein, wenn der Code richtig strukturiert ist. Ich habe eine FSM in früheren Jobs implementiert, hier ist eine Skelettvorlage:
State Machine kann verwendet werden, um das Verhalten einer Klasse darzustellen. Wenn die Reihenfolge eingehender Ereignisse für das Verhalten einer Klasse nicht von Bedeutung ist (kombinatorische Klasse), bietet die Verwendung des Zustandsmodells keinen besonderen Vorteil.
Wenn das Verhalten einer Klasse jedoch von der Reihenfolge der eingehenden Ereignisse abhängt (sequenzielle Klasse), stellt State Machine die beste Wahl für die Verhaltensanalyse und -implementierung dar.
Wenn es um Lesbarkeit / Wartbarkeit geht, verwenden Sie grafische Darstellungen. Beispiele für das Verhalten von Klassen, die zu verschiedenen Engineering-Domänen gehören, werden in einer grafischen und ausführbaren Form unter Ссылка - & gt; State Machine-Galerie.
Janusz
Werden endliche Automaten im OOP generell als schlecht angesehen?
Ich höre das oft. Und nachdem ich an einem wirklich alten, undokumentierten Stück C ++ arbeiten musste, das ich benutze, stimme ich dem zu. Es war ein Schmerz zu debuggen.Was ist mit Lesbarkeits- / Wartbarkeitsproblemen?
Ich kann Ihnen nicht sagen, was Sie sagen.
Aber OO und FSM sorta greifen verschiedene Problembereiche an. In einer Domäne, in der Objekte interagieren - das erfordert einen objektorientierten Ansatz. In einer Domäne, in der sich die Welt in dem einen oder anderen Zustand befindet - das erfordert ein FSM-Design.
Realistisch gesehen, können Sie diese Designs mit unterschiedlichen Abstraktionsstufen mischen, was sauberer ist als nur das eine oder das andere.
Ich würde sagen, dass endliche Automaten viel einfacher zu debuggen sind als andere Methoden, um die gleichen Probleme zu lösen (Probleme wie das Anpassen regulärer Sprachen). Was ist schön an FSMs ist alles im Namen ... Sie könnten eine Zustandsmaschine mit 15 Zuständen haben, so dass Sie ein Diagramm auf einem Blatt Papier zeichnen können, das alle Übergänge zeigt. Sie können das Diagramm verwenden, um nützliche Eigenschaften des Systems herauszufinden, z. B. welche Strings es akzeptiert und wie es in Fehlerzustände gerät. Bei komplizierteren Systemen ist das Diagrammieren oft schwierig oder unmöglich.
Sogar die Leute, die sagen, "Gotos sind böse", denken, dass sie der richtige Weg sind, Staatsmaschinen zu implementieren. (Natürlich denken manche Leute, dass Gotos immer böse sind ... aber du kannst nicht allen gefallen).
Ich denke, wenn der Code gut dokumentiert ist, gibt es kein Problem, ihn mit einem OOP-Ansatz zu implementieren. Die meisten C / C ++ verwenden FSM mit Switch-Anweisungen, die manchmal die Lesbarkeit beeinträchtigen können, wenn die Maschine groß ist.
Kürzlich musste ich eine reguläre Sprache analysieren und ein FSM mit dem OOP-Ansatz implementieren, die Lesbarkeit und Wartbarkeit des Codes waren gut. Ich meine, viel besser als große Switch-Anweisungen.
Ein Tipp, in einem ersten Moment habe ich die FSM mit den Zuständen und den Zuständen mit den Übergängen implementiert. In meinem Fall erwies es sich jedoch als ein besserer Ansatz, eine Klasse zu haben, die die FSM repräsentiert, die eine Sammlung von Zuständen und eine andere von Übergängen enthält. Es erleichterte mir das Klonen der Maschinen (es war eine Voraussetzung für mich) und eine kleinere Übergangsfunktion.
Ich hoffe, es hilft, Carlos.
State Machine kann verwendet werden, um das Verhalten einer Klasse darzustellen. Wenn die Reihenfolge eingehender Ereignisse für das Verhalten einer Klasse nicht von Bedeutung ist (kombinatorische Klasse), bietet die Verwendung des Zustandsmodells keinen besonderen Vorteil.
Wenn das Verhalten einer Klasse jedoch von der Reihenfolge der eingehenden Ereignisse abhängt (sequenzielle Klasse), stellt State Machine die beste Wahl für die Verhaltensanalyse und -implementierung dar.
Wenn es um Lesbarkeit / Wartbarkeit geht, verwenden Sie grafische Darstellungen. Beispiele für das Verhalten von Klassen, die zu verschiedenen Engineering-Domänen gehören, werden in einer grafischen und ausführbaren Form unter Ссылка - & gt; State Machine-Galerie.
Janusz
Tags und Links language-agnostic c++ design state-machines