Ich habe eine Prüfung vor mir und schaue mir frühere Arbeiten an, um einige Ideen zu bekommen, was mich erwartet. Ich bin ein bisschen fest mit dem folgenden verbunden und würde mich sehr freuen, wenn jemand einige Beispielantworten geben könnte.
Schreiben Sie Vor- und Nachbedingungen in OCL für jede der folgenden Operationen (in der Stack-Klasse im Paket java.util enthalten):
- (1) Boolean empty () - Testet, ob dieser Stapel leer ist
- (2) E peek () - Betrachtet das Objekt oben auf diesem Stapel, ohne es vom Stapel zu entfernen
- (3) E pop () - Entfernt das Objekt oben auf diesem Stapel und gibt dieses Objekt als Wert dieser Operation zurück
- (4) E push (E item) - schiebt einen Gegenstand auf die Oberseite dieses Stapels
Hier bezeichnet E die Art der Elemente im Stapel.
Meine Versuche sind wie folgt:
Boolean empty()
pre: none
post: self -> IsEmpty() = true
//should this be result -> IsEmpty() = true because it returns a boolean value?
E peek()
pre: self -> NotEmpty() = true
post: result = ???
// I lose hope at this stage.
Ich weiß auch nicht, ob ich auf die Elemente im Stapel verweisen soll. Zum Beispiel: self.elements -> IsEmpty () = true
Wenn mir jemand helfen könnte, würde ich es wirklich schätzen.
BEARBEITEN
Ein Freund hat folgende Ideen:
context Stack empty()
pre: self.data.size = 0
context Stack peek()
pre: self.data.AsSequence.first
context Stack pop()
pre: !self.data.isEmpty
post: self.data.AsSequence.first.remove (not sure about this one)
post: self.data.count = @pre:data - 1
context Stack push(E Item)
post: self.data.asSquence.prepend(E.asSequence)
post: self.data.size = @pre.data.size + 1
Antworten:
Vor- und Nachbedingungen sind ein Vertrag.
true
ist, muss die Funktion einen Fehler auslösen.true
, weist die Implementierung einen Fehler auf.Sowohl Vor- als auch Nachbedingung müssen boolesche Ausdrücke sein.
Nehmen wir
empty?
als Beispiel. Diese Funktion kann immer aufgerufen werden, daher gibt es keine Voraussetzung. Und die Funktion hat keine Nebenwirkungen, so dass es keine Nachbedingung gibt.Nehmen wir
pop
als weiteres Beispiel. Wenn diese Funktion eine Ausnahme auf einem leeren Stapel auslöst, ist die Vorbedingungself.size > 0
, wenn die Funktionnil
auf einem leeren Stapel zurückkehrt, gibt es keine Vorbedingung. Beide sind gültige Entwurfsoptionen, die mit Javas Auswahl nicht vertraut sind. In beiden Fällen besteht die Nachbedingung darin, dassself.size = previous.size - 1
der vertragliche Nebeneffekt darin besteht, ein Element zu entfernen.Und so weiter …
Hinweis: Verwendeter Pseudocode, da er mit OCL nicht vertraut ist.
quelle