2012-11-24 157 views
1

我是一個用於研究的大型C++庫(我是博士生)的獨奏開發人員。比方說,庫有一堆實現酷算法的類:Algorithm1,Algorithm2等。然後,我編寫了一堆C風格的函數,它們是獨立的「腳本​​」,它們使用庫來測試最近添加的功能,或者運行模擬作品,然後包含我非常精彩的(我拒絕)期刊出版物。該庫的設計遵循良好的軟件工程原理(盡我所知),但連接來自main.cpp的庫的「腳本」除了「完成工作」之外不遵循任何原則。編寫C++「腳本」

我現在在單個文件(20,000多行代碼)中有超過300個這樣的「腳本」。我沒有問題,我仍然非常有生產力,而這纔是最終的目標。但我想知道這種方法是否存在我剛學過的主要弱點。

// File: main.cpp 

#include <cool_library/algorithm1.h> 
#include <cool_library/algorithm2.h> 
... 
#include <cool_library/algorithmn.h> 

void script1() { 
    // do stuff that uses some of the cool library's algorithms and data structures 
    // but none of the other scriptX() functions 
} 

void script2() { 
    // do stuff that uses some of the included algorithms and data structures 
} 

... 

// Main function where I comment in the *one* script I want to run. 
int main() { 
    // script1(); 
    // script2(); 
    // script3(); 
    ... 
    script271(); 

    return 0;    
} 

編輯1:有幾個目標,我在這個過程中:

  • 儘量縮短啓動一個新的腳本功能的時間。
  • 使我的指尖上的所有舊腳本功能可用於搜索。所以我可以複製並粘貼這些腳本的一部分到一個新的。記住這是不是應該是其他人使用的好設計。
  • 我不關心腳本文件的編譯時間,因爲它在一秒鐘內編譯,因爲它現在有20,000行代碼。

我使用Emacs作爲我的「IDE」的方式,在Linux中使用的Autoconf/Automake腳本/ Libtool程序過程中建立圖書館和腳本。

編輯2:基於這些建議,我開始懷疑在這種情況下部分提高生產力的方法不是重構代碼,而是定製/擴展IDE的功能(我的Emacs案件)。

+0

什麼是您的博士學科? (在什麼領域)?你想讓其他人使用你的圖書館嗎? –

+0

這是用於優化無線網絡各個方面的算法集合。以下是我發佈的示例文章:http://goo.gl/lRXtP我希望其他人使用該庫,但「腳本」功能不是庫的一部分,它們基本上是單獨使用庫的單個示例。 –

+0

然後,我認爲我使用一些真正的腳本語言的建議是有道理的。 –

回答

2

如果我是你,我會拆分大文件到300分較小的:每個本來只是一個scriptNN()main()只是調用它。

現在,編譯完成後,您將擁有300個小的可執行文件(您可能需要爲此創建合適的Makefile)。

什麼是好的關於這一點 - 現在你可以使用這些腳本可執行文件作爲構建塊被投入或其他腳本調用,如bash中,蟒蛇,Perl等

編輯說明這個設計如何允許解決你的目標。

  • 時間來啓動新的腳本功能 - 簡單地複製現有的文件中的一個,並調整它一點點。

  • 是否已在我的指尖所有的舊腳本功能搜索 - Emacs可以做多文件搜索在所有其他腳本文件你。

  • 我不在乎腳本文件的編譯時間 - 這並不重要。但是,您將立即將所有這些內容都提供給您,而無需編輯一個大的main()並重新編譯。

1

如果您對此感到滿意,並且適用於您,只需堅持使用即可。你說你是唯一的開發者,然後就做你想做的任何事情。我總是花太多時間爲我的項目考慮這樣的事情:P。我已經學會了專注於重要和有生產力的事情。理論上的東西只能在理論上...

2

你的例子可能是一個很好的使用案例scripting language。更具體地說,你可以將你所有的C++函數粘貼到一些解釋器上,如Lua,Python,Ocaml,Guile等等,並且你的測試用例可以用腳本語言編寫。

所有的腳本語言都可以讓你粘貼你的C(因此也是C++)函數。 對於Lua,請參閱其Lua API一章。對於Python,請參閱其Extending & Embedding Python部分。對於Ocaml,請參閱Interfacing C with OCaml部分。對於Guile,請參閱Programming in C一章。

您可能希望在您的main函數中嵌入解釋器,或者您可以使用新的函數擴展現有解釋器(因此使用由解釋器提供的一些main)。

注意使用一些腳本語言可能對你的軟件庫和軟件的設計和架構產生深遠的影響

+0

當我在閱讀時,我在想Python,python,python。 –

+0

您能否詳細說明您的建議中的「更具體」部分?你能舉一個例子說明如何將C++與腳本語言連接起來。 –

+0

@LexFridman:我添加了對相關文檔的特定引用。 –

1

所有建議的答案都很好,你甚至可以將它們結合起來。只需添加5美分即可:您的執行流程完全符合StrategyCommand設計模式。你可能想看看他們的好處,但這是一個利益與投資的問題。