Uml 如何表达树结构约束

Uml 如何表达树结构约束,uml,diagram,ocl,Uml,Diagram,Ocl,如何表达以下约束条件: 1-只有一个文件夹不是另一个目录的子目录。 (我无法完全理解文件夹/子文件夹主题以及如何描述文件夹系统中唯一可能的排除) 还有一个来自第一个问题的问题 2文件夹的最高嵌套数不超过n。 3)系统上的文件总数不能超过数字n。 4)给定系统中的文件(子目录)总数不能超过n。 您的四个约束不能简单地使用多重性来表示 在UML中,这些约束可以使用OCL编写,请参见 当然,约束可以写在类图中,例如,参见第37页的注释符号中的图7.14约束 1-只有一个文件夹不是另一个目录的子目录 一

如何表达以下约束条件:

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

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

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

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

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


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

在UML中,这些约束可以使用OCL编写,请参见

当然,约束可以写在类图中,例如,参见第37页的注释符号中的图7.14约束

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

一种写作方法是:

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

  • Folder.allInstances()
    返回类文件夹的实例
  • Folder.allInstances()->选择(f | f.upfolder->isEmpty())
    迭代实例并返回没有upfolder的实例
  • Folder.allInstances()->选择(f | f.upfolder->isEmpty())->size()=1
    然后检查是否有一个文件夹没有upfolder
2文件夹的最高嵌套数不超过n

一种方法是定义一个计算文件夹深度的函数,然后检查所有文件夹的深度是否小于或等于n

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

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

我不明白为什么4中的
(子目录)
,也不明白为什么3在您的系统上说
4
一个给定的系统
,而12中没有关于系统的内容

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

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

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

    在UML中,这些约束可以使用OCL编写,请参见

    当然,约束可以写在类图中,例如,参见第37页的注释符号中的图7.14约束

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

    一种写作方法是:

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

    • Folder.allInstances()
      返回类文件夹的实例
    • Folder.allInstances()->选择(f | f.upfolder->isEmpty())
      迭代实例并返回没有upfolder的实例
    • Folder.allInstances()->选择(f | f.upfolder->isEmpty())->size()=1
      然后检查是否有一个文件夹没有upfolder
    2文件夹的最高嵌套数不超过n

    一种方法是定义一个计算文件夹深度的函数,然后检查所有文件夹的深度是否小于或等于n

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

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

    我不明白为什么4中的
    (子目录)
    ,也不明白为什么3在您的系统上说
    4
    一个给定的系统
    ,而12中没有关于系统的内容

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

    Folder.allInstances()->collect(f | f.file.size()).sum()collect(f | f.file.size())
    返回所有文件夹的文件数集合
  • Folder.allInstances()->collect(f | f.file.size()).sum()
    返回文件总数
    • 不鼓励使用allInstances()

    • 非常希望某个文件系统类正好有一个根文件夹,因此可以在简单的多重性中保证约束

    • 可通过[0..3]重数声明轻松处理

    • 由派生属性缓存的depth()帮助器是一个很好的解决方案

    • 或者只是:上下文文件inv:Folder->closure(upFolder).size()
    • 上下文文件夹inv:self->closure(子文件夹).File->size() 不鼓励使用allInstances()

    • 非常希望某个文件系统类正好有一个根文件夹,因此可以在简单的多重性中保证约束

    • 可通过[0..3]重数声明轻松处理

    • 由派生属性缓存的depth()帮助器是一个很好的解决方案

    • 或者只是:上下文文件inv:Folder->closure(upFolder).size()
    • 上下文文件夹inv:self->closure(子文件夹).File->size()
      你的问题是什么?哦,对不起。编辑。我应该在UML中定义列出的约束,可能一个子目录到另一个目录意味着另一个目录的子目录。在4中
      (子目录)
      的目标是什么?为什么在1和2中没有提到系统,但在3和4中它是您的系统a
      Folder.allInstances()
        ->select(f | f.subfolder->isEmpty())
           ->forAll(f | f.depth() <= n)
      
      Folder.allInstances()->collect(f | f.file.size()).sum() <= n