標(biāo)簽: C#
編程規(guī)范
命名規(guī)約
- 【強制】代碼中的命名均不能以
下劃線或美元符號
開始,也不能以下劃線或美元符號結(jié)束。- 【強制】代碼中的命名
嚴(yán)禁使用拼音與英文混合
的方式,更不允許直接使用中文的方式。- 【強制】
類名
,方法名
,屬性
,枚舉名
,接口名
,委托
,事件
,命名空間
,使用UpperCamelCase
風(fēng)格,必須遵從駝峰形式。通用縮寫除外,如BO- 【強制】
參數(shù)名
、成員變量
、局部變量
都統(tǒng)一使用lowerCamelCase
風(fēng)格,必須遵從駝峰形式。如localValue
- 【強制】常量命名全部大寫,單詞間用下劃線隔開,力求語義表達完整清楚,不要嫌名字長。如
MAX_STOCK_COUNT
- 【強制】抽象類命名使用
Abstract
或Base
開頭;異常類命名使用Exception
結(jié)尾;測試類命名以它要測試的類的名稱開始,以Test
結(jié)尾。- 【強制】杜絕完全不規(guī)范的縮寫,避免望文不知義。
AbstractClass
縮寫命名成AbsClass
;condition
縮寫命名成condi
,此類隨意縮寫嚴(yán)重降低了代碼的可閱讀性。- 【推薦】如果使用到了設(shè)計模式,建議在類名中體現(xiàn)出具體模式。如
public class OrderFactory
;
格式規(guī)約
- 【強制】大括號的使用約定。如果是大括號內(nèi)為空,則簡潔地寫成
{}
即可,不需要換行;如果是非空代碼塊則兩個半括號都另起一行和類首對齊。- 【強制】左小括號和右邊相鄰字符之間不出現(xiàn)空格;同樣,右小括號和左邊相鄰字符之間也不出現(xiàn)空格。
- 【強制】
if/for/while/switch/do
等保留字與小括號之間都必須加空格。- 【強制】任何運算符左右必須加一個空格。
- 【強制】縮進采用
4個空格
,禁止使用tab字符。或者在設(shè)置里面把tab設(shè)置為四個空格- 【強制】單行字符數(shù)限制不超過120個,超出需要換行,換行時遵循如下原則:
1) 第二行相對第一行縮進4個空格,從第三行開始,不再繼續(xù)縮進,參考示例。
2) 運算符與下文一起換行。
3) 方法調(diào)用的點符號與下文一起換行。
4) 在多個參數(shù)超長,逗號后進行換行。
5) 在括號前不要換行。- 【強制】方法參數(shù)在定義和傳入時,多個參數(shù)逗號后邊必須加空格。
- 【強制】IDE 的
text file encoding
設(shè)置為UTF-8
;IDE中文件的換行符
使用Unix
格式,不要使用windows格式。- 【推薦】沒有必要增加若干空格來使某一行的字符與上一行的相應(yīng)字符對齊。
- 【推薦】方法體內(nèi)的執(zhí)行語句組、變量的定義語句組、不同的業(yè)務(wù)邏輯之間或者不同的語義之間插入一個
空行
。相同業(yè)務(wù)邏輯和語義之間不需要插入空行。
OOP 規(guī)約
- 【強制】避免通過一個類的對象引用訪問此類的靜態(tài)變量或靜態(tài)方法,無謂增加編譯器解析成本,直接用類名來訪問即可。
- 【強制】所有的相同類型的包裝類對象之間值的比較,全部使用
Equals
方法比較。- 【強制】構(gòu)造方法里面禁止加入任何業(yè)務(wù)邏輯,如果有初始化邏輯,請放在
Init
方法中。。- 【推薦】使用索引訪問用String的
Split
方法得到的數(shù)組時,需做最后一個分隔符后有無內(nèi)容的檢查,否則會有拋IndexOutOfBoundsException的風(fēng)險。- 【推薦】當(dāng)一個類有多個構(gòu)造方法,或者多個同名方法,這些方法應(yīng)該按順序放置在一起,便于閱讀。
- 【推薦】 類內(nèi)方法定義順序依次是:
公有方法或保護方法
>屬性
>私有方法
。- 【推薦】循環(huán)體內(nèi),字符串的連接方式,使用
StringBuilder的append
方法進行擴展。- 【推薦】類成員與方法
訪問控制從嚴(yán)
:
1) 如果不允許外部直接通過new來創(chuàng)建對象,那么構(gòu)造方法必須是private。
2) 工具類不允許有public或default構(gòu)造方法。
3) 類非static成員變量并且與子類共享,必須是protected。
4) 類非static成員變量并且僅在本類使用,必須是private。
5) 類static成員變量如果僅在本類使用,必須是private。
6) 若是static成員變量,必須考慮是否為final。
7) 類成員方法只供類內(nèi)部調(diào)用,必須是private。
8) 類成員方法只對繼承類公開,那么限制為protected。
控制語句
- 【強制】在一個
switch塊
內(nèi),每個case
要么通過break/return
等來終止,要么注釋說明程序?qū)⒗^續(xù)執(zhí)行到哪一個case為止;在一個switch塊內(nèi),都必須包含一個default
語句并且放在最后,即使它什么代碼也沒有。- 在
if/else/for/while/do
語句中必須使用大括號。即使只有一行代碼,避免使用單行的形式- 【推薦】表達異常的分支時,
少用if-else
方式,這種方式可以改寫成:
if (condition)
{
...
return obj;
}
// 接著寫else的業(yè)務(wù)邏輯代碼;
- 【推薦】除常用方法(如getXxx/isXxx)等外,不要在條件判斷中執(zhí)行其它復(fù)雜的語句,將復(fù)雜邏輯判斷的結(jié)果賦值給一個有意義的布爾變量名,以提高可讀性。
- 【推薦】
循環(huán)體
中的語句要考量性能
,以下操作盡量移至循環(huán)體外處理,如定義對象、變量、獲取數(shù)據(jù)庫連接
,進行不必要的try-catch操作(這個try-catch是否可以移至循環(huán)體外)。- 【參考】下列情形,需要進行
參數(shù)校驗
:
1) 調(diào)用頻次低的方法。
2) 執(zhí)行時間開銷很大的方法。此情形中,參數(shù)校驗時間幾乎可以忽略不計,但如果因為參數(shù)錯誤導(dǎo)致中間執(zhí)行回退,或者錯誤,那得不償失。
3) 需要極高穩(wěn)定性和可用性的方法。
4) 對外提供的開放接口,不管是RPC/API/HTTP接口。
5) 敏感權(quán)限入口。- 【參考】下列情形,不需要進行參數(shù)校驗:
1) 極有可能被循環(huán)調(diào)用的方法。但在方法說明里必須注明外部參數(shù)檢查要求。
2) 底層調(diào)用頻度比較高的方法。
3) 被聲明成private只會被自己代碼所調(diào)用的方法,如果能夠確定調(diào)用方法的代碼傳入?yún)?shù)已經(jīng)做過檢查或者肯定不會有問題,此時可以不校驗參數(shù)。
注釋規(guī)約
- 【強制】所有的類都必須添加創(chuàng)建者和創(chuàng)建日期。
- 【強制】方法內(nèi)部單行注釋,在被注釋語句上方另起一行,使用
//
注釋。方法內(nèi)部多行注釋使用/* */
注釋,注意與代碼對齊。- 【強制】所有的枚舉類型字段必須要有
注釋
,說明每個數(shù)據(jù)項的用途。- 【推薦】代碼修改的同時,注釋也要進行相應(yīng)的修改,尤其是參數(shù)、返回值、異常、核心邏輯等的修改。
- 【參考】合理處理注釋掉的代碼。盡量在目標(biāo)代碼上方
詳細說明
,而不是簡單的注釋掉。如果無用,則直接刪除
。- 【參考】對于注釋的要求:
第一、能夠準(zhǔn)確反應(yīng)設(shè)計思想和代碼邏輯;
第二、能夠描述業(yè)務(wù)含義,使別的程序員能夠迅速了解到代碼背后的信息。完全沒有注釋的大段代碼對于閱讀者形同天書,注釋是給自己看的,即使隔很長時間,也能清晰理解當(dāng)時的思路;注釋也是給繼任者看的,使其能夠快速接替自己的工作。- 【參考】好的命名、代碼結(jié)構(gòu)是自解釋的,注釋力求精簡準(zhǔn)確、表達到位。避免出現(xiàn)注釋的一個極端:過多過濫的注釋,代碼的邏輯一旦修改,修改注釋是相當(dāng)大的負(fù)擔(dān)。