2009-06-02 26 views
3

我:如何從現有的面向對象API創建控制檯應用程序?

  • 現有的面向對象的本機代碼API(非GUI)
  • GUI應用程序與此API工作

目標: 要創建一個額外的控制檯應用程序,讓用戶通過鍵入命令來執行一些工作流程(類似於上面的GUI應用程序)。這個應用程序應該是「有狀態的」 - 可用的命令及其結果將取決於以前發佈的命令。

問題: 我不想「重新發明輪子」。是否有構建應用程序和定義「詞彙」的現有模式?目前,在我看來,最好的選擇是從頭開始編寫一組助手和命令解析器。

P.S.如果我的API在.Net中,我會考慮PowerShell的方向,但API很大,並且將它封裝到.Net中非常耗時。

回答

1

要開始使用命令行,首先不要重新發明輪子。有很多選項可以解析命令。

在Java中有Commons CLI它爲您提供您所需的一切。還有一個.NET CLI port

InfiniteReda good writeup如何在Ruby中做到這一點。

就實施過程而言,您有正確的想法。但是不要在這裏重新發明輪子。封裝Command對象中的工作並查看使用責任鏈模式; Commons Chain效果很好。還有一個.NET Chain port

如果使用這些框架不是一種選擇,請看看它們是如何實現的。此外,如果您在與其中一些選項進行互操作時遇到問題,Ruby對於做這類事情真的是一把不錯的瑞士軍刀。它相對便攜,代碼最終可以變得非常乾淨而且易於維護。

更新:JCommander也看起來很有趣。

1

你有什麼COM接口嗎? PowerShell可以無縫地編寫COM,WMI或.NET腳本;您甚至可以使用純腳本執行運行時p/invoke調用;原型的耗時少得多。一旦固化了設計,您可以選擇將其作爲本地Cmdlet進行轉換以提高速度。

-Oisin

+0

看起來好像維持'基於API狀態的可用命令更改'的狀態用例不適合在登錄shell之類的狀態燈環境下運行......是我對PowerShell的能力的印象與狀態存儲交互的cmdlet不正確? – 2009-06-02 16:15:13

+0

我的想法正是如此。我會強烈考慮從你的api中創建一個com對象。這很可能也是更快的方法。 – skamradt 2009-06-02 16:15:47

+0

@Tetsujin powershell具有動態參數的概念,可以在現有命令上有條件地使用動態參數,完全取決於後備存儲狀態 - 通常封裝爲提供程序。例如,文件系統提供程序將-Wait開關添加到Get-Content cmdlet,該開關可能會以當前進入該提供程序的路徑和/或其內部狀態爲條件。 – x0n 2009-06-02 16:40:21

1

如果你最終使用.NET,也許你可以看看@的Mono.Options庫:http://tirania.org/blog/archive/2008/Oct-14.html

「Mono.Options是一個美麗的命令 行解析圖書館。它很小, 簡潔,使用快樂,輕鬆和強大,全在一起。「

3

您所描述的使用模式聽起來像Read-Eval-Print循環(REPL),這是解釋型語言的常用交互模式。

事實上,您似乎在描述一種命令語言和解釋器,因此我會建議檢查該域以尋找與現有API綁定匹配的模式。

0

我非常贊同xOn的回答,但爲了保持調用之間的狀態,只需將其設置爲單個實例com對象,然後編寫一個「登錄」函數來調用AddRef和一個「註銷」函數來調用Release。這樣對象將在兩次調用之間停留。唯一的風險是在多個登錄的同一個盒子上運行多次...所以你會想要陷阱。

根據你所需要的狀態,如果它不多,並且可以很容易地流式傳輸到磁盤文件或數據庫,那麼多實例com對象會表現得更好,並且不需要addref或release調用。

1

使用自動工具,如SIPSWIG包裝你的API,導入作爲一個Python模塊爲ipython會議上,做的東西帶命令行的對象。任務完成。

如果失敗,它會因爲無論:

  • 你的對象/ API不適合自動包裝(但讓他們到可包裝的狀態一般的手段提高他們的過程)。
  • Python對於命令行來說並不是真正的想法(即使使用ipython增強功能)。
相關問題