Hallo zusammen,
ich habe folgendes Problem: Ich arbeite gerade an einem Programm, welches aus mehreren Klassen besteht. Genauer geht es um Zustandsübergangsdiagramme. Dazu habe ich einen Anhang angefügt, der sagt mehr als tausend Worte und hilft bei der Orientierung. Ich beschreibe trotzdem mal worum es geht:
Grundidee:
Das Programm soll für beliebige Zustandsübergangsdiagramme mittels dem Eclipse Modeling Framework die generischen Klassen zur Verfügung stellen. Hierbei ist die Klasse StateChart (=Zustandsübergangsdiagramm) eine Klasse, deren Objekte Kompositobjekte von den Klassen State(=Zustand) und Transition sind. Ein Zustandsübergangsdiagramm besteht also aus beliebig vielen Zuständen und beliebig vielen Transitionen. Dabei sind Transitionen Objekte, die die einzelnen Zustände "verbinden". Transitionen verfügen über die Attribute trigger und action - beides Strings - welche im Falle des triggers Auskunft über die vom Anwender ausgeführten Tätigkeiten (z.B. Hebel betätigen, Knopf drücken, etc.) und im Falle der action Auskunft über die vom System ausgeführten Reaktionen (z.B. Garagentor schließt, Fließband hält an, etc.) geben.
Was ist zu tun?
Ich möchte zwei Methoden implementieren, und zwar
1. public void init(StateChart statechart)
2. public void trigger(String trigger)
Die erste Methode soll mein Zustandsübergangsdiagramm initialisieren, also in den Startzustand gehen, und falls es hierarchische/geschachtelte Zustände gibt, auch diese berücksichtigen.
Die zweite Methode soll bei einem gegebenen trigger die Zustände des ZÜD wechseln und die dazugehörigen Aktionen ausgeben.
Wo liegt das Problem?
Ich möchte mich zunächst der Methode public void init(StateChart statechart) zuwenden:
Bisher sieht meine Implementierung so aus:
Ich weiß jetzt allerdings nicht, wie ich Hierarchien von Zuständen implementieren soll. Beispiel: Eine Lampe hat die Zustände an, aus, blinkend. Blinkend ist Unterzustand von ein. Wie kann ich das hierarchisch implementieren? Das klingt schwer nach Rekursion aber ich habe irgendwie keine Idee. :-(
Nun zu Methode 2:
Die Trigger-Methode soll bei einem gegebenen trigger entsprechend den Zustand des Systems ändern und die Action ausgeben. Ich wollte wie folgt vorgehen:
1. trigger ist ein Attribut einer Transition. Da ich auf kurz oder lang ohnehin die Action brauche, MUSS ich das zugehörige Transition-Objekt meines als Input der Methode gelieferten triggers "zu fassen bekommen". Daher möchte ich alle in meinem Zustandsdiagramm befindlichen Transitions mit einer Schleife durchlaufen und mit der getTrigger()-Methode alle Trigger mit meinem als Input gelieferten Trigger vergleichen mittels der compareTo()-Methode.
Problem: Was ist, wenn es mehrere matches gibt?
2. Wenn wir unsere Transition herausgefunden haben, können wir durch die Implementierung von der Klasse Transition über getSource() und getTarget() die Ursprungs- und Zielzustände herausfinden, womit wir die Zustände entsprechend über changeState() wechseln können.
3. Textuelle Ausgabe
Problem: Da ich als Input NUR den trigger-String habe, kann ich nicht über alle Zustände des Zustandsdiagramms iterieren, da diese überhaupt nicht bekannt sind. Wie kann ich das umgehen? Ich komme ja nicht daran vorbei, mir auf irgendeine Art die Transition zu holen, oder doch?
Gruß
ich habe folgendes Problem: Ich arbeite gerade an einem Programm, welches aus mehreren Klassen besteht. Genauer geht es um Zustandsübergangsdiagramme. Dazu habe ich einen Anhang angefügt, der sagt mehr als tausend Worte und hilft bei der Orientierung. Ich beschreibe trotzdem mal worum es geht:
Grundidee:
Das Programm soll für beliebige Zustandsübergangsdiagramme mittels dem Eclipse Modeling Framework die generischen Klassen zur Verfügung stellen. Hierbei ist die Klasse StateChart (=Zustandsübergangsdiagramm) eine Klasse, deren Objekte Kompositobjekte von den Klassen State(=Zustand) und Transition sind. Ein Zustandsübergangsdiagramm besteht also aus beliebig vielen Zuständen und beliebig vielen Transitionen. Dabei sind Transitionen Objekte, die die einzelnen Zustände "verbinden". Transitionen verfügen über die Attribute trigger und action - beides Strings - welche im Falle des triggers Auskunft über die vom Anwender ausgeführten Tätigkeiten (z.B. Hebel betätigen, Knopf drücken, etc.) und im Falle der action Auskunft über die vom System ausgeführten Reaktionen (z.B. Garagentor schließt, Fließband hält an, etc.) geben.
Was ist zu tun?
Ich möchte zwei Methoden implementieren, und zwar
1. public void init(StateChart statechart)
2. public void trigger(String trigger)
Die erste Methode soll mein Zustandsübergangsdiagramm initialisieren, also in den Startzustand gehen, und falls es hierarchische/geschachtelte Zustände gibt, auch diese berücksichtigen.
Die zweite Methode soll bei einem gegebenen trigger die Zustände des ZÜD wechseln und die dazugehörigen Aktionen ausgeben.
Wo liegt das Problem?
Ich möchte mich zunächst der Methode public void init(StateChart statechart) zuwenden:
Bisher sieht meine Implementierung so aus:
Java:
public void init(StateChart statechart){
//TODO implementieren der Methode
//-------------------------------------------------------------
/*Problem: Was ist mit Hierarchien?*/
for (State state: statechart.getStates()){ /*Iteriere über alle Zustände*/
if(state.getIncoming().isEmpty()==true){ /*Anfangszustand finden, wir können nicht auf den Objekttyp StartState testen, da StartState
ein Interface ist, also schauen wir, wo keine Transitions "eingehen", dass muss der StartState sein*/
Transition tOut = state.getOutgoing().iterator().next(); /*Wir schauen uns die ausgehenden Actions dieses Startzustands an*/
if(tOut.getAction()!=null){ /*Wenn diese nicht null ist, erledigt die firePerformAction-Methode eine hier*/
firePerformAction(tOut.getAction()); /*nicht näher erläuterte Arbeit, die mit der GUI zusammenhängt*/
}
activeState=tOut.getTarget(); /*Setze den aktiven Zustand auf genau diesen Anfangszustand*/
}
}
//------------------------------------------------------------
// inform listeners about active state
fireStateChanged();
}
Ich weiß jetzt allerdings nicht, wie ich Hierarchien von Zuständen implementieren soll. Beispiel: Eine Lampe hat die Zustände an, aus, blinkend. Blinkend ist Unterzustand von ein. Wie kann ich das hierarchisch implementieren? Das klingt schwer nach Rekursion aber ich habe irgendwie keine Idee. :-(
Nun zu Methode 2:
Die Trigger-Methode soll bei einem gegebenen trigger entsprechend den Zustand des Systems ändern und die Action ausgeben. Ich wollte wie folgt vorgehen:
1. trigger ist ein Attribut einer Transition. Da ich auf kurz oder lang ohnehin die Action brauche, MUSS ich das zugehörige Transition-Objekt meines als Input der Methode gelieferten triggers "zu fassen bekommen". Daher möchte ich alle in meinem Zustandsdiagramm befindlichen Transitions mit einer Schleife durchlaufen und mit der getTrigger()-Methode alle Trigger mit meinem als Input gelieferten Trigger vergleichen mittels der compareTo()-Methode.
Problem: Was ist, wenn es mehrere matches gibt?
2. Wenn wir unsere Transition herausgefunden haben, können wir durch die Implementierung von der Klasse Transition über getSource() und getTarget() die Ursprungs- und Zielzustände herausfinden, womit wir die Zustände entsprechend über changeState() wechseln können.
3. Textuelle Ausgabe
Java:
public void trigger(String trigger){
//TODO implementieren der Methode
//----------------------------------------------------------------------------------
EList<Transition> my_list;
my_list = statechart.getTransitions(); /* Das geht nicht, da statechart nicht bekannt
ist*/
for (Transition transition: my_list) { ... }
//---------------------------------------------------------------------------------
// inform listeners about active state
fireStateChanged();
}
Gruß