Я работаю с унаследованным кодом C, который мне нужно документировать в UML. Нет прямого требования использовать эти 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
вводится на этом языке.
Я проверил функции, которые определены условно, и они имеют тег 'PrecompileConfigured', определенный с помощью настраиваемого стереотипа. Вы имеете в виду, что я могу использовать теги аналогичным образом на блоках диаграмм активности? –
Я на минутку. Ответьте более подробно, когда я вернусь ... –
См. Мои дополнительные параграфы в ответе. –