7

OCL 式に関するいくつかの質問に出くわしました。いくつかの大学のスライドを読んでグーグルで調べた後でも、まだ正しく理解できません。

このことを理解するために読むべき良いリソースを知っている人がいるのだろうか.


気になる制約:

  1. 部門で働く全員が同じマネージャーを持っています。
  2. 会社の誰も彼/彼女自身のマネージャーではありません。
  3. 会社の誰も彼のマネージャーよりも稼いでいません。

私が持っている最初のものについて:

コンテキスト部門

inv self.stuff -> forAll(manager = self.staff.manager)

2つ目:

コンテキスト 会社

inv self.employee -> select(manager = manager.manager) -> isEmpty()

3つ目:

コンテキスト 会社

inv self.employee -> select(salary > manager.salary) -> isEmpty()

しかし、私はこれらが正しいとは思いません。私が最も確信が持てないのは、例 2 と 3 で個々の従業員を実際のマネージャー/マネージャーの給与と実際に比較しているかどうかです。

4

4 に答える 4

5

最後にいいものを手に入れた!

これは、Object Management Group (OMG) の非常に有益なドキュメント (PDF) です。

オブジェクト制約言語仕様

私は自分の質問に答えるのが大好きです:)

于 2009-05-23T19:56:50.567 に答える
4

初心者には、Jos Warmer と Anneke Kleppe による The Object Constraint Language: Getting Your Models Ready for MDA (Jos は OCL の主な作成者の 1 人) をお勧めします。

この無料のOCL チュートリアル(pdf + スライド)もあります。

また、あなたが既に見つけた公式仕様 (特に、言語の非公式な説明を提供する章) も気に入っています。

于 2009-05-23T21:41:17.253 に答える
4

@Artur によって投稿された PDF ファイルへのリンクが変更されました。新しいリンクは次のとおりです http://www.omg.org/spec/OCL/2.0/PDF/

于 2010-09-16T10:00:58.410 に答える
3

制約に関する簡単な解決策:

コンテキスト部門 inv: self.staff -> forAll(s1,s2| s1.manager = s2.manager)

context Company inv: self.employee->forAll(e| e.manager<>e)

コンテキスト 会社 inv: self.employee->forAll(e| e.salary<=e.manager.salary)

ところで、Company クラスの必要性はあまりわかりません (システム内に会社タイプのオブジェクトがいくつありますか?)。制約 2 と 3 がすべての会社に当てはまる場合、Person をコンテキストとして次のように使用して表現できます (例: 番号 2): context Person inv: self.manager<>self)

比較を行う前に、従業員にマネージャーがいるかどうかを確認するチェックを追加することもできます

于 2009-05-23T23:02:27.540 に答える