context Klasse
inv: Bedingung 1
inv: Bedingung 2
context Typename::operationName(parameter1 : Type1, ... ): ReturnType
pre: Bedingung 1
pre: Bedingung 2
post: Bedingung 3
score > 88.33 and score <= 93.33 gender = #female or gender = #male p implies q left xor right next->isEmpty or value <= next.value self.grading and self.questions->size<10 p1 <> p2 implies p1.name <> p2.name Student.allInstances->forAll( p1, p2 | p1 <> p2 implies p1.name <> p2.name )"implies" bedeutet hier: Wenn die Bedingung vor dem Schlüsselwort gilt, dann gilt implizit auch die zweite Bedingung. Weiteres Beispiel:
context Person
inv: self.wife->notEmpty() implies self.wife.gender = Gender::female
score > 88.33 value <= next.value self.questions->size<10
-account.value not self.questions->isEmpty
'beeblebrox' 42
context Klasse
inv Bedingung1Name: Bedingung 1
inv Bedingung2Name: Bedingung 2
context CPerson
inv AlterGroesser0: self.m_iAlter > 0
Der self-Operator ist optional. Zur Unterscheidung von selbst-definierten Variablen (siehe unten)
sollte man ihn allerdings zufügen.
context CPerson
inv GeschlechtPartner: self.m_sGeschlecht <> self.partner.m_sGeschlecht
post: if self then result = false else result = true endif
Hier wird (Post-Constraint) der Rückgabewert des NOT-Operators auf den negierten Wert des
Booleschen Werts gesetzt. context Person
inv: let income : Integer = self.job.salary->sum() in
if isUnemployed then
income < 100
else
income >= 100
endif
In diesem Beispiel (Invariante für eine Person) soll das Einkommen einer arbeitslosen Person unter 100 liegen, das einer
arbeitenden Person über 100. Das Schlüsselwort "in" nach der "let"-Definition gibt an in welchem Ausdruck
die Variable "income" gilt.
context Person
def: income : Integer = self.job.salary->sum()
def: nickname : String = ’Little Red Rooster’
def: hasTitle(t : String) : Boolean = self.job->exists(title = t)
"hasTitle" definiert eine Operation mit einem Parameter "t" vom Typ "String" und hat den Rückgabewert
"Boolean". "self.job" führt zu einer Collection, innerhalb dieser wird ein Job mit dem übergebenen Titel
gesucht. context Person
def: income : Integer = self.job.salary->sum()
inv: if self.isUnemployed then
income < 100
else
income >= 100
endif
Collection(Integer)
: Integer-Collection Set (String)
: Set von String-Werten. includes (object: T): Boolean
Deklariert einen Parameter namens "object" vom
gleichen Typ wie die Objekte in der Collection.
context CPerson::UeberweiseKindergeld(nBetrag : int): void
pre KinderVorhanden: self.kinder->size > 0
size()
: Anzahl von Elementen in der Collection. includes (object: T): Boolean
Ist das übergebene Objekt "T" in der Collection enthalten ? excludes (object: T): Boolean
Ist das übergebene Objekt "T" NICHT in der Collection enthalten ? includesAll (c2: Collection(T) ): Boolean
Sind alle Elemente der übergebenen Collection "c2" in dieser Collection enthalten ? excludesAll (c2: Collection(T) ): Boolean
Ist keines der Elemente der übergebenen Collection "c2" in dieser Collection enthalten ? isEmpty(): Boolean
Ist die Collection leer ? notEmpty(): Boolean
Na was wohl ? sum(): T
Summe über die Elemente (falls summierbar) count (object: T): Integer
Zählt das Auftreten von "object" im Set. at (i: Integer): T
Abrufen des Elements an Stelle "i" indexOf (obj: T): Integer
Index des übergebenen Elements. first(): T
Erstes Element der Sequence last(): T
Letztes Element der Sequence source->iterate(iterator; result : Type1 = InitialValue | body)
Die Iterate-Methode hat folgende Teile: source->sum() =
source->iterate(iterator; result : Integer = 0 | result + iterator)
source->forAll(iterators | body ) =
source->iterate(iterators; result : Boolean = true | result and body)
Sie prüft für jedes Element der Collection ob es eine Body-Bedingung erfüllt. Nur wenn dies
für alle Elemente der Fall ist dann ist die Rückgabe "TRUE", sonst "FALSE". source->select(iterator | body) =
source->iterate(iterator; result : Set(T) = Set{} |
if body then result->including(iterator)
else result
endif)
Sie erzeugt eine neue Sequence, die nur die Elemente enthält die eine Bedingung erfüllen.
"including" ist eine Methode von "Set" und gibt ein Set zurück dass alle Elemente plus das neue
enthält.