2015-08-15 20 views
0

假設您有一個程序,其中舊代碼執行相同的工作,除了他們在兩個不同的上下文中執行它:一個在GUI中執行,另一個在一個API中。說你想重構它們爲了合併/合併代碼,所以你只有一個代碼爲API的兩個API &工作。專用函數的行爲取決於調用者/上下文

但有一個問題:代碼段不是100%相同的。與API相比,GUI必須執行一些附加工作(例如在GUI中,所做的每個更改都必須通過撤銷/重做系統,但不在API中,因爲它不使用撤銷/重做)。

所以說你可以合併你代碼片段80%的行爲,但是你剩下20%必須是專用的 API vs GUI(即不能按定義彙集/合併)。

你會如何解決這個問題?

我想到:

  • 創造一種特定的代碼將通過回調(例如函子)被注入一個共同的功能;
  • 或者:創建一個模板常用函數,調用其他模板子函數。由於這些子功能也是模板化的,所以它們可以具有模板專門化,這是API的一個專門化。通用模板化函數的參數化將確保調用正確的子函數的模板特化。

但是,這些解決方案滿足了我:

  • 經過幾個回調函數可真讓其簽名凌亂的速度非常快;當你開始模板化時,你最終可能會模仿大多數涉及的功能(這當然取決於你的代碼,但在我的情況下,這是一個問題)。

任何其他想法的人?

+2

[標籤調度](http://www.generic-programming.org/languages/cpp/techniques.php#tag_dispatching)通常是處理這種情況的一種乾淨方式。但是,現在您的問題太模糊了。請提供您當前代碼的MCVE,以及您提出的兩個解決方案以及與他們的問題,以增加獲得具體和相關答案的可能性。 – Pradhan

回答

0

我不確定我瞭解你的代碼是多麼的複雜,但是對於某些特定的情況,我會傳入一個可選的布爾參數,當這個參數爲true時會發生額外的事情。再次,不完全確定這是否適合這種情況。在這種情況下,GUI會調用通用函數,參數設置爲true,API版本將調用通用函數,參數設置爲false

+0

我忘記提到重構的代碼應該在內核中移動,因此不需要直接在GUI中完成與GUI相關的工作(關注點分離)。因此使用回調。 – gpalex

0

在你的地方,我會考慮委派,你把所有與UI有關的代碼放在這個委託類中。

+0

API專用代碼如何? – gpalex

1

這聽起來像是唯一的區別是GUI做的事情,API不做。如果API所做的事情是GUI不做的,那會影響答案。

-

如果有任何的方式來重構你的代碼,使所有的特殊情況下的東西,在相同的代碼塊發生,你可以把這些代碼塊中的函數的GUI然後調用之後的「常用」功能。

void GUI_Func() 
{ 
    //do some special GUI stuff 

    common_func(); 
} 

void common_func() 
{ 
    //do stuff common to both the GUI and the API 
} 

-

但是,就像你有必然分散在整個功能不同的功能,它的聲音給我。

你提到了一個撤銷/重做系統。該代碼是否可以移入負責處理撤消和重做的類中?在這種情況下,您可以在template<typename UndoRedo>上模板功能。對於GUI表單,您可以在您的撤銷/重做類中傳遞您將通過具有匹配接口的空類傳遞的API表單;儘管沒有任何功能。在編譯時,空類操作將是空操作,並且可能會被編譯器消除。

相關問題