我正在設計一個類,其中一些方法如果作爲公開被暴露就不會造成任何傷害。但是它們也可以是私有的,因爲它們將僅用於我的項目中的同一個類。如何確定一個方法是私有的,受保護的,內部的還是公共的?
成爲社會的公共具有以下優點:
- 單元測試,而不需要存取的。
- 靈活性。
使他們的私人具有以下優點:
- 公共文檔簡化。
- 未公開某些未知錯誤。
在這種情況下,哪些是一般指導原則?
我正在設計一個類,其中一些方法如果作爲公開被暴露就不會造成任何傷害。但是它們也可以是私有的,因爲它們將僅用於我的項目中的同一個類。如何確定一個方法是私有的,受保護的,內部的還是公共的?
成爲社會的公共具有以下優點:
使他們的私人具有以下優點:
在這種情況下,哪些是一般指導原則?
哦,請閱讀Ch。 06代碼完成2史蒂夫麥康奈爾,如果你有權訪問它。這將完美地回答你的問題。
一般來說,如果該方法適合整個「角色」的類,使其公開。從技術上講,儘量不要打破抽象。我會舉一個例子,但我不知道你的工作環境,所以例子可能不相關。
如果你不需要它,沒有必要公開一個方法。
對於測試,約翰桑德斯+1。
但是我真的無法在這裏解釋你,史蒂夫已經在CC2中解釋過。
我希望它可以發佈書籍參考Satckoverflow? (請發表評論)
在這種情況下,我通常會盡可能使它們儘可能私有,然後在需要時促進它們的可訪問性(例如,來自其他類的代碼將從能夠直接訪問這些方法中受益)。向API添加方法很容易,而且更容易刪除它們(不會破壞其他代碼)。
務必儘可能保密。
進行單元測試,我有時使一個構件內部,然後使用InternalsVisibleTo
屬性中的AssemblyInfo.cs以允許所述內部構件的單元測試組件的訪問。
這就是我主張(在C#中)*而不是*使用顯式可見性修飾符的原因。默認設置儘可能使所有內容儘可能私密,並且您始終可以添加修改器以使其更加醒目。所有這些私人,私人,私人都只是噪音,這使得很難看到什麼是非私人的。 – 2009-04-25 18:00:06
我非常喜歡公開您明確要公開的內容。我喜歡我班提供給我的溫暖安全的繭。
我會這樣說:「......只公開需要公開的東西......」;-) – Cerebrus 2009-04-25 17:13:55
一個類型的唯一公共成員應該是類型本身的公共接口的一部分。您的目標應該是將類型的接口最小化爲最少數量的成員,並且幾乎不涉及底層實現。
只公開你想要的客戶和使用場景所需要的東西,僅此而已。我不會考慮將單元測試作爲客戶端,並進行更改,以便僅供單元測試使用的公開代碼不可用於公共消費。如果你這樣做,你會混淆你的api,降低你的api的可用性,並使未來的變化更難和不理想,因爲現在可能有客戶端代碼使用什麼應該是私人api。
我會檢查你是否有更好的選擇。例如,您可以在Visual Studio 2005和2008中生成私有訪問器,使得公共類的非公開API可用於測試目的。這可能會弄亂你的單元測試代碼,但對我來說最重要的是你的設計和你發佈給客戶的api,包括你和你的團隊。
在另一個說明中,我還會提到單元測試爲您提供了一個很好的機會,可以看到您的設計如何以及從客戶端角度消耗api的容易程度。在單元測試開發的過程中,您會遇到挫折,問題等問題,您可以進行更改以增強您的api和設計,使其更加簡單,美觀和實用。
如果你發現很難徹底地測試一個班級,那麼班級可能會做得太多。使用合成將課程拆分可以使單個單元更易於測試。
有時它是有道理的,其他時候則沒有。只是一個想法。
爲什麼有人會嘗試從API中刪除一個方法? – 2009-04-25 17:26:54
他所說的是,如果你首先將每種方法都公開,那麼稍後將更難以將某些方法隱藏起來,因爲其他一些類可能會使用它們。 如果有人想要借20美元,並且從一開始就告訴他們,比起給他們錢要容易得多,然後在10分鐘後要求回來。 – Pete 2009-04-25 17:57:09