java.utilパッケージのスタックのオブジェクト制約言語(OCL)


10

私は試験が近づいています。私は過去の論文を調べて、何が期待できるかを考えています。私は次のものに少しこだわっていて、誰かがいくつかの例の答えを出すことができれば本当に感謝します。

次の各操作(java.utilパッケージのStackクラスに含まれる)のOCLに前提条件と事後条件を記述します。

  • (1)ブールempty()-このスタックが空かどうかをテストします
  • (2)E peek()-スタックから削除せずに、このスタックの最上部にあるオブジェクトを調べます
  • (3)E pop()-このスタックの一番上のオブジェクトを削除し、そのオブジェクトをこの操作の値として返します
  • (4)E push(E item)-アイテムをこのスタックの一番上にプッシュします

ここで、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

ここで助けが得られない場合は、GoogleグループでUMLforumグループを試すことができます。
スティーブンC

1
または多分StackOverflowで:-)
スティーブンC

例示的なOCLサンプルは次の場所に
Axel Kemper

回答:


1

事前条件と事後条件は契約です。

  • 前提条件は、発信者が満たす必要のある契約の一部です。前提条件が満たされていない場合、true関数はエラーをスローする必要があります。
  • 事後条件は、関数が満たす必要があるコントラクトの一部であり、オブジェクト/ワールドに予想される変更を記述します。事後条件がそうでない場合、true実装にバグがあります。

事前条件と事後条件の両方がブール式である必要があります。

empty?例を見てみましょう。この関数はいつでも呼び出すことができるため、前提条件はありません。また、この関数には副作用がないため、事後条件はありません。

pop別の例を見てみましょう。この関数が空のスタックで例外を発生させる場合、前提条件はself.size > 0ですが、関数がnil空のスタックで戻る場合、前提条件はありません。どちらも有効な設計選択であり、Javaの選択に精通していません。どちらの場合でも、事後条件はself.size = previous.size - 1、契約上の副作用が要素を削除することであるためです。

等々 …

注:OCLに慣れていないため、疑似コードを使用しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.