2010-11-05 58 views
4

這是一個問題更多關於如何建立一個C++應用程序比它是關於C++本身你如何建立C中的應用程序++模塊化

我建設所預期實現的圖形應用程序應用程序,但實現的細節需要大量的抽象功能來促進接口,例如從文件,Web資源等讀取對象列表。我已經想出瞭如何實現這個功能沒有太大困難,但我有沒有好的方法來測試它。具體來說,我已經開始實施圖形環境,但尚未準備好使用較低級別的功能。

我也建立了很多我想讓底層做的事情,但它尚未經過測試。所有這些代碼都駐留在一個文件夾中,並存儲在版本控制系統中,並進行常規提交。

我對C++編寫的任何功能都比較陌生,但迄今爲止只能在類項目上工作,但我已在PHP中編寫了大量各種類型的程序。

如果這是一個PHP項目,現在看來,這將是簡單測試的所有功能:

  1. 我只想通過交互實現它
  2. 開始編纂成一個小文件
  3. 寫一些使用功能的代碼
  4. 將其構建到函數中
  5. 將該函數導入到我的較大代碼體中。

這似乎是一個非常尷尬的方式來做同樣的C++。我有沒有把它全部倒退,你如何解決小的孤立問題,在你編譯的程序中,並將它們導入到你的項目中;有沒有一個工作流程,你覺得有幫助。

回答

1

我想這將是所有面向對象項目的一般策略。

首先確定主要組件,並確保您對每件事都負責的有一個非常透徹的理解。

寫出每個組件的接口,並檢查(邏輯)以查看它是否適合您的問題。

實現每個模塊。

就測試而言,測試模塊(存根):例如,創建一個類,將輸入發送到GUI模仿實際組件發送的輸入。既然你對界面有了清晰的認識,那麼這個結果如何產生將是無關緊要的。

對系統中的每個組件重複此過程,然後將它們放在一起。

希望它有幫助

2

一般來說,你的問題的答案是使用類和單元測試。做一個互聯網搜索敏捷/極限編程。

的想法是這樣的:

  1. 是否所有的敏捷故事的東西(我會讓你讀到這你自己)
  2. 你打破了你的設計成類
  3. 寫單元測試爲您的類定義「規格」
  4. 編寫空的佔位符函數。
  5. 查看單元測試失敗。
  6. 編寫代碼,直到單元測試成功。
  7. 回到步驟3,重複其餘的課程。

如果以這種方式編寫代碼,則可以創建可重用且健壯的代碼。我真的不相信真正的TDD(測試驅動開發) - 我覺得在編寫代碼之後編寫單元測試會更好(我感覺用戶尖叫的厄運即將到來的火焰) 「敏捷或死亡!」)。

編輯:如果你的問題更多沿着多個類的實際建築的謊言,那很容易。一般來說,你的每個類都應該封裝成2個文件(源代碼和頭文件)。只需在新項目中包含這些文件(以及所有其他您想使用的類的文件)。在需要使用類的適當位置#include「xxx.h」,編寫使用這些類的代碼並構建。而已。

+0

要回答你的評論如下: 如果你已經寫了代碼(聽起來像你沒有使用敏捷/ XP方法 - 這很好)。然後我會創建一個接口來使用它(老實說,你應該已經完成​​了)。創建一個可用的.h文件(很多人把東西放在.c中,應該放在.h中,反之亦然)。然後在需要時將這些文件導入到新項目中。 – ComtriS 2010-11-18 23:38:59

+0

澄清: SO - 我正在使用類,我正在使用QT,並且我構建了很多代碼 - 如果我只是將我編寫的代碼複製到新文件夾中,編寫一個簡單的界面,然後編譯/測試?這是最好的選擇。 – 2012-04-12 20:36:38

0

我目前處於類似的情況,其中我已經實現了功能的一些部分(通過一些API的文件I/O,工作的主要部分等)。所以也許我的一些經驗會有幫助:

  • 如果您已經有一些代碼,它可能有助於繪製你的圖。筆和紙,或者更好的UML可以在這裏幫助(順便說一句,一個好的UML工具,可以導入現有的類是Umbrello)。有時我會在最後一次提交之後進行這種「設計檢查」,這有助於我發現一些細微的問題,特別是在設計階段,我每天都在重構類。
  • 如果您已經爲組件編寫了代碼,我認爲您可以輕鬆地爲每個組件制定一些要求,並從中創建一些測試(例如,使用'UnitCPPLite')。目前,我在主文件中進行了測試,其中一些樣板代碼在應用程序中完成其他任何事情之前觸發測試執行(儘管這仍然不是最佳的);
  • 最後,我會在ComtriS的建議中加入「包含警衛」的概念(如果你不使用它們),以防止多重包含頭文件。因此,在實踐中,我通常最終了這樣的事情:

的src/CFoo.h:

// class 'CFoo': header file 
#ifndef CFOO_H 
#define CFOO_H 

#include <only_what_you_need_in_declaration_interface> 

class CFoo { 
    private: 
     // class data 
    public: 
     // constructors, destructors, getters, setters, etc. 
     void doWork(); 
    }; 
#endif /* CFOO_H */ 

的src/CFoo.cpp:

// class 'CFoo': implementation file 
#include "CFoo.h" 
#include <what_you_need_in_addition_for_internal_workings_of_methods> 

// code for other methods... 

void CFoo::doWork() { 
    // work 
} 

希望它可以幫助。