7.5.4 导航到关联类

为了指定到关联类(示例中的Job和Marriage)的导航,OCL使用点号和关联类的名称:

context Person inv:
    self.Job

子表达式self.Job计算为一个集合,包含了一个人在其所有雇主公司的工作。对于一个关联类,类图中国没有显式的角色名。此处导航中使用的名称Job是关联类的名称。

对于一个到类自身的关联,光有关联类的名称还不够。我们还需要区分关联的方向。以如下的模型为例:

图7.3 Navigating recursive association classes

当导航到像EmployeeRanking这样的关联类是,根据不同的方向有两种可能。例如,在上面的示例中,我们可以导航到employees端,或者是boxes端。只是单独地使用关联类的名称,这两种情况是无法区分的。为了能够区分,需要把目标方向的角色名称加到关联名称,放在方括号内。如下:

context Person inv:
    self.EmployeeRanking[bosses]->sum() > 0

self.EmployeeRanking[bosses]计算为属于bosses集合的EmployeeRanking集合。在如下的表达式:

context Person inv:
    self.EmployeeRanking[Employees]->sum() > 0

self.EmployeeRanking[bosses]计算为属于employees集合的EmployeeRanking集合。在这样的自身关联的清晰下,是不允许使用没有限定的关联类名称的。因此,如下的示例是无效的:

context Person inv:
    self.EmployeeRanking->sum() > 0 -- 无效!

在一个不是到自身的关联情况下,只有关联名就够了,尽管也允许使用限定的版本。因此,本节开始的示例也可以写为:

context Person inv:
    self.Job[employer]

results matching ""

    No results matching ""