ภาษาข้อ จำกัด ของวัตถุ (OCL) สำหรับสแต็กในแพคเกจ java.util


10

ฉันมีการสอบขึ้นมาและฉันกำลังดูเอกสารที่ผ่านมาเพื่อรับแนวคิดบางอย่างเกี่ยวกับสิ่งที่คาดหวัง ฉันติดอยู่กับสิ่งต่อไปนี้และจะซาบซึ้งจริง ๆ ถ้ามีคนให้คำตอบตัวอย่าง

เขียนเงื่อนไขเบื้องต้นและ postconditions ใน OCL สำหรับแต่ละการดำเนินการดังต่อไปนี้ (รวมอยู่ในสแต็คคลาสในแพ็คเกจ java.util):

  • (1) บูลีนว่างเปล่า () - ทดสอบว่าสแต็กนี้ว่างเปล่าหรือไม่
  • (2) E peek () - ดูที่วัตถุที่ด้านบนของสแต็กนี้โดยไม่ลบออกจากสแต็ก
  • (3) E pop () - ลบวัตถุที่ด้านบนของสแต็กนี้และส่งคืนวัตถุนั้นเป็นค่าของการดำเนินการนี้
  • (4) E push (รายการ E) - กดรายการลงบนสุดของสแต็กนี้

นี่ E หมายถึงประเภทขององค์ประกอบในสแต็ก

ความพยายามของฉันมีดังนี้

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. 

ฉันก็ไม่รู้เหมือนกันว่าฉันควรจะอ้างอิงองค์ประกอบในกอง ตัวอย่างเช่น: self.elements -> IsEmpty () = true

หากใครสามารถช่วยฉันออกฉันจะขอบคุณมันจริงๆ

แก้ไข

เพื่อนมีความคิดดังต่อไปนี้:

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

หากคุณไม่ได้รับความช่วยเหลือที่นี่คุณสามารถลองกลุ่ม UMLforum บน Google Groups
สตีเฟ่นซี

1
หรืออาจจะอยู่ใน StackOverflow :-)
Stephen C

คุณสามารถค้นหาตัวอย่าง OCL ตัวอย่างได้ที่นี่: www-st.inf.tu-dresden.de/Lehre/WS01-02/fs/slides/fss5a-sl.pdf
Axel Kemper

การบรรยายเกี่ยวกับ OCL 2.0: st.inf.tu-dresden.de/files/general/OCLByExampleLecture.pdf
Axel Kemper

คำตอบ:


1

ก่อนและหลังเป็นสัญญา

  • Precondition เป็นส่วนหนึ่งของสัญญาที่ผู้โทรต้องปฏิบัติตาม หากไม่มีเงื่อนไขก่อนtrueกำหนดฟังก์ชันต้องส่งข้อผิดพลาด
  • Postcondition เป็นส่วนหนึ่งของสัญญาที่จะต้องพบกับหน้าที่และอธิบายถึงการเปลี่ยนแปลงที่คาดว่าจะเป็นวัตถุ / โลก หาก postcondition ไม่ใช่trueการนำไปใช้งานจะมีข้อบกพร่อง

ทั้งก่อนและหลังเงื่อนไขจะต้องเป็นนิพจน์บูลีน

ลองมาempty?เป็นตัวอย่าง สามารถเรียกใช้ฟังก์ชันนี้ได้ตลอดเวลาดังนั้นจึงไม่มีเงื่อนไขล่วงหน้า และฟังก์ชั่นนี้ไม่มีผลข้างเคียงดังนั้นจึงไม่มีการเลื่อนภายหลัง

ลองpopอีกตัวอย่างหนึ่ง ถ้าฟังก์ชั่นนี้ยกข้อยกเว้นในสแต็คที่ว่างเปล่าเงื่อนไขเบื้องต้นคือself.size > 0ในทางกลับกันหากฟังก์ชันส่งคืนnilบนสแต็กที่ว่างเปล่าจะไม่มีเงื่อนไขล่วงหน้า ทั้งคู่เป็นตัวเลือกการออกแบบที่ถูกต้องไม่คุ้นเคยกับตัวเลือกของ Java ในทั้งสองกรณี postcondition คือself.size = previous.size - 1เพราะผลข้างเคียงตามสัญญาคือการลบองค์ประกอบ

และอื่น ๆ ...

NB, ใช้รหัสหลอกเนื่องจากไม่คุ้นเคยกับ OCL

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.