如何表达树结构约束
How to express tree structure constraints
如何表达以下约束:
1 - 只有一个文件夹不是另一个目录的子目录。
(我无法完全理解 folder/subfolder 主题以及如何描述唯一可能从文件夹系统中排除的内容)
还有一些问题来自第一个问题
2文件夹最高嵌套不超过n个
3) 系统文件总数不能超过n.
4) 给定系统中的文件(子目录)总数不能超过n。
你的四个约束不能简单地用重数来表达。
在 UML 中,可以使用 OCL 编写这些约束,请参阅 formal/2014-02-03
当然可以将约束写在class图中,例如参见formal/2017-12-05第37页图7.14注释符号中的约束。
1 - There is exactly one folder that is not a sub-directory to another directory
一种写法是:
Folder.allInstances()->select(f | f.upfolder->isEmpty())->size() = 1
哪里
Folder.allInstances()
return class 文件夹的实例
Folder.allInstances()->select(f | f.upfolder->isEmpty())
迭代实例和 return 没有 upfolder 的实例
Folder.allInstances()->select(f | f.upfolder->isEmpty())->size() = 1
然后检查是否有一个文件夹没有 upfolder
2 The highest nesting of folders does not exceed the number n
一种方法是定义一个计算文件夹深度的函数,然后检查所有文件夹的深度小于或等于 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) The total number of files on your system can not exceed the number n.
4) The total number of files (subdirectory) in a given system cannot exceed the number n.
我不明白为什么 (subdirectory)
在 4 中也不明白为什么 3 说 on your system
和 4 说 a given system
而 system 在 1 和 2[ 中没有任何内容=80=].
假设目标是检查文件总数小于或等于 n 并且文件夹的文件由属性 file :
Folder.allInstances()->collect(f | f.file.size()).sum() <= n
哪里
Folder.allInstances()->collect(f | f.file.size())
returns所有文件夹的文件数集合
Folder.allInstances()->collect(f | f.file.size()).sum()
return文件总数
不鼓励使用 allInstances()。
非常希望有一些文件系统class只有一个根文件夹,因此保证了简单多重性的约束。
通过 [0..3] 多重性声明很容易处理。
由派生 属性 有用缓存的 depth() 助手是一个很好的解决方案。
或者只是:context File inv: Folder->closure(upFolder).size() < n
- context 文件夹 inv: self->closure(subfolder).File->size() < n
如何表达以下约束:
1 - 只有一个文件夹不是另一个目录的子目录。 (我无法完全理解 folder/subfolder 主题以及如何描述唯一可能从文件夹系统中排除的内容)
还有一些问题来自第一个问题
2文件夹最高嵌套不超过n个
3) 系统文件总数不能超过n.
4) 给定系统中的文件(子目录)总数不能超过n。
你的四个约束不能简单地用重数来表达。
在 UML 中,可以使用 OCL 编写这些约束,请参阅 formal/2014-02-03
当然可以将约束写在class图中,例如参见formal/2017-12-05第37页图7.14注释符号中的约束。
1 - There is exactly one folder that is not a sub-directory to another directory
一种写法是:
Folder.allInstances()->select(f | f.upfolder->isEmpty())->size() = 1
哪里
Folder.allInstances()
return class 文件夹的实例Folder.allInstances()->select(f | f.upfolder->isEmpty())
迭代实例和 return 没有 upfolder 的实例
Folder.allInstances()->select(f | f.upfolder->isEmpty())->size() = 1
然后检查是否有一个文件夹没有 upfolder
2 The highest nesting of folders does not exceed the number n
一种方法是定义一个计算文件夹深度的函数,然后检查所有文件夹的深度小于或等于 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) The total number of files on your system can not exceed the number n.
4) The total number of files (subdirectory) in a given system cannot exceed the number n.
我不明白为什么 (subdirectory)
在 4 中也不明白为什么 3 说 on your system
和 4 说 a given system
而 system 在 1 和 2[ 中没有任何内容=80=].
假设目标是检查文件总数小于或等于 n 并且文件夹的文件由属性 file :
Folder.allInstances()->collect(f | f.file.size()).sum() <= n
哪里
Folder.allInstances()->collect(f | f.file.size())
returns所有文件夹的文件数集合Folder.allInstances()->collect(f | f.file.size()).sum()
return文件总数
不鼓励使用 allInstances()。
非常希望有一些文件系统class只有一个根文件夹,因此保证了简单多重性的约束。
通过 [0..3] 多重性声明很容易处理。
由派生 属性 有用缓存的 depth() 助手是一个很好的解决方案。
或者只是:context File inv: Folder->closure(upFolder).size() < n
- context 文件夹 inv: self->closure(subfolder).File->size() < n