[英]How to express tree structure constraints
您的四個約束不能簡單地使用多重性來表達。
在 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
說,而4說a given system
,而system in 1和2什么都沒有。
假設目標是檢查文件總數小於或等於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()。
非常希望有一些文件系統 class 恰好有一個根文件夾,因此保證了簡單多重性的約束。
可以通過 [0..3] 多重性聲明輕松處理。
由派生屬性幫助緩存的 depth() 助手是一個很好的解決方案。
或者只是: context File inv: Folder->closure(upFolder).size() < n
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.