簡體   English   中英

如何表達樹結構約束

[英]How to express tree structure constraints

如何表示以下約束:

1 - 恰好有一個文件夾不是另一個目錄的子目錄。 (我無法完全理解文件夾/子文件夾主題以及如何描述文件夾系統中唯一可能的排除項)

還有一些問題來自第一個問題

2 文件夾的最高嵌套數不超過n。

3)您系統上的文件總數不能超過數量n。

4)給定系統中文件(子目錄)的總數不能超過數量n。

uml 圖

您的四個約束不能簡單地使用多重性來表達。

在 UML 中,這些約束可以使用 OCL 編寫,參見正式/2014-02-03

當然,約束可以寫在 class 圖中,例如參見正式/ 2017-12-05的注釋符號頁 37 中的圖 7.14 約束

1 - 恰好有一個文件夾不是另一個目錄的子目錄

一種寫法是:

Folder.allInstances()->select(f | f.upfolder->isEmpty())->size() = 1

在哪里

  • Folder.allInstances()返回 class文件夾的實例
  • Folder.allInstances()->select(f | f.upfolder->isEmpty())迭代實例並返回沒有上文件夾的實例
  • Folder.allInstances()->select(f | f.upfolder->isEmpty())->size() = 1然后檢查是否有一個文件夾沒有文件夾

2 文件夾的最高嵌套數不超過n

一種方法是定義一個 function 計算文件夾的深度,然后檢查所有文件夾的深度小於或等於n

context Folder
def: depth() : Integer =
  if upfolder->notEmpty() then
    upfolder->first().depth() + 1
  else
    0

Folder.allInstances()->forAll(f | f.depth() <= n)

如果條件depth() <= n對於所有元素都為真,則forAll為真

但它只對計算沒有子文件夾的文件夾的深度有用,所以

Folder.allInstances()
  ->select(f | f.subfolder->isEmpty())
     ->forAll(f | f.depth() <= n)

3)您系統上的文件總數不能超過數量n。

4)給定系統中文件(子目錄)的總數不能超過數量n。

我不明白為什么(subdirectory) in 4也不明白為什么3 on your system說,而4a given system ,而system in 12什么都沒有。

假設目標是檢查文件總數小於或等於n並且文件夾的文件由屬性file給出:

Folder.allInstances()->collect(f | f.file.size()).sum() <= n

在哪里

  • Folder.allInstances()->collect(f | f.file.size())返回所有文件夾的文件數的集合
  • Folder.allInstances()->collect(f | f.file.size()).sum()返回文件總數

不鼓勵使用 allInstances()。

  1. 非常希望有一些文件系統 class 恰好有一個根文件夾,因此保證了簡單多重性的約束。

  2. 可以通過 [0..3] 多重性聲明輕松處理。

  3. 由派生屬性幫助緩存的 depth() 助手是一個很好的解決方案。

或者只是: context File inv: Folder->closure(upFolder).size() < n

  1. 上下文文件夾 inv: self->closure(subfolder).File->size() < n

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM