18.01.2014 Aufrufe

Metamodellbasierte und hierarchieorientierte ... - RosDok

Metamodellbasierte und hierarchieorientierte ... - RosDok

Metamodellbasierte und hierarchieorientierte ... - RosDok

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

3.1 Einführung 33<br />

Im folgenden werden Beispiele für OCL-Invarianten <strong>und</strong> Vor- <strong>und</strong> Nachbedingungen gegeben. Zunächst ist<br />

hierfür ein Klassendiagramm notwendig, welches in Abbildung 3.1 zu sehen ist.<br />

Abbildung 3.1: Bankenbeispiel als UML-Klassendiagramm zur OCL-Einführung<br />

Es sind die Klassen Customer <strong>und</strong> Account spezifiziert. Die Klasse Account ist abstrakt. Kontenobjekte<br />

werden durch die spezielleren Klassen Savings <strong>und</strong> Checking in Spar- <strong>und</strong> Girokonten eingeteilt. Mit der<br />

Assoziation has <strong>und</strong> ihrer Multiplizitäten wird angegeben, dass ein K<strong>und</strong>e mehrere Konten haben kann. Die<br />

zugeordnete Menge an Konten kann dabei sowohl Giro- als auch Sparkonten umfassen. Mit der Operation<br />

openAccount() wird ein neues Konto erstellt <strong>und</strong> dem entsprechenden K<strong>und</strong>en zugeordnet. Es bleibt hier<br />

unterspezifiziert, welche Kontoart ausgewählt wird. Dieses kann z.B. vorkonfiguriert sein oder über eine<br />

UI-Abfrage ermittelt werden. Außerdem kann über die Operationen withdraw <strong>und</strong> deposit Geld von Konten<br />

abgebucht <strong>und</strong> wieder raufgebucht werden.<br />

Ein Beispiel für eine Invariante wird in Listing 3.1 gegeben. Die Invariante PositiveBalance ist der Klasse<br />

Savings zugeordnet <strong>und</strong> sagt aus, dass ein Sparkonto keinen negativen Saldo haben darf. Zudem sind in<br />

Listing 3.1 die Operationen withdraw() <strong>und</strong> openAccount() mit Vor- <strong>und</strong> Nachbedingungen spezifiziert. Die<br />

Vorbedingung withdrawAmountPositive sagt aus, dass nur positive Beträge vom Konto abgebucht werden<br />

dürfen. Die Nachbedingung withdrawDone sichert zu, dass nur der ausbezahlte Betrag vom Kontosaldo<br />

abgezogen wurde. Eine letzte Bedingung ist mit openAccount() angegeben. Diese sagt aus, dass nach<br />

Ausführung der Operation openAccount() ein zusätzliches Konto dem K<strong>und</strong>en zugeordnet wurde.<br />

✞<br />

1 context Savings inv PositiveBalance:<br />

2 balance >= 0<br />

3<br />

4 context Account::withdraw(amount:Real)<br />

5 pre withdrawAmountPositive: amount > 0<br />

6 post withdrawDone: self.balance = self.balance@pre − amount<br />

7<br />

8 context Customer::openAccount()<br />

9 post accountAdded: account−>size() = account@pre−>size() + 1<br />

✝<br />

Listing 3.1: OCL-Invariante <strong>und</strong> Vor- <strong>und</strong> Nachbedingungen für das Bankbeispiel<br />

☎<br />

✆<br />

OCL kann auch für weitere Zwecke eingesetzt werden. Es sind auch OCL-Terme denkbar, die losgelöst von<br />

UML-Klassendiagrammen existieren können. Beispielsweise berechnet der OCL-Ausdruck in Listing 3.2<br />

alle Quadratzahlen zwischen 1 <strong>und</strong> 100.<br />

✞<br />

☎<br />

1 Set{1..100}−>select(m | Set{1..100}−>exists(n | m = n*n ))<br />

✝<br />

✆<br />

Listing 3.2: OCL Term zur Berechnung aller Quadratzahlen zwischen 1 <strong>und</strong> 100

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!