问题描述
如何表达以下约束:
1 - 正好有一个文件夹不是另一个目录的子目录。 (我无法完全理解文件夹/子文件夹主题以及如何描述文件夹系统中唯一一个可能的排除项)
还有一些来自第一个问题的问题
2 文件夹的最高嵌套数不超过 n。
3) 您系统上的文件总数不能超过 n。
4) 给定系统中的文件(子目录)总数不能超过 n。
解决方法
不能简单地使用多重性来表达您的四个约束。
在 UML 中,可以使用 OCL 编写这些约束,请参阅 formal/2014-02-03
当然,约束可以写在类图中,例如参见图 7.14 注释符号中的约束 formal/2017-12-05 的第 37 页。
1 - 正好有一个文件夹不是另一个目录的子目录
一种写法是:
Folder.allInstances()->select(f | f.upfolder->isEmpty())->size() = 1
哪里
-
Folder.allInstances()
返回类 Folder 的实例
-
Folder.allInstances()->select(f | f.upfolder->isEmpty())
迭代实例并返回没有upfolder 的实例
-
Folder.allInstances()->select(f | f.upfolder->isEmpty())->size() = 1
然后检查有一个没有 upfolder 的文件夹
2 文件夹的最高嵌套数不超过 n
一种方法是定义一个计算文件夹深度的函数,然后检查所有文件夹的深度小于或等于n
context Folder
def: depth() : Integer =
if upfolder->notEmpty() then
upfolder->first().depth() + 1
else
0
Folder.allInstances()->forAll(f | f.depth() <= n)
如果条件 forAll
对所有元素都为真,则 depth() <= n
为真
但是只有计算没有子文件夹的文件夹的深度才有用,所以
Folder.allInstances()
->select(f | f.subfolder->isEmpty())
->forAll(f | f.depth() <= n)
3) 您系统上的文件总数不能超过 n。
4) 给定系统中的文件(子目录)总数不能超过 n。
我不明白为什么 4 中的 (subdirectory)
也不明白为什么 3 说 on your system
而 4 说 {{ 1}} 而 1 和 2 中没有关于 system 的内容。
假设目标是检查文件总数小于或等于 n 并且文件夹的文件由属性 file 给出:
a given system
哪里
-
Folder.allInstances()->collect(f | f.file.size()).sum() <= n
返回所有文件夹的文件数的集合 -
Folder.allInstances()->collect(f | f.file.size())
返回文件总数
不鼓励使用 allInstances()。
-
最好有一些 FileSystem 类,它正好有一个根文件夹,从而保证简单的多重性约束。
-
可以通过 [0..3] 多重性声明轻松处理。
-
由派生属性缓存的 depth() 助手是一个很好的解决方案。
或者只是:context File inv: Folder->closure(upFolder).size()
- context Folder inv: self->closure(subfolder).File->size()