如何表达树结构约束

问题描述

如何表达以下约束:

1 - 正好有一个文件夹不是另一个目录的子目录。 (我无法完全理解文件夹/子文件主题以及如何描述文件夹系统中唯一一个可能的排除项)

还有一些来自第一个问题的问题

2 文件夹的最高嵌套数不超过 n。

3) 您系统上的文件总数不能超过 n。

4) 给定系统中的文件(子目录)总数不能超过 n。

The uml diagram

解决方法

不能简单地使用多重性来表达您的四个约束。

在 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) 也不明白为什么 3on your system4 说 {{ 1}} 而 12 中没有关于 system 的内容。

假设目标是检查文件总数小于或等于 n 并且文件夹的文件由属性 file 给出:

a given system

哪里

  • Folder.allInstances()->collect(f | f.file.size()).sum() <= n 返回所有文件夹的文件数的集合
  • Folder.allInstances()->collect(f | f.file.size()) 返回文件总数
,

不鼓励使用 allInstances()。

  1. 最好有一些 FileSystem 类,它正好有一个根文件夹,从而保证简单的多重性约束。

  2. 可以通过 [0..3] 多重性声明轻松处理。

  3. 由派生属性缓存的 depth() 助手是一个很好的解决方案。

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

  1. context Folder inv: self->closure(subfolder).File->size()