如何在 UML class 图中绘制 C++ 概念?
How can I draw C++ concepts in UML class diagram?
如何在 UML class 图中绘制 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>;
然后 class:
template<Listable T>
class Liste {
...
void add(T *data);
...
}
如果是常规模板,我会把 T
放在 class 角落的一个正方形中。但是概念呢?
C++ concepts 定义了与模板关联的类型的约束 class:
因为 UML 支持 class template, you would typically express this constraints 作为其参数,在自然语言或 OCL 中的大括号之间。前者在早期设计阶段是完美的。但是,如果您需要这种级别的准确性,您也可以考虑使用与 C++ 相同的语法而不是自然语言来务实地表达它。
或者,您也可以将 C++ 概念作为 UML 中的一种泛型来处理。然后,您可以在 class 模板中的模板参数的类型定义中以更易读的方式使用该概念。这样读起来会更方便,也更接近C++的思想。问题是在 UML 中没有预见到定义这种泛型类型。因此,您可以使用 and-hoc profile to use a «concept»
stereotype. You would then define concepts exactly like classes, define the constraints using the UML constraints, and use the concepts in UML class templates.
扩展 UML
这里是第二种方法的样子。注意两个概念之间的实现dependency:
如何在 UML class 图中绘制 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>;
然后 class:
template<Listable T>
class Liste {
...
void add(T *data);
...
}
如果是常规模板,我会把 T
放在 class 角落的一个正方形中。但是概念呢?
C++ concepts 定义了与模板关联的类型的约束 class:
因为 UML 支持 class template, you would typically express this constraints 作为其参数,在自然语言或 OCL 中的大括号之间。前者在早期设计阶段是完美的。但是,如果您需要这种级别的准确性,您也可以考虑使用与 C++ 相同的语法而不是自然语言来务实地表达它。
或者,您也可以将 C++ 概念作为 UML 中的一种泛型来处理。然后,您可以在 class 模板中的模板参数的类型定义中以更易读的方式使用该概念。这样读起来会更方便,也更接近C++的思想。问题是在 UML 中没有预见到定义这种泛型类型。因此,您可以使用 and-hoc profile to use a
扩展 UML«concept»
stereotype. You would then define concepts exactly like classes, define the constraints using the UML constraints, and use the concepts in UML class templates.
这里是第二种方法的样子。注意两个概念之间的实现dependency: