Endliche Zustandsmaschine: Schlechtes Design?

8

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?

    
f4. 02.02.2010, 00:36
quelle

7 Antworten

16

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.

    
pestilence669 02.02.2010, 00:52
quelle
6
___ qstnhdr ___ Endliche Zustandsmaschine: Schlechtes Design? ___ answer2181194 ___

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.

    
___ answer2181198 ___

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.

    
___ answer2181169 ___

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.

    
___ answer2181189 ___

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).

    
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ answer16756623 ___

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:

FSM

    
___ answer7506108 ___

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

    
___ tag123design ___ Design in der Programmierung ist die Handlung, bestimmte Entscheidungen darüber zu treffen, wie man ein Programm am besten strukturiert, um Ziele der Zuverlässigkeit, Wartbarkeit, Korrektheit oder Benutzerfreundlichkeit zu erreichen. ___ tag123languageagnostic ___ Verwenden Sie dieses Tag zum PROGRAMMIEREN VON FRAGEN, die unabhängig von einer bestimmten Programmiersprache sind. ___ tag123statamachines ___ Eine Zustandsmaschine ist ein Berechnungsmodell, das sowohl zum Entwurf von Computerprogrammen als auch von sequentiellen Logikschaltungen verwendet wird. Es bestimmt, dass eine Entität in einem Programm in einer endlichen Anzahl von Zuständen sein kann. Der Zustand, in dem er sich gerade befindet, wird der aktuelle Zustand genannt. Es kann von einem Zustand zum anderen wechseln, wenn es durch ein auslösendes Ereignis oder eine auslösende Bedingung ausgelöst wird; Dies wird als Übergang bezeichnet. ___ qstntxt ___

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?

    
___
SF. 02.02.2010 11:22
quelle
5

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.

    
Paul Nathan 02.02.2010 00:51
quelle
2

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).

    
Dietrich Epp 02.02.2010 00:48
quelle
1

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.

    
Carlos Loth 02.02.2010 00:44
quelle
1

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:

FSM

    
Phileo99 26.05.2013 05:55
quelle
0

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

    
Janusz Dobrowolski 21.09.2011 20:19
quelle