我正在使用遗留的C代码,我需要用UML进行记录。没有立即要求使用这些UML图表进行综合,但是希望将来能够朝这个方向发展。
现在,代码中充斥着可以在编译时启用或禁用的功能:
#if(FEATURE_X == ON)
deal_with_x();
#endif
由于无法区分UML中的编译时和运行时条件(有吗?),我最终对两者使用相同的决策块,这意味着我的图表实际上代表了以下代码:
if(FEATURE_X == ON) {
deal_with_x();
}
虽然我希望编译器在禁用功能X时消除调用,但至少有两个原因,这不是完全相同的代码:
deal_with_x()
处理这种情况的正确方法是什么?是否有UML功能我不知道这可能会有所帮助?或者我应该为不同的配置创建单独的活动图(非常重要)?或者我应该依赖编译器来消除不必要的调用并避免完全使用预编译器指令?
虽然我的问题是关于C代码和预编译器指令,但我可以看到C ++模板可能会出现同样的问题,特别是如果在语言中引入了static if
。
答案 0 :(得分:2)
只需使用标记值来描述它。
这与任何活动图无关。这是纯静态部署的事情。因此,您可以创建使用不同标记值进行不同编译的组件。
编译时条件告诉您如何生成代码。因此,这将转到模型的某些部署部分。活动图表示系统的行为。如果您有一个以一种或另一种方式编译的目标组件,并且您在活动图中显示其不同的用法,您可以通过各种方式发出信号。一种是命名约定,在模型中的其他位置或随附的文档中进行描述。另一种方法是创建需求,声明创建公共源并将这些需求链接到活动和后面的组件。
作为(个人)的注意事项:编译时选项的使用(尤其是过度使用)会使您的代码难以阅读而无法阅读。实际上,每次使用编译时选项都会使同一个源完全不同。因此,首先要使用"我希望为此函数提供相同的源,因此倾向于使用编译器标志"走另一条路。专注于功能,当涉及到部署时,最终会想到"优化"使用编译器标志。所以实际上,完全不考虑活动图。