c++ - 如何在 UML 事件图中表示编译时条件?

标签 c++ c uml precompile rhapsody

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

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

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

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

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

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

  • deal_with_x() 即使功能 X 被禁用也必须定义
  • 静态代码分析会提示死代码

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

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

最佳答案

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

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

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

作为(个人)旁注:编译时选项的使用(尤其是过度使用)会使您的代码难以阅读甚至不可读。事实上,每次使用编译时选项都会使相同的源代码变得完全不同。因此,从“我希望此函数具有相同的源代码,因此倾向于使用编译器标志”开始,则相反。专注于功能,当涉及到部署时,最终会想到使用编译器标志的“优化”。所以实际上,完全不考虑事件图。

关于c++ - 如何在 UML 事件图中表示编译时条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34652735/

相关文章:

uml - 如何在 UML 对象图中显示多重性

C++ 聚合关系创建

c++ - CECUI 示例编译成功但未生成可执行文件

android - 'sizeof(off_t) != 8' 在为 android 编译 libfuse 时

c - 如何防止在 USB 传输中丢失数据?

c - 如何避免模乘法溢出?

c# - 使用 Visual Studio 进行系统架构和设计 - 真实世界示例

c++ - 找不到 timeBeginPeriod 标识符错误

c++ - 在 linux 下链接库时 Cython 构建问题

javascript - 在 C++ 中调试使用 IWebBrowser2 呈现的 javascript/html