RSA - Operation-Body mit OCL definieren

Aus SDQ-Wiki

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:

Constraints.png

Über Navigate kann man das neu angelegte Constraint öffnen. Hier kann nun der OCL-Ausdruck eingetragen werden:

Body.png

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.

Reload.png

Keywords: OCL, object constraint language, eclipse, RSA, operation body, body