1. 程式人生 > >【C#程式設計最佳實踐 七】程式碼書寫規範實踐

【C#程式設計最佳實踐 七】程式碼書寫規範實踐

以下規範都是個人書寫習慣,便於閱讀總結的個人規範,對於每個人可以有自己的理解。終極目標就是消除警告呀哈哈。

佈局規範

對於專案的總體規範,建議分為以下幾部分:1,對外提供服務的檔案。2,配置檔案和配置檔案解析類(如果有)。3,介面資料夾(介面和實現類)。4單元測試資料夾。5,實體類資料夾。

命名規範

1,介面的命名:例如IConditionKeyBuilder,以I開頭,方式+名詞
2,類的命名:駝峰命名法
3,方法的命名:動詞:GetConditionKey()
4,欄位的命名:_keyCondition
5,屬性的命名:GetConditionKey(在C#裡能用屬性不用欄位,基本都用屬性)

註釋規範

類的註釋

這裡寫圖片描述

類+屬性(服務提供類)或來源(某介面的實現類)+具體功能

介面的註釋

這裡寫圖片描述

介面+屬性(欄位比較規則介面)或來源(某介面的子介面)+具體功能

方法的註釋

這裡寫圖片描述

方法屬性(私有還是公有)+功能+引數列表

屬性的註釋

這裡寫圖片描述

屬性要完成的功能

流程註釋

這裡寫圖片描述

1,資料預處理註釋:這一部分用來預處理想要處理的資料
2,核心功能方法註釋:核心功能為一個區域,用註釋隔離開
3,輔助方法註釋:輔助需要的方法為一個區域,也用註釋隔離

每一個功能的輔助方法集合都要用一個region來包含,核心方法也是,用region隔開

常用規範

1.能使用foreach 不使用 for

原因:
foreach (var i in getlist() )            //getlist() 只會執行一次
for(int i=0;i< getlist().count ;i++)     //getlist() 會執行多次

2.如果throw 的異常是一種己知的異常,應該自定義一個異常類

throw new Exception(“資料己存在”)
//改成  throw new DataExistedException()

3.有效複用

大程式碼中出現大量常見重複的判斷值有效性或提取物件裡的資訊的場景,應該封裝成一個函式方便複用。
示例:

if(obj.name==null
|| obj.list==null || obj.list.count==0) //新增函式 isValidValue(obj) return $("{obj.app}.{obj.metaobject}.{obj.feildname}”) //新增函式 obj.GetXX() 或 GetXX(obj) return result=resultData.Count > 0 :true?false ; //改成 isSuccess(resultData)

4.程式碼中常用或多個地方會使用到的字串不能使用明文, 應該用常量。

示例
sortFields.Add("_uid", SortDirection.Asc);
//改成
public const string UID_Field = “_uid”
sortFields.Add(UID_Field, SortDirection.Asc);

5.引數有效性驗證

程式碼給外層提供服務的介面,函式第一行, 就應該要給傳入的引數進行有效性驗證 (如:Provider中的public函式)

public DataResult<bool> ImportObjectData(string ids, bool isTransferAll = false)
{
   string[] idArray = ids.Split(',');
   if (ids.Count() > 0)
   {
       //run ….
   }
}

改成
public DataResult<bool> ImportObjectData(string ids, bool isTransferAll = false)
{
   ArgumentHelper.AssertPositive(ids, "ids");
   string[] idArray = ids.Split(',');
   if (ids.Count() > 0)
   {
       //run ….
   }
}

6.關於註釋

  • 1.Model裡的屬性一定要有註釋,同時要確保註釋是正確的。

  • 2.Class一定要有描述是幹什麼事情的

  • 3.核心程式碼,關鍵演算法一定要註釋清楚為什麼是這樣做的,場景是什麼?而不是隻註釋函式在幹什麼?

  • 4.函式的引數註釋要與程式碼匹配

7.關於程式碼的可讀性

1.每個函式一般要求“圈複雜度”不超過5

8.關於函式命名

1.函式命名要統一規範, 如: getXXX() getXXXs() isXXX() hasXXX()
2.函式命名要能表達函式的操作行為,命名應該是動詞。 如: run() getXXX()

9.關於變數的使用

1.當變數只有一個地方使用時,就不使用變數。

示例:
Exception ex = new Exception("RelationFilter Range條件配置錯誤:" + User.Common.Serialize.SerializeHelper.Serialize(relationFilter));
throw ex;
改成
throw new Exception("RelationFilter Range條件配置錯誤:" + User.Common.Serialize.SerializeHelper.Serialize(relationFilter));

2.進行大量反覆修改變數值時(如 i++ ),應該使用區域性變數,不要直接使用全域性變數進行i++操作. 這樣效能更高。

示例
public static int i =0;
public void fun(){
    for(int n=0;n<1000;n++)
   {
        i++;
   }
}
改成
public void fun(){
   int i=0;
   for(int n=0;n<1000;n++)
   {
        i++;
   }
}

10.關判斷引數是否為空

ArgumentHelper.AssertNotEmpty(name,”name”)
判斷值是否大於0
ArgumentHelper.AssertPositive(userId,”userId”)
判斷是否為null
ArgumentHelper.AssertNotNull(objectData,”objectData”)11.關於效能

1.使用String.Empty 代替 “"

string name="";
改成
string name=String.Empty;