![]() |
Re: Automaten in Source Code
Nein, das ist nicht der gleiche Aufwand.
Die Tabelle muss immer vollständig sein (leere Felder sieht man sofort => da fehlt was) bei dem case sieht man es nicht sofort wenn man was vergessen hat. Und wenn man ein Ereignis hinzufügt, muss man sich bei der Tabelle Gedanken machen, wass in jedem Zustand passieren soll - beim case läuft man Gefahr, einen Zustand zu vergessen (Dann wird ja der else-Zweig ausgeführt), und man hat möglicherweise einen Bug. Und die Tabelle kann man gut seperat validieren. z.B. eine Excel-Arbeitsmappe die die Tabelle überprüft und ggf. auf Sackgassen oder nicht zusammenhängende Bereiche aufmerksam macht. Das ganze wird natürlich wichtiger, je komplexer das ganze wird. Ob diese Grenze (oberhalb der man bereit ist, eine zusätzliche Abstraktion einzuführen) bei 3 Ereignissen und 4 Zuständen schon erreicht ist, ist subjektiv. Btw.: Zu der Zustandsmatrix gehört eigentlich auch eine Vorgangsmatrix oder sowas - die Zustandsmatrix gibt zu einem Zustand und einem Ereignis den neuen Zustand an, und die Vorgangsmatrix gibt die Aktion an, die passieren soll ... oder nicht? |
Re: Automaten in Source Code
Die "Vorgangsmatrix" steckt in ProcessState:
Delphi-Quellcode:
State := CoStartState.Create;
While Not State.IsStopState Do Begin State.DoProcessState(); State := State.NextState; End; Zitat:
Ich sage, es ist der gleiche Aufwand. Wenn man "viele" Zustände hat, ist man gut daran einen Graphen zu zeichnen, wenn ich diesen ändere, WEIß ich sofort, wo ich in der Tabelle/Case etwas zu ändern habe. Zur Klarstellung (nur weil das bestimmte Personen evtl so sehen): Ich habe mich nie GEGEN die Tabellenlösung als solches ausgesprochen. Ich finde die Case (vor allem in unserem kleinen Beispiel) ebenwürdig. Das kommt auch daher, dass die Case-Variante immer mächtiger ist. Kleines Beispiel: Man nehme an, man "füttert" seinen Automaten nicht mit einer Liste von Charactern (String) sondern mit einer Liste von zwei, drei, ... Zeichen pro Terminalsymbol. Eingabe: "ABC#32DE", hier soll #32 EIN Smbol darstellen. Bitte keine Bezüge zu "Bändern" von denen der Automat liest. Hier benötigt man einen Scanner mit CASE. Alternative: Man könnte natürlich den Scanner wiederum als separaten Automaten modellieren, der pro Aufruf ein TerminalSymbol rauswirft. |
Re: Automaten in Source Code
Zitat:
|
Re: Automaten in Source Code
Das ist das Thema, welches mich interessiert.
Kannst du mir Quellen geben, die die (Entwicklungs-)Prinzipien des Paradigmas erklären, dass zB "God-Classes" nicht gern gesehen werden. Ein Beispiel (erstellen einer Liste): 1. Man erstellt nur die Elemente der Liste und diese organisiert sich "indirekt" selbst. 2. man erstellt Elemente, die IHRE eigene Aufgabe (und nur DIESE) erfüllen; und dazu eine "Schale", die die Organisation übernimmt Was ist an Punkt 2 auszusetzen (mehr Schreibarbeit mal Außen vor gelassen). Ich würde 1. bevorzugen, da zB die Suche in 2. über die Elemente funktioniert, die Elemente es aber überhaupt nicht zu interessieren hat. Wenn sich nun die Organisation ändert, bekommen die Elemente nichts davon mit (was eigentlich erwünscht ist) Prinzipien der OO sind doch: - Jedes Objekt hat (s)eine Aufgabe - Minimale Sichtbarkeiten - ... Liste darf (durch euch) erweitert werden |
Re: Automaten in Source Code
Ich seh grad auf Wiki (
![]() God-Object = ein Objekt, dass "zu viel kennt". Das entspricht aber der hier vorgestellten Lösung. Ein ListenElement, welches seinen Nächsten kennt (und in unserem Automaten sogar noch "managed"). |
Re: Automaten in Source Code
Zitat:
Im Gegenzug dazu müssen die Case-Anweisung und die Tabelle immer alle Zustände und möglichen und nicht-möglichenn Transitionen kennen. Übrigens: ![]() |
Re: Automaten in Source Code
Zitat:
Es ist (in meinen Augen) NICHT die Aufgabe eines Zustandes den nächsten zu erstellen und ihn damit zu organisieren. Es braucht einen "Hüter", der die Aufgabe der Tabelle oder CASE übernimmt, also den Automatengraphen "simuliert". |
Re: Automaten in Source Code
Zitat:
|
Re: Automaten in Source Code
Zitat:
Je nach Implementierung der Zustände kann man entweder eine Basisklasse verwenden und nur noch einzelne Methoden in den Kindklassen überschreiben, oder aber man verwendet nur ein Interface. mfG Markus |
Re: Automaten in Source Code
ich spreche Sprachunanhängig, es geht mir jetzt rein um OOP, OO oder OOT (wie mans nennen will).
Zitat:
Zitat:
Mein "eleganter" und "OO-Korrekter" Lösungsvorschlag: 2 Klassen. - Klasse Zustand (diese speichert (organisiert) die Aktion, die Ausgabe (falls Mealy-Automat) und eventuall seinen Folgezustand) - Klasse Tabelle/Case/Graph (managed alle Zustände, interne Realisierung ist persönliche Sache) Das entspricht (soweit ich das einschätzen kann) einer guten OO. Ich lerne selbst gerade erst damit umzugehen (ich bastle mir eine SymbolTabelle für einen Compiler rein OO). Da hat man so manche philosophische Halbe Stunde :-) Um Bezug zu nehmen auf das eigentliche Thema: die OO-Lösung die hier vorgestellt wurde ist unübersichtlich, das die Organisation sehr stark verteilt wurde (auf #Zustände-viele Klassen). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz