如何在 UML activity 图中表示编译时条件?

How can compile-time conditions be represented in UML activity diagrams?

我正在处理遗留的 C 代码,我需要将其记录在 UML 中。没有立即要求使用这些 UML 图进行综合,但希望将来朝这个方向发展。

现在,代码充满了可以在编译时启用或禁用的功能:

#if(FEATURE_X == ON)
    deal_with_x();
#endif

由于在 UML 中无法区分编译时和 运行 时条件(是吗?),我最终对两者使用了相同的决策块,这意味着我的图表真正代表了以下代码:

if(FEATURE_X == ON) {
    deal_with_x();
}

虽然我希望编译器在功能 X 被禁用时消除调用,但由于至少两个原因,这不是完全相同的代码:

处理这种情况的正确方法是什么?是否有我不知道的 UML 功能可以提供帮助?或者我应该为不同的配置创建单独的 activity 图表(相当的工作)?或者我应该依靠编译器来消除不必要的调用并完全避免使用预编译器指令?

虽然我的问题是关于 C 代码和预编译器指令,但我可以看到 C++ 模板也会出现同样的问题,特别是如果 static if 被引入语言中。

只需使用标记值来描述即可。

这与任何 activity 图无关。这是一个纯静态部署的东西。因此,您可以创建使用不同标记值进行不同编译的组件。

Compile-time 条件告诉您如何生成代码。所以这将进入模型的某些部署部分。 activity 图是指系统的行为。如果您有一个以一种或另一种方式编译的目标组件,并且您在 activity 图表中显示了它的不同用法,您可以通过各种方式表示这一点。一个是命名约定,它在模型或随附文档的其他地方进行了描述。另一种方法是创建需求,声明创建一个公共源和 link 对活动和后续组件的需求。

作为(个人)旁注:编译时选项的使用(尤其是 over-usage)会使您的代码难以阅读甚至无法阅读。事实上,每次使用编译时选项都会使相同的源代码变得完全不同。所以宁愿从 "I want to have the same source for this function and therefore tend to use compiler-flags" 开始走另一条路。专注于功能,当涉及到部署时,最终会想到 "optimization" 使用编译器标志。所以实际上,完全不考虑 activity 图表。