Metamodellbasierte und hierarchieorientierte ... - RosDok
Metamodellbasierte und hierarchieorientierte ... - RosDok
Metamodellbasierte und hierarchieorientierte ... - RosDok
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