1、命名規範Pascal和Camel命名規範
編程的命名方式主要有Pascal和Camel兩種(Pascal:每個單詞的首字母大寫,例如ProductType;Camel:首個單詞的首字母小寫,其餘單詞的首字母大寫,例如productType)
以下是一些常用的C#成員及其推薦命名方法:
標誌符 |
規則 |
執行個體與描述 |
類class |
Pascal |
Application |
枚舉類型enum |
Pascal |
記住,是以Pascal命名,切勿包含Enum,否則FXCop會拋出Issue |
委託delegate |
Pascal |
以Pascal命名,不以任何特殊字元串區別於類名、函數名 |
常量const |
全部大寫 |
全部大寫,單詞間以底線隔開 |
介面interface |
Pascal |
IDisposable 註:總是以 I 首碼開始,後接Pascal命名 |
方法function |
Pascal |
ToString |
命名空間namespace |
Pascal |
以.分隔,當每一個限定詞均為Pascal命名方式,比如: using ExcelQuicker.Framework |
參數 |
Camel |
首字母小寫 |
局部變數 |
Camel |
也可以加入類型標識符,比如對於System.String類型,聲明變數是以str開頭,string strSQL = string.Empty; |
資料成員 |
Camel |
以m開頭+Pascal命名規則,如mProductType(m意味member) |
屬性 |
Pascal |
|
1.1、局部變數命名在primitive的局部變數命名時,使用Camel命名規則,
比如:int type = 0;
double count = 0;
…
對於string類型定義,通常使用str首碼+Pascal命名的方式,
比如string strSql = ""; //這是一種典型的命名SQL語句字串的方式。
而對於此外的類型對象定義,通常的做法是使用obj首碼+Pascal命名的方式,來告知我們這個變數是一個對象。或者也可以直接使用類名的Camel命名規則。
比如:Application objApplication = new Application();
Application application = new Application();
1.2、參數命名Camel命名規則,首字母小寫
1.3、類資料成員/屬性命名資料成員命名以Camel命名方式,而屬性以Pascal命名。通常如果資料成員與屬性成對的話,資料成員與屬性的命名區別僅在於變數名的第一個字母是小寫還是大寫。
比如
class Appcalition
{
private ArrayList worksheetCollection = new ArrayList();
public ArrayList WorksheetCollection
{
get
{
return this.worksheetCollection;
}
}
}
另外,類的成員資料/方法調用時,應該加上this限定符,this在編輯環境中是藍色的,更利於我們區分局部變數、參數或靜態變數,並且利於FXCop檢測區分。(如果使用FxCop掃描和檢測代碼的話)
1.4、命名空間命名在dot之間的各限定字串符合Pascal格式
1.5、委託縮寫委託的命名方式我常常以Pascal命名,並且在命名的後面加EventHandler
比如public delegate void MouseEventHandler (object sender, MouseEventArgs e); //用於處理與滑鼠相關的事件或委託
對於自訂的委託,其參數第一個建議仍然使用object sender,sender代表觸發這個時間或委託的來源物件。而第二個參數繼承於EventArgs類,並且在衍生類別中實現自己的商務邏輯。
1.6、自訂異常類自訂異常類以Exception結尾,並且在類名中能清楚的描述出該異常的原因。比如NotFoundFileException,描述出了某個實體(檔案、記憶體地區等)無法被找到。
1.7、枚舉枚舉的命名是Pascal命名,不需要在枚舉中加入Enum,枚舉的名稱能清楚的表明該枚舉的用途。
1.8、常量命名全部大寫,單詞間並且以底線間隔,如public const int LOCK_SECONDS = 3000; 雖然在MSDN中常量的命名推薦使用Pascal,但是從C++沿襲的命名規則來看,將常量全部大寫更加能清楚的表示常量與普通變數之間的區別。
1.9、命名縮寫在一般情況下,不推薦縮寫命名,不要擔心變數命名長,長的變數名能使變數的意義更加清晰,其實從長變數名的負面作用三,因為Ctrl+C和Ctrl+V加上在VS中的智能感知,其負面追用已經很小。變數命名的原則是,盡最大努力讓其他人在看到我們的變數/函數/…等的第一時間,大概能猜出它是做什麼的。
比如:int productTypeCount = 0; //我們在第一時間就能知道它是記錄產品的數量的變數
而對於糟糕的命名方式:int prodTypeCount = 0; //它是productTypeCount的簡寫,我們一部分人也許知道prod是product的縮寫,但是每人能保證所有的人都知道它。我個人認為:最優秀的代碼它本身就是注釋。作為一流的程式員。並不僅僅實現功能,而是要讓我們的代碼更加優美,具備讓他人維護或今後擴充的能力。作為現在的業務系統,其門檻的准入水平已大大降低,實現功能上的需求已沒有什麼難度,但是高手和菜鳥的區別在於,高手的代碼通俗易懂,在整個編碼的過程中,不僅能考慮到效能、還會考慮代碼可讀性和維護性。
1.10、資料庫命名資料庫的欄位、表名的命名都推薦採用Pascal命名方式,盡量不採用縮寫。當然,使用長的欄位名、表名,可能會使SQL語句的編寫帶來負面影響。我推薦大家可以使用一些ORM,ORM的效能肯定不會比直接寫SQL的好,但是如果做業務系統,更重要的是系統多久能交付使用者使用,ORM不僅使開發時間可以縮短不少,並且在後期的維護上也比直接寫SQL便利很多。
2、注釋規範2.1、檔案頭部注釋在代碼檔案的頭部進行注釋,這樣做的好處在於,我們能對代碼檔案做變更跟蹤。在代碼頭部分標註出創始人、創始時間、修改人、修改時間、代碼的功能,這在團隊開發中必不可少,它們可以使後來維護/修改的同伴在遇到問題時,在第一時間知道他應該向誰去尋求協助,並且知道這個檔案經曆了多少次迭代、經曆了多少個程式員的開發和修改。
樣本:
/********************************************************************************
** 作者: Eunge
** 創始時間:2004-6-8
** 修改人:Lucy
** 修改時間:2004-12-9
** 修改人:Lucy
** 修改時間:2005-01-29
** 描述:
** 主要用於產品資訊的資料錄入,…
*********************************************************************************/
2.2、函數、屬性、類等注釋請使用///三斜線注釋,這種注釋是基於XML的,不僅能匯出XML製作協助文檔,而且在各個函數、屬性、類等的使用中,編輯環境會自動帶出注釋,方便你的開發。以protected,protected Internal,public聲明的定義注釋都建議以這樣命名方法。
例如:
/// <summary>
/// 用於從ERP系統中撈出產品資訊的類
/// </summary>
class ProductTypeCollector
{
…
}
2.3、邏輯點注釋在我們認為邏輯性較強的地方加入注釋,說明這段程式的邏輯是怎樣的,以方便我們自己後來的理解以及其他人的理解,並且這樣還可以在一定程度上排除BUG。在注釋中寫明我們的邏輯思想,對照程式,判斷程式是否符合我們的初衷,如果不是,則我們應該仔細思考耀修改的是注釋還是程式了…
3、排版我的排版原則與建議:
1、 每行語句至少佔一行,如果語句過長(超過一屏),則該語句斷為兩行顯示;
2、 把相似的內容放在一起,比如資料成員、屬性、方法、事件等,並適當的使用#region…#endregion,我最喜歡把機器產生的程式碼都放在一個#region裡面,比如在編寫ASP.NET程式時,對應自動產生的控制項定義,我常用#region Automatic Generated Web Components … #endregion把他們框住
3、 使用空格,
(1) 雙目操作符的前後加空格(+, =, && 等),index = index + 1;
(2) 單目操作符前加空格(!, ++, ~ 等), index ++;
(3) 逗號、分號只在後面加空格
4、 使用空行,在一段功能代碼、或者函數、屬性之間插入空行,這樣會很直觀。
在Visual Studio 2005中,其實已經帶有代碼格式化這樣的功能,快速鍵是Ctrl+K -> Ctrl+D。
4、介面控制項命名我的建議是使用預設控制項名作為首碼,首碼名稱全部小寫,這樣的好處是不必為未知的控制項統一命名方式發愁,比如對於Label標籤控制項,有的人用縮寫lbl,有的人用lab,有的人用lb。這樣其實仍然是避免使用縮寫,有的時候仍然會使命名變得冗長,但是命名更加能反應出變數的意義,並且各個開發人員也能更好的執行,因為他們不需要去背記各個變數的縮寫。
protected System.Web.UI.WebControls.Button buttonQuery;
protected System.Web.UI.WebControls.DropDownList dropdownlistProductType;
protected System.Web.UI.WebControls.TextBox textboxManufactureDate;
5、代碼可讀性一些建議(1)注意運算子的優先順序,我們應該盡量使用括弧明確運算式的操作順序,避免使用預設優先順序,給我們以及維護人帶來困擾
(2)避免使用不易理解的數字,用有意義的標識來替代(枚舉和常量)
比如:
if(productType == 0) … else if (productType == 1) … (不推薦使用) |
if(productType == ProductType.CD) … else if (productType == ProductType.DVD) … (推薦使用) |
(3)在介面層中盡量使用異常處理try語句,不要將系統層級的錯誤直接暴露給使用者,而更應該的是把系統拋出的錯誤資訊記錄到LOG記錄檔中去,告訴方便使用的提示資訊
在Visual Studio 2005裡面,有代碼布局格式化功能,蠻有用的。其實代碼的規範是為了使系統具有整體一致的編碼風格,以使後期維護人員能更快的讀懂代碼並進行維護。我認為代碼規範有其必要性,但不能因為規範而規範,從開發而言,開發是為了更快的做出穩定的系統,而穩定的系統是為了給公司帶來受益。開發人員、專案管理人員都應該更多的從項目經營的角度出來,同時站在公司、客戶的角度考慮問題,而不是因為代碼而代碼。