2015-09-16 65 views
3

嗨,大家好,我知道這可能是有爭議的,或者不是非常寬泛,但我會試着非常具體並涉及到其他問題。組織/構建Go包文件夾和文件的正確方法是什麼?

好吧,當我做一個圍棋程序時應該怎樣考慮我應該如何組織我的項目? (例如,我想我應該確定我將擁有某種控制器,所以我應該有一個控制器子目錄,這樣做我應該這樣做)

應該如何構造一個包?

例如目前的方案我的工作,我想做一個SteamBot使用this

但是,當我在寫它,我不知道我是否應該一定的方法導出到自己的自己的文件,例如我有一些像

func (t *tradeBot) acceptTrade() {} 
func (t *tradeBot) declineTrade() {} 
func (t *tradeBot) monitorTrade() {} 
func (t *tradeBot) sendTrade() {} 

每種方法都將有相當多的代碼,所以我應該每種方法導出到它自己的文件或者只是有1個文件,在其3000行代碼?

也使用全局變量,以便我可以設置一個變量,然後離開它,並能夠在多個函數中使用它,或者這是不好的,我應該通過變量作爲參數?

而且我爲了我的文件,如:

package 
imports 
constants 
variables 
functions 
methods 

還是我只是把東西放在哪裏,我需要他們

希望我自己清楚,它不是一個可怕的問題。謝謝!

回答

4

尋找靈感的第一個地方是Go standard library。 Go標準庫對於「良好」Go代碼的外觀應該是一個很好的指導。圖書館與應用程序並不完全相同,但它絕對是一個很好的介紹。

一般來說,你不會把每個方法分解成它自己的文件。 Go傾向於選擇覆蓋主題的較大文件。雖然3000行看起來相當大。即使是網絡/ http server.go也只有2200行,而且非常大。

全局可變變量在Go中與在任何語言中一樣糟糕。由於Go非常依賴併發編程,因此全局可變變量非常可怕。不要這樣做。一種常見的例外是sync結構,如sync.Poolsync.Once,它們有時是全局封裝,但也可以同時訪問。有時候也有「默認」版本的結構,比如http.DefaultClient,但是你仍然可以將明確的結果傳遞給函數。再次,通過Go標準庫查看什麼是常見的,什麼是罕見的。

1

只是一些提示,你希望找到有用的:

  • 通過功能代碼組織成多個文件和包,而不是層。這變得越重要,你的應用程序變得越大。帶有一個或兩個控制器的包controllers可能沒問題,但將數百個不相關的控制器放在同一個包中並沒有任何意義。下面的文章很好地解釋了它:http://www.javapractices.com/topic/TopicAction.do?Id=205

  • 全局變量有時會使代碼更易於編寫,但應謹慎使用它們。我認爲像記錄器,調試標誌等未提及的全局變量都可以。

+1

請注意,Go傾向於使用與Java完全不同的包結構。特別是,Go傾向於支持覆蓋整個可重用系統的較大包,而不是按功能劃分它。例如,'net'包含DNS,IP,創建網絡連接,網絡硬件等。在Java中,你會傾向於分割這些功能。還要注意Go包不是分層的。 'net/http'與'net'無關。每個包裝都完全獨立於Go。我同意「控制器」在任何系統中都是非常糟糕的軟件包。記錄器通常是全球性的,因爲你注意到了。 –

+1

(我發現使記錄器成爲全局的,同時也是常見的,也使得Go中的測試更加複雜,並且使得某些類型的代碼重用變得困難得多,調試標誌也是如此,這是一個非常常見的解決方案。 –

相關問題