1

OCL で重複をチェックしようとすると、課題に直面しています。

クラス図を単純化すると、次のようになります。

                                       +-----------+
                                       |ChapterName|
                                       +-----------+
                                           ^ 0..* chapterNames
                                           |
                                           ^
                                           V
                 +-------+    books 0..* +----+
                 |Catalog|<>------------>|Book|
                 +-------+               +----+
      catalogs 0..* ^                       ^ 0..* books
                    |                       | 
                  +----+  customers 0..* +--------+
                  |Shop|<>-------------->|Customer|
                  +----+                 +--------+

各クラスの属性は次のように宣言されます。

  • 章名
    • 名前
  • カタログ
    • カテゴリー

問題: 私が確認したいのは、カタログの特定のカテゴリにも属している章名が重複している本を顧客が持っているかどうかです。

私は論理を理解することができませんでした。私がこれまでに持っているものは次のとおりです。

context Shop
self.customers.books->select(cubks | cubks =
  self.catalogs.books->select(cabks | cabks = cubks)->first())

・・・お客様がお持ちのカタログから本を探します。

質問:上記の問題を解決するために、さらに制約を追加するにはどうすればよいですか?

また。Eclipse 内から Eclipse、EMF、および OCL コンソールを使用しています。

4

1 に答える 1

1
context Shop::checkForDuplicates(catalog:Catalog)
post: result = 
     self.customer.books->flatten()->select(book|
       catalog.books->contains(book)
     )->forEach(book|
       chapterNames->asSet()->size()=chapterNames->size()
     )

customerですSetbooksは aBagまたは a のいずれかです (重複した本が許可されているかどうかに応じて、問題ではありませんSetが、 a であると仮定します)。Bag次にcustomer.books、書籍のバッグのバッグ (顧客ごとに 1 つのバッグ) でcustomer.books->flatten()あり、顧客が所有するすべての書籍のバッグです。

catalog.booksaBagまたは a Set(どちらでも構いません) です。この操作は、指定された に含まれる (および前に構築されたバッグから選択しているため、some に属する)select本のみを返します。catalogCustomer

book.chapterNamesその本の章の名前を持つSequence(関連付けが順序付けられていると仮定します)です。コレクション内のすべての要素 (つまり、顧客が所有する特定のカタログ内のすべての本) に対して iff をforAll返し、本体は として評価されます。truetrue

Sequence::asSet()ここでのトリックは、重複を削除してシーケンスからすべての要素を返す操作に依存しています。次に、要素が削除されていない場合 (つまり、すべての要素が一意である場合)、バッグのサイズはセットのサイズと等しくなります。

于 2013-03-01T02:47:09.417 に答える