2016-01-07 26 views
2

我正在使用一個遺留的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

回答

2

只需標記值來描述。

這與任何活動圖無關。這是一個純靜態部署的事情。因此,您可以創建使用不同標記值進行不同編譯的組件。

編譯時條件告訴你如何生成你的代碼。所以這將轉到您的模型的部分部署。活動圖涉及您的系統的行爲。如果您有一個以某種方式編譯的目標組件,並且您在活動圖中顯示了其不同用法,則可以通過各種方式發出信號。一種是在模型或其他文檔中描述的命名約定。另一種方法是創建需求,以創建一個通用源並將這些需求與活動和後續組件相關聯。作爲(個人)方面的注意事項:編譯時選項的使用(特別是過度使用)會使您的代碼難以閱讀到不可讀的內容。實際上,每次使用編譯時選項都會使源代碼完全不同。所以寧可先從「我想擁有這個函數的源碼,因此傾向於使用編譯器標誌」開始。專注於功能,當涉及到部署時,最終會考慮使用編譯器標誌的「優化」。所以實際上,完全不考慮活動圖。

+0

我已經檢查了有條件定義的函數,並且它們有一個通過自定義原型定義的'PrecompileConfigured'標籤。你的意思是我可以在活動圖塊上以類似的方式使用標籤嗎? –

+1

我離開了一會兒。當我回來時,會回覆更詳細的信息... –

+0

在答案中查看我的其他段落。 –