Saya memiliki ujian yang akan datang dan saya sedang melihat kertas-kertas masa lalu untuk mendapatkan beberapa ide tentang apa yang diharapkan. Saya agak terjebak pada yang berikut dan akan sangat menghargai jika seseorang dapat memberikan beberapa contoh jawaban.
Tulis prakondisi dan postkondisi dalam OCL untuk masing-masing operasi berikut (termasuk dalam kelas Stack dalam paket java.util):
- (1) Boolean empty () - Menguji apakah tumpukan ini kosong
- (2) E mengintip () - Melihat objek di bagian atas tumpukan ini tanpa mengeluarkan dari tumpukan
- (3) E pop () - Menghapus objek di bagian atas tumpukan ini dan mengembalikan objek itu sebagai nilai operasi ini
- (4) E push (E item) - mendorong item ke bagian atas tumpukan ini
Di sini E menunjukkan tipe elemen dalam stack.
Upaya saya adalah sebagai berikut:
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.
Saya juga tidak tahu apakah saya harus mereferensikan elemen dalam tumpukan. Sebagai contoh: self.elements -> IsEmpty () = true
Jika ada yang bisa membantu saya, saya akan sangat menghargainya.
EDIT
Seorang teman memiliki ide-ide berikut:
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
Jawaban:
Pra dan pasca kondisi adalah kontrak.
true
fungsi harus membuang kesalahan.true
implementasi memiliki bug.Baik pra- dan postkondisi harus berupa ekspresi boolean.
Mari kita ambil
empty?
sebagai contoh. Fungsi ini selalu dapat dipanggil, jadi tidak ada prasyarat. Dan fungsinya tidak memiliki efek samping sehingga tidak ada postcondition.Mari kita ambil
pop
contoh lain. Jika fungsi ini menimbulkan pengecualian pada tumpukan kosong, prasyaratnya adalahself.size > 0
, di sisi lain, jika fungsi kembalinil
pada tumpukan kosong tidak ada prasyarat. Keduanya adalah pilihan desain yang valid, tidak akrab dengan pilihan Java. Dalam kedua kasus postcondition adalahself.size = previous.size - 1
karena efek samping kontraktual adalah untuk menghapus elemen.Dan seterusnya …
NB, menggunakan kode semu karena tidak terbiasa dengan OCL.
sumber