2009-08-13 46 views
17

您是否對如何組織和命名實用程序類有任何意見?實用程序類和方法的命名約定和結構

每當我遇到一些代碼重複,可能只是一些代碼行,我將它們移動到一個實用程序類。

過了一段時間,我傾向於獲得很多小的靜態類,通常只有一種方法,我通常在類名爲臃腫的utility命名空間中。

例子:

ParseCommaSeparatedIntegersFromString(string) 
CreateCommaSeparatedStringFromIntegers(int[]) 
CleanHtmlTags(string) 
GetListOfIdsFromCollectionOfX(CollectionX) 
CompressByteData(byte[]) 

通常,命名約定告訴你命名你的類作爲一個名詞。我經常結束很多課程,如HtmlHelper,CompressHelper,但他們沒有很多信息。我也嘗試過像HtmlTagCleaner那樣的特殊功能,通常每個實用程序方法只有一個類。

你有什麼想法如何命名和分組這些幫手方法?

回答

12

我相信有複雜的統一體,有前面相應的組織。舉例如下,具體取決於您的項目和公用設施的複雜性選擇,並適應其他方面的限制:

  1. 一類(稱爲助手),有幾個方法
  2. 一包(稱爲助手),用幾個類(稱爲XXXHelper),每個類都有幾個方法。 或者,如果它們合適,這些類可以分成幾個非幫助程序包。
  3. 一個項目(稱爲助手),帶有幾個軟件包(稱爲XXX),每個軟件包都包含... 或者,如果軟件包合適,可以將軟件包拆分成多個非輔助軟件包。
  4. 幾個助手項目(按層次分類,按使用庫或其他)...

在每個分組級別(包,類):

  • 的含義的共同部分是分組名稱
  • 內部碼不需要名稱意了(所以他們的名字更短,更專注,並且不需要縮寫,它使用全名)。

對於項目,我通常重複超級包裝名稱的常見含義。雖然理論上我不是首選,但在IDE(Eclipse)中沒有看到從哪個項目導入類,所以我需要重複這些信息。該項目實際上只用作:

  • 的運輸單元:一些成果或產品將有罐子,那些不需要它不會),
  • 來表達依賴關係:例如,商業項目不依賴於Web層助手;在項目依賴關係中表達了我們對錶面複雜性的改善,對我們有益;或者找到這樣的依賴關係,我們知道某些事情是錯誤的,並開始調查......;同時,通過減少依賴,我們可能會加速編譯和構建....
  • 進行分類代碼,更快地找到它:只有當它是巨大的,我在這個項目談數千個類

請注意,以上所有內容也適用於動態方法,不僅是靜態方法。 這實際上是我們所有代碼的最佳實踐。


現在,我想回答你的問題(儘管廣義的方式),讓我補充另一種認爲
(我知道你沒有問那個)。

靜態方法(除了使用靜態類成員的方法)沒有上下文的情況下工作,所有數據都必須作爲參數傳遞。我們都知道,在OO代碼中,這不是首選的方式。理論上,我們應該尋找與該方法最相關的對象,並將該方法移到該對象上。請記住,代碼共享不必是靜態的,它只需要公開(或以其他方式顯示)。的其中移動一個靜態方法

實例:

  1. 如果只有一個參數,該參數。
  2. 如果有幾個參數,對移動的方法之間進行選擇:
    • 是使用最廣泛的參數:在一個與所用的幾個字段或方法,或由條件句(理想地,一些conditionnals將由被移除用於子類覆蓋)...
    • 一個現有的對象已經很好的訪問了幾個參數。
    • 建立一個新的類爲需要

這種方法雖然移動似乎對面向對象的純粹主義者,我們發現這其實有助於我們在長期內(而當我們要繼承它極其有利它來改變算法)。 Eclipse在不到一分鐘的時間內(所有的驗證)都會移動一個方法,當我們尋找一些代碼或者當我們沒有再編寫一個已經被編碼的方法時,我們會獲得更多的時間。

侷限性:一些類不能被擴展,通常是因爲它們失控(JDK,庫...)。我相信這是真正的幫手理由,當你需要把方法放在你不能改變的類上時

然後,我們的良好做法是用助手後綴命名輔助程序,並使用要擴展的類的名稱。 (StringHelper,DateHelper)。我們想要代碼的類和Helper之間的這種緊密匹配可以幫助我們在幾秒鐘內找到這些方法,即使在我們項目中的其他人寫下該方法時也不知道。

7

Helper後綴是良好的約定,因爲它在很多語言中使用(至少在Java中,IIRC導軌使用它)。

您的幫手的意圖應該是trasported通過方法名稱,使用該類只能作爲佔位符。例如ParseCommaSeparatedIntegersFromString是一對夫婦的原因,一個不好的名字:

  • 太長,真的
  • 它是多餘的,在靜態類型語言,因爲它是從簽名推導出可以去掉FromString後綴

你怎麼看待:

CSVHelper.parse(String) 
CSVHelper.create(int[]) 
HTMLHelper.clean(String) 
... 
+7

我個人將CSVHelper重命名爲CommaSeparatedValues。它更長,但幫手只是sux其6個字符,什麼都不加,而commase ... s都是有意義的。 IDE自動完成,所以誰在乎它是否有點長。 – 2012-05-31 12:56:17