使用UML表示在C++模板类中定义的typedef

3
我有一个表示UI小部件的模板类。该类被称为(惊奇地)Widget。该类定义了graphics_type(通过typedef或类似方式),它可以是cairo_tHDCCDC*或类似的东西。换句话说,Widget定义了一个名为graphics_type的类型,用于绘制内容。
如何使用UML表示Widgetgraphics_type之间的关系?
额外问题:这种情况下,有没有C++程序员认为UML有用?

1
你是在询问如何在UML类图中表示typedef吗? - Eitan T
不仅如此。这是作为类的公共接口定义的typedef。我该如何表示两者之间的关系? - Agnel Kurian
添加一个注释或评论。我见过一些工具,它们有一个名为 [<<typedef>>|name]typedef 类型的框。我可能会在侧面使用一个带有 <<typedef>> 注释的 uses 关系... 您可以下载并安装 BoUML(据我所知,它处理了 typedef),并反向工程一个小示例以查看它生成了什么。 - David Rodríguez - dribeas
@AgnelKurian typedef只是另一种类型的名称替换,是C++语言的一个特性。UML应该是与语言无关的,它应该完全省略任何特定于语言的特性。话虽如此,我会使用原始类(例如HDC),可能会添加有关类别名的简短注释,但不再多说。至于类之间的关系,只需使用通常的聚合/组合(适合您的设计)。 - Eitan T
我确实可以看到能够很好地表示typedef的好处。例如,如果您正在typedef回调,则无法将其表示为类,但仍然很好以可视方式查看:(typedef int (*foo)(Bar*),其中foo是您要创建的别名)。我想知道是否有人想出了一种表示这种情况的方法。虽然我不认为UML每次都是必需的,但在勾勒模糊算法时,最好在编码之前先使用图表进行操作,以便您拥有某种蓝图。 - Thomas Thorogood
3个回答

3

Sparx EA通过泛化将typedef与别名类型链接起来。至少在从源代码中导入时是这样的。如果stereotype为<<typedef>>,则C++生成模板会重写Class。如果typedef使用模板,EA会插入:

typedef templateName<alias> alias;

否则,它会插入:
typedef aliasedClass alias;

我开始搜索是因为我想要:

typedef aliasedClass* class_ptr;

我不知道如何在UML中表达指针部分。我希望能找到一些标准的方式来表达这个结构,但没有成功。

选项1:创建一个仅用于生成指针的模板: template class _ptr { /* TMTFWIW */ }

选项2:在我的PIM-to-C++ PSM变换中使用标记来插入*

我觉得我会选择选项2。


2

publib.boulder.ibm.com上有很多关于各种主题的文档,包括很多关于UML的内容。对于许多特定于C ++的构造(包括typedef和其他一些构造),他们的规则与@David Rodriguez所述的几乎完全相同。


1

每个人对于UML的有用性都有自己的答案。也许UML对于非常大的项目很好,但我在这里没有什么可说的。

在我的实践中,我发现基于UML图开发代码是不太有效的,因为C++中的类声明本身就非常信息丰富和清晰,特别是如果你在类体外定义方法。制作额外的图表需要同样的时间,但并没有展示出新的东西。

关于类关系图的第二件事是,如果从现有的代码自动生成,它们非常好。例如,Doxygen可以做到这一点。优点是您不需要额外花费时间来学习UML,并且可以轻松检查当前的实现。此外,在打印出来的纸上手动更改这样的图表非常方便进行重构。


我使用UML作为文档工具。我不会从图表中生成代码。我不期望我的图表包含结构的每个细节,并且我认为Doxygen输出难以处理。相反,我的图表是我设计的简洁摘要,我可以向同事展示,以便在尝试解释所提议的层次结构时使用。这并不需要一个“非常大”的项目才能有用;它只需要一个非专家观众(其中包括我的一些同事)。如果您没有使用UML来生成代码,那么很容易快速制作有用的图表。 - Mike C
嗨 @MikeC, 看起来你对Doxygen的经验是基于糟糕的例子。如果正确使用Doxygen,它可以仅显示最重要的信息。即使这种逻辑在代码结构中没有很好地反映出来,您也可以轻松地分离和链接文档的各个部分。您可以省略不必要的细节等。 - Riga

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