首页 > 解决方案 > 如何表达树结构约束

问题描述

如何表示以下约束:

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

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

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

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

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

uml 图

标签: umldiagramocl

解决方案


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

在 UML 中,这些约束可以使用 OCL 编写,参见正式/2014-02-03

当然,约束可以写在类图中,例如参见正式/2017-12-05的注释符号页 37 中的图 7.14 约束。

1 - 恰好有一个文件夹不是另一个目录的子目录

一种写法是:

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

在哪里

  • Folder.allInstances()返回类文件夹的实例
  • Folder.allInstances()->select(f | f.upfolder->isEmpty())迭代实例并返回没有上文件夹的实例
  • Folder.allInstances()->select(f | f.upfolder->isEmpty())->size() = 1然后检查是否有一个没有上文件夹的文件

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对所有元素都为真,则where为真

但它只对计算没有子文件夹的文件夹的深度有用,所以

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

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

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

我不明白为什么(subdirectory)in 4也不明白为什么3on your system4说,而system in 12a given system什么都没有。

假设目标是检查文件总数小于或等于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()返回文件总数

推荐阅读