【設計原則和建議】 方法
方法
1.一個方法內的代碼不能超過30行.
- 絕大部分方法都可以在30行內結束.
- 這是一種強迫開發者優化設計和代碼的方式.
- 靜態構造函數,拋出以后整個類型就再也無法使用了.
- 構析函數.
- 屬性的get方法 (有些類的設計會違背這個特性).
- Dispose (理論上也不應該拋出異常,不過有些設計已經拋出了異常).
3.還沒有實現的方法應該拋出NotImplementedException 異常.
4.移除沒有被調用到的方法 .
5.方法命名推薦Pascal命名.
- 推薦動詞+名詞方式 例如 GetUser, DisableUser
- 如果在類的實例方法上,推薦動詞做方法名 例如User.Create
靜態方法和實例方法
1.靜態方法應該是線程安全的
- 調用方使用靜態方法(如Console.Write),調用方會預期靜態方法是線程安全的
public static Dictionary<string, object> dict = new Dictionary<string, object>();
public static ConcurrentDictionary<string, object> concurrentDict = new ConcurrentDictionary<string, object>();
public static void Test1()
{
if (!dict.ContainsKey("key"))//線程不安全
{
dict["key"] = "value";
}
}
public static void Test2()
{
concurrentDict["key"] = "value";//線程安全,
}
2.如果一個方法沒有使用到this,那么考慮聲明為靜態方法
3.基本類庫和常用方法優先設計為靜態方法 (如Log.Error SqlHelper.Execute)
4.為什么選擇靜態方法
- 容易實現面向過程的編程
- 靜態方法調用較為簡單,少了一個new的過程
- 如果希望設計一個較為獨立的方法(和類中的其他對象關系較少),靜態方法是一個較好的選擇 ,靜態方法往往更容易移植
- 性能較好
1.不需要在運行時判斷多態 (沒有繼承鏈的問題)
2.調用靜態方法不需要傳遞實例對象指針
3.實例方法需要至少new一個對象, 有GC的壓力
5.為什么選擇實例方法
- 和面向對象的設計結合較好
- 借助多態等,功能比靜態方法要強大
方法可訪問性
1.在聲明方法的時候顯式聲明可訪問性, 不要使用默認值,以免不熟悉默認訪問性的開發者搞錯了
2.保持最低的可訪問性, 例如能private的就不要public
- 避免第三方錯誤調用了不應該public的方法
- 避免第三方引用了public方法以后,在重構時無法移除該方法
3. 使用new關鍵字復寫父類方法 , 一般要保持同級或者較高的可訪問性
public class ClassA
{
public virtual void Test()
{
}
}
public class ClassC : ClassA
{
protected new void Test() //bad
{
}
}
方法繼承
1.如果想重寫父類的方法,一定要用new關鍵字顯式覆蓋,以免非預期的重寫
public class ClassA
{
public void Test()
{
}
}
public class ClassB : ClassA
{
public new void Test()//good
{
}
}
public class ClassC : ClassA
{
public void Test() //bad
{
}
}
2.某些方法需要一起被override, 例如 IComparable.CompareTo 和 Equals , 又例如重寫運算符的時候 = 和 !=
3.只在希望子類override方法實現的時候使用virtual關鍵字
4.不要在構造函數中調用虛方法
- 調用虛方法時,直到運行時之前都不會選擇執行該方法的實際類型。 構造函數調用虛方法時,可能尚未執行調用該方法的實例的構造函數。
5.如果是實現了Dispose方法,那么在該方法體內,請調用父類的Dispose方法
對比
1.和屬性對比
- 屬性返回值相對靜態,所以DateTime.Now是一個不好的設計(因為Now的值會一直變化)
- 方法返回值相對動態,所以Guid.NewGuid()是一個好的設計
部分內容引用自MSDN,FxCop 和其他第三方文章..
因為本人水平有限,如有遺漏或謬誤,還請各位高手指正
浙公網安備 33010602011771號