如何在 UML 类图中绘制 C++ 概念?

6

我该如何在 UML 类图中绘制 C++ 概念?

具体而言,我有以下代码:

template<typename T>
concept Printable = requires(T a, std::ostream &where) {
    { where << a };
};

template<typename T>
concept Identifiable = requires(T a) {
    { a.getId() } -> std::convertible_to<std::string>;
};

template<typename T>
concept Listable = Identifiable<T> && Printable<T>;

接着是一个类:

template<Listable T>
class Liste {
    ...
    void add(T *data);
    ...
}

如果这是一个普通的模板,我会在类角落里放置一个方形T。但概念应该怎么办呢?


不是我的领域,但我认为你可以在模板绑定中简单地放置一个约束条件。 - qwerty_so
1个回答

7

C++概念定义了与模板类相关联的类型的限制条件:

  • 由于 UML 支持 类模板,因此您通常会在花括号之间使用自然语言或 OCL 表达其参数的约束条件。前者在早期设计阶段非常完美。但是如果您需要这种精度级别,也可以考虑以与 C++ 相同的语法来实现它。

  • 或者,您也可以将 C++ 概念视为 UML 中的一种通用类型。然后,您可以在类模板中的模板参数类型定义中以更可读的方式使用该概念。这将更方便阅读,并更接近 C++ 的思想。问题是 UML 中没有预见到定义此类通用类型的方法。因此,您可以使用特定的配置文件扩展 UML,以使用«concept»构造型。然后,您将像定义类一样定义概念,使用UML 约束定义约束条件,并在 UML类模板中使用概念。

下面是第二种方法的实现。注意两个概念之间的依赖关系dependency

enter image description here


2
我喜欢第二种方法。可能会选择那个。 - Finn
只是一个小注释:类并没有在图表中被定义,但它们在那里被展示。 - qwerty_so
@qwerty_so 的确。我们甚至可以提醒一下,在类图中你看不到任何类...只有类的表示;-) 但这种说法只是对马格里特著名艺术品《图像的背叛》的苍白模仿;-) - Christophe
是的,那绝对是我最喜欢的之一(仅次于柏拉图的洞穴寓言)。 - qwerty_so

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接