具有本机 UML 类型的模板类和模板类的 OCL 约束

Posted

技术标签:

【中文标题】具有本机 UML 类型的模板类和模板类的 OCL 约束【英文标题】:Template classes with native UML types, and OCL constraints for template classes 【发布时间】:2013-11-22 21:11:31 【问题描述】:

我有两个关于同一个 UML 类图的问题。第一个是关于如何使用 UML 原生类型对模板类建模。第二个是关于如何处理 OCL 约束中的模板类。

问题一:模板类

我想为间隔使用模板类并使用 UML 标准来表示它。间隔必须可用于整数和浮点数。到目前为止我发现的最好的方法如下:

这里的想法是有一个模板类,参数TIntegerFloat 类的超类。

我看到的问题是我需要重新定义 UML 的基本类型才能对它们进行分组。我想知道是否有一种干净的方式来定义模板类并说Tintegerfloat 类型(这里是UML 的原语)。

问题 2:模板类的 OCL 约束

我的问题的第二个方面是我希望能够添加 OCL 约束来说明我的间隔必须包含至少 2 个元素。问题是,根据前面类图中T的绑定,规则一定不一样。

对于花车:

context  Interval
inv :    self.supBound > self.infBound

对于整数:

context Interval
inv :   (self.infBoundIncluded and self.supBoundIncluded) implies supBound - infBound >= 1

context Interval
inv :   (not(self.infBoundIncluded) and self.supBoundIncluded) implies supBound - infBound >= 2

context Interval
inv :   (self.infBoundIncluded and not(self.supBoundIncluded)) implies supBound - infBound >= 2

context Interval
inv :   (not(self.infBoundIncluded) and not(self.supBoundIncluded)) implies supBound - infBound >= 3

所以我需要在 OCL 中找到一种方法来说明某些规则仅在 T 绑定到 Integer 时适用,而其他规则在绑定到 Float 时适用。我不是 OCL 方面的专家,也找不到任何有用的信息,所以我寻求帮助。

提前致谢,

巴斯蒂安。

【问题讨论】:

【参考方案1】:

经过更多研究,我得出了以下解决方案:

问题 1

解决方案是使用具有泛型类型的模板类(根据 UML 标准,此类不能实例化),并将其与实现类绑定。对应的UML类图如下:

这里,除了使用 UML 基本类型 integerreal 之外,我们还有两个可用的类 IntegerIntervalRealInterval 从通用模板类 Interval 派生而来。

问题 2

因为整数和实数区间的分离是在类级别完成的,所以 OCL 的区分很简单。因此约束如下:

context IntegerInterval
inv:    ...

context RealInterval
inv:    ...

无论如何,我仍然愿意接受其他建议:)

【讨论】:

以上是关于具有本机 UML 类型的模板类和模板类的 OCL 约束的主要内容,如果未能解决你的问题,请参考以下文章

类和对象

具有派生类的模板化数据类型

如何根据构造型而不是元素类型从 uml 建模项目在 Visual Studio 中生成代码?

类和对象

C++学习34 模板类

模板类与抽象类