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

3

我正在使用一份遗留的C代码,需要将其文档化为UML。目前没有立即使用UML图进行合成的要求,但未来有望朝这个方向发展。

现在,该代码具有许多在编译时可以启用或禁用的特性:

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

由于在UML中无法区分编译时和运行时条件(是吗?),因此我最终使用相同的决策块来处理两者,这意味着我的图表实际上代表以下代码:

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

虽然我希望当功能 X 被禁用时编译器会消除调用,但至少有两个原因使得代码并不完全相同:

  • deal_with_x() 必须被定义,即使功能 X 被禁用
  • 静态代码分析将抱怨无用代码

应该如何处理这种情况呢?是否有我不知道的 UML 功能可以帮助解决?还是应该为不同的配置创建单独的活动图(需要很多工作)?或者应该依赖编译器消除不必要的调用并避免使用预编译指令?

尽管我的问题是关于 C 代码和预编译指令的,但我可以看到在 C++ 模板中也可能出现相同的问题,特别是如果语言引入 static if

1个回答

2

只需使用标记值来描述它。

这与任何活动图无关,纯粹是静态部署的事情。因此,您可以创建使用不同标记值进行不同编译的组件。

编译时条件告诉您如何生成代码。因此,这将进入模型的某个部署部分。活动图涉及系统的行为。如果您有一个目标组件以一种或另一种方式进行编译,并且在活动图中显示其不同的用法,则可以通过各种方式发出信号。一种方式是使用命名约定,在模型的其他地方或附带文档中进行描述。另一种方式是创建要求,指示创建公共源并将这些要求链接到活动和后续组件。

作为(个人)副笔记:编译时选项的使用(尤其是过度使用)会使您的代码难以阅读,甚至无法阅读。实际上,每次使用编译时选项都会使相同的源代码变成完全不同的东西。因此,最好从“我想要为此函数使用相同的源代码,因此倾向于使用编译器标志”开始,集中精力于功能,当涉及部署时,再考虑“优化”以使用编译器标志。因此,实际上,将有关编译时选项的思考完全从活动图中排除。


我已经检查了有条件定义的函数,并且它们通过自定义原型定义了一个PrecompileConfigured标签。您的意思是我可以在活动图块上类似地使用标签吗? - Dmitry Grigoryev
请查看我的答案中的额外段落。 - qwerty_so

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