RSA - Operation-Body mit OCL definieren
Dieser Artikel soll beschreiben, wie mithilfe von OCL das Verhalten einer Methode/Operation in einem Klassendiagramm definiert werden kann. Zum Bearbeiten des Modells wird RSA benutzt.
Anschließend wird gezeigt, welche zusätzliche Einstellung in eclipse nötig ist, um die definierte Operation auch generieren zu lassen.
In RSA
In den Eigenschaften der Operation muss ein Constraint mit Type=body und Language=OCL angelegt werden:
Über Navigate kann man das neu angelegte Constraint öffnen. Hier kann nun der OCL-Ausdruck eingetragen werden:
Der OCL-Ausdruck muss den Rückgabetyp der Operation als Ergebnis liefern.
Im Beispiel auf den Screenshots soll die Methode showFeatureState() als Ergebnis einen Wert des enum FeatureState zurückliefern.
Dies wird mit folgendem OCL-Ausdruck erreicht:
if (simpleMandatory->size() = 1 and simpleMandatory.mandatoryChildren->size() > 0 and simpleMandatory.mandatoryChildren->includes(self))
then
FeatureState::MANDATORY
else (
if (simpleOptional->size() = 1 and simpleOptional.optionalChildren->size() > 0 and simpleOptional.optionalChildren->includes(self))
then
FeatureState::OPTIONAL
else
FeatureState::NOT_SET
endif)
endif
Wichtig in diesem Codestück sind die size() - Abfragen. Würde man sie weglassen, könnte es passieren dass z.B. der Ausdruck simpleMandatory.mandatoryChildren->includes(self)
ungültig wird. (Nämlich z.B. dann, wenn das Element simpleMandatory nicht existiert.) Dies führt im generierten Code nicht dazu, dass ein Fehler angezeigt wird, sondern dass einfach nichts zurückgegeben wird.
Generierung der Operationen in Eclipse
Nach dem Export des Modells als UML-Datei muss beim Erstellen/Reloaden des Genmodels in eclipse die Option "Operation Bodies" auf "Process" gesetzt werden, damit die Operationen generiert werden.