VB.NET/ASP.NET編碼規(guī)范(ZT)
2024-07-10 13:01:04
供稿:網(wǎng)友
在開(kāi)發(fā)中保持良好的編碼規(guī)范是十分重要的。我所采用的新的vb.net/asp.net編碼規(guī)范,是一種被證明能明顯改善代碼可讀性,并有助于代碼管理、分類的編碼規(guī)范。采用這種編碼規(guī)范,能避免如匈牙利命名法帶來(lái)的繁長(zhǎng)前綴,便于記憶變量的用途。下面的介紹這種編碼規(guī)范。
一、類型級(jí)單位的命名
1、類
□以class聲明的類,都必須以名詞或名詞短語(yǔ)命名,體現(xiàn)類的作用。如:
class indicator
□當(dāng)類是一個(gè)特性(attribute)時(shí),以attribute結(jié)尾,當(dāng)類是一個(gè)異常(exception)時(shí),以exception結(jié)尾:
class colorsetexception
class causeexceptionattribute
□當(dāng)類只需有一個(gè)對(duì)象實(shí)例(全局對(duì)象,比如application等),必須以class結(jié)尾,如
class screenclass
class systemclass
□當(dāng)類只用于作為其他類的基類,根據(jù)情況,以base結(jié)尾:
mustinherit class indicatorbase
□如果定義的類是一個(gè)窗體,那么名字的后面必須加后綴form,如果是web窗體,必須加后綴page:
class printform : inherits form '* windows窗體
class startpage : inherits page '* web窗體
2、枚舉和結(jié)構(gòu)
同樣必須以名詞或名詞短語(yǔ)命名。最好體現(xiàn)枚舉或結(jié)構(gòu)的特點(diǎn),如:
enum colorbuttons '以復(fù)數(shù)結(jié)尾,表明這是一個(gè)枚舉
structure customerinforecord '以record結(jié)尾,表明這是一個(gè)結(jié)構(gòu)體
3、委派類型
□普通的委派類型以描述動(dòng)作的名詞命名,以體現(xiàn)委派類型實(shí)例的功能:
delegate sub dataseeker (byval seekstring as string)
□用于事件處理的委派類型,必須以eventhandler結(jié)尾,如:
delegate sub datachangedeventhandler (byval sender as object, byval e as datachangedeventargs)
4、接口
與其他類型不同,接口必須要由i作為前綴,并用形容詞命名,突出表現(xiàn)實(shí)現(xiàn)接口的類將具有什么能力:
interface isortable
5、模塊
模塊不是類型,他的名稱除了必須以名詞命名外,必須加以后綴module:
module sharedfunctionsmodule
上述所有規(guī)則的共同特點(diǎn)是,每個(gè)組成名稱的詞語(yǔ)都必須是大寫(xiě)開(kāi)頭,禁止完全大寫(xiě)或小寫(xiě)的名稱。
二、方法和屬性的命名
1、方法
無(wú)論是函數(shù)還是子程序,方法都必須以動(dòng)詞或動(dòng)詞短語(yǔ)命名。無(wú)需區(qū)分函數(shù)和子程序,也無(wú)需指明返回類型。
sub open(byval commandstring as string)
function setcopynumber(byval copynumber as integer)
參數(shù)需要指明byval還是byref,這一點(diǎn)寫(xiě)起來(lái)會(huì)讓程序邊長(zhǎng),但非常必要。如果沒(méi)有特別情況,都使用byval。參數(shù)的命名方法,參考后面“變量的命名方法”。需要重載的方法,一般不寫(xiě)overloads,根據(jù)需要編寫(xiě)重載的方法。
2、屬性
原則上,字段(field)是不能公開(kāi)的,要訪問(wèn)字段的值,一般使用屬性。屬性以簡(jiǎn)潔清晰的名詞命名:
property concentration as single
property customer as customertypes
3、事件
事件是特殊的屬性,只能在事件處理上下文中使用。命名的原則一般是動(dòng)詞或動(dòng)詞的分詞,通過(guò)時(shí)態(tài)表明事件發(fā)生的時(shí)間:
event click as clickeventhandler
event colorchanged as colorchangedeventhangler
三、變量和常數(shù)
常數(shù)以表明常數(shù)意義的名詞命名,一般不區(qū)分常數(shù)的類型:
const defaultconcentration as single = 0.01
在嚴(yán)格要求的代碼中,常數(shù)以c_開(kāi)頭,如c_defaultconcentration,但最好不要用它,它會(huì)帶來(lái)輸入困難。
普通類型的變量,只要用有意義的名字命名即可,不可使用簡(jiǎn)稱和無(wú)意義的名稱諸如a,x1等,下面給出了良好的例子:
dim index as integer
dim nextmonthexpenditure as decimal
dim customername as string
不能起太長(zhǎng)的名字,應(yīng)該盡量簡(jiǎn)潔,如下面的例子:
dim variableusedtostoresysteminformation as string '* 錯(cuò)誤,太復(fù)雜了
dim systeminformation as string '* 正確,簡(jiǎn)單明了
dim sysinfo as string '* 錯(cuò)誤,過(guò)于簡(jiǎn)單
特殊情況可以考慮一個(gè)字母的變量:
dim g as graphic
對(duì)于控件,應(yīng)該指明控件的類型,方法是直接在變量后面加以類名:
friend withevents nextpagebutton as button '* 按鈕
friend withevents colorchoicerpanel as panel '* 面版
friend withevents cardfileopendialog as fileopendialog '* 文件打開(kāi)對(duì)話框
等等,無(wú)需規(guī)定某種類型的變量的前綴,只需把類型寫(xiě)在后面就行了,試對(duì)比下列代碼:
btncancel.text = "&cancel"
cancelbutton.text = "&cancel"
顯然后者更能使閱讀者明白變量的類型是一個(gè)按鈕。
四、前綴
1、 對(duì)象
1)標(biāo)準(zhǔn)對(duì)象
名稱
前綴
例子
說(shuō)明
system.array
arr
arrusers
用戶集合
system.boolean
bln
blndoesuserexist
用戶是否存在
system.byte
byt
bytstreamcontent
字節(jié)流內(nèi)容
system.char
chr
chrkeypress
按鍵
system.datetime
dte
dtecreateddatetime
創(chuàng)建日期
system.decimal
dec
decyearlysalequota
年度銷售額
system.double
dbl
dbltotalprice
總金額
system.interger
int
intmessages
消息數(shù)
system.object
obj
objexternalfunction
外部功能
system.single
sng
sngfinishrate
完成率
system.string
str
strloginname
登陸名稱
system.exception
exc
excret
錯(cuò)誤
system.enum
enm
enmuserstates
用戶狀態(tài)
structure
stu
stuemployees
員工類型
system.data.sqlclient.sqlconnection
cnn
cnndatabase
數(shù)據(jù)庫(kù)連接
system.data.sqlclient.sqlcommand
cmm
cmmuseraddupdate
用戶添加更新
system.data.sqlclient.sqldataadapter
sda
sdausers
用戶數(shù)據(jù)適配器
system.data.sqlclient.sqldatareader
sdr
sdruserdata
用戶數(shù)據(jù)讀取器
2)自定義對(duì)象
我們規(guī)定應(yīng)該根據(jù)自定義對(duì)象的名稱來(lái)確定該對(duì)象類型的前綴,例子如下:
對(duì)象:sysset
前綴:ss
例子:sssafety
2、根據(jù)變量與常量的生存周期,我們應(yīng)該定義不同的生存周期前綴以示區(qū)別,以便我們清楚該變量/常量的范圍。
a) 類、模塊、組件、控件
我們規(guī)定在類、模塊、組件、控件范圍內(nèi),變量的生存周期前綴應(yīng)該添加“m_”(module-模塊)。例子如下:
名稱
前綴
例子
說(shuō)明
system.array
m_arr
m_arrusers
用戶集合
system.boolean
m_bln
m_blndoesuserexist
用戶是否存在
system.byte
m_byt
m_bytstreamcontent
字節(jié)流內(nèi)容
system.char
m_chr
m_chrkeypress
按鍵
system.datetime
m_dte
m_dtecreateddatetime
創(chuàng)建日期
system.decimal
m_dec
m_decyearlysalequota
年度銷售額
system.double
m_dbl
m_dbltotalprice
總金額
system.interger
m_int
m_intmessages
消息數(shù)
system.object
m_obj
m_objexternalfunction
外部功能
system.single
m_sng
m_sngfinishrate
完成率
system.string
m_str
m_strloginname
登陸名稱
system.exception
m_exc
m_excret
錯(cuò)誤
system.enum
m_enm
m_enmuserstates
用戶狀態(tài)
structure
m_stu
m_stuemployees
員工類型
system.data.sqlclient.sqlconnection
m_cnn
m_cnndatabase
數(shù)據(jù)庫(kù)連接
system.data.sqlclient.sqlcommand
m_cmm
m_cmmuseraddupdate
用戶添加更新
system.data.sqlclient.sqldataadapter
m_sda
m_sdausers
用戶數(shù)據(jù)適配器
system.data.sqlclient.sqldatareader
m_sdr
m_sdruserdata
用戶數(shù)據(jù)讀取器
b) 過(guò)程、函數(shù)、屬性、事件
我們規(guī)定在過(guò)程、函數(shù)、屬性、事件范圍內(nèi),變量的生存周期前綴應(yīng)該添加“o_”(owner-私有)。例子如下:
名稱
前綴
例子
說(shuō)明
system.array
o_arr
o_arrusers
用戶集合
system.boolean
o_bln
o_blndoesuserexist
用戶是否存在
system.byte
o_byt
o_bytstreamcontent
字節(jié)流內(nèi)容
system.char
o_chr
o_chrkeypress
按鍵
system.datetime
o_dte
o_dtecreateddatetime
創(chuàng)建日期
system.decimal
o_dec
o_decyearlysalequota
年度銷售額
system.double
o_dbl
o_dbltotalprice
總金額
system.interger
o_int
o_intmessages
消息數(shù)
system.object
o_obj
o_objexternalfunction
外部功能
system.single
o_sng
o_sngfinishrate
完成率
system.string
o_str
o_strloginname
登陸名稱
system.exception
o_exc
o_excret
錯(cuò)誤
system.enum
o_enm
o_enmuserstates
用戶狀態(tài)
structure
o_stu
o_stuemployees
員工類型
system.data.sqlclient.sqlconnection
o_cnn
o_cnndatabase
數(shù)據(jù)庫(kù)連接
system.data.sqlclient.sqlcommand
o_cmm
o_cmmuseraddupdate
用戶添加更新
system.data.sqlclient.sqldataadapter
o_sda
o_sdausers
用戶數(shù)據(jù)適配器
system.data.sqlclient.sqldatareader
o_sdr
o_sdruserdata
用戶數(shù)據(jù)讀取器
五、標(biāo)簽
標(biāo)簽就是用于goto跳轉(zhuǎn)的代碼標(biāo)識(shí),由于goto并不推薦使用,所以標(biāo)簽的使用也比較苛刻。標(biāo)簽必須全部大寫(xiě),中間的空格用下劃線_代替,而且應(yīng)該以_開(kāi)頭,比如:
_a_label_example:
如此定義標(biāo)簽是為了與其他代碼元素充分區(qū)別。
六、名字空間
通常,一個(gè)工程使用一個(gè)名字空間,通常不需要用namespace語(yǔ)句,而是在工程選項(xiàng)的“root namespace”中指定,使用根名字空間可以使代碼更加整齊,容易修改,這一點(diǎn)是vb十足的優(yōu)點(diǎn)。名字空間的語(yǔ)法是:
公司名.產(chǎn)品名[.組件名的復(fù)數(shù)]
如:
namespace com.net
namespace com.file.io.files
隨便起一個(gè)名字空間的名字絕對(duì)不是一個(gè)好主意,一定要遵守上述規(guī)定。
七、格式化
良好的格式化代碼對(duì)我們的瀏覽與維護(hù)有相當(dāng)?shù)暮锰帯?br>
1、 塊
.net提供了#region...#end region塊控制。我們應(yīng)該根據(jù)代碼所實(shí)現(xiàn)的功能分類并以塊組織起來(lái)。
2、 縮進(jìn)
每個(gè)層次直接都應(yīng)該以tab進(jìn)行縮進(jìn),而不是space(空格鍵)。
3、 流
每個(gè)方法、函數(shù)、屬性、事件應(yīng)該有且只有一個(gè)入口和一個(gè)出口。如果遇見(jiàn)多層嵌套而需要直接跳出的時(shí)候,請(qǐng)使用局部boolean或者integer變量來(lái)標(biāo)示用以多層跳出。
譬如:
private function testforreturn () as boolean
dim o_blnret as boolean=false
dim i as integer, l as integer
for i=1 to 100
for l=1 to 10
if (x) then
o_blnret=true
exit for
else
end if
next
if o_blnret then
exit for
else
end if
next
return o_blnret '這里是唯一出口
end function
八、注釋
1、 準(zhǔn)則
注釋的規(guī)則繁多,基本地:正常的注釋以'*開(kāi)頭,單獨(dú)的'只用來(lái)注釋暫時(shí)不用的代碼
'* 這是普通的注釋
'* 這段代碼在調(diào)試正確后加入
'if usehighspeed(i) = true then ....
這樣能夠方便的采用代碼注釋工具控制代碼的使用。
2、類(包括webform、winform等)、模塊、組件、控件
每個(gè)類、模塊、組件、控件最開(kāi)始的地方必須輸入該對(duì)象的信息,樣例內(nèi)容與格式如下:
'******************************************************************
'*
'* 對(duì)象名稱:onlineupdateservice
'* 命名空間: http://www.domain.cn/onlineupdate/onlineupdateservice.asmx
'* 作 者:chs(wilson chan)
'* 功能說(shuō)明:在線更新web services
'* 創(chuàng)建日期:2003/07/27
'* 修改日期:2003/09/5 16:59
'* 修改記錄:
'* □2003/07/31
'* 1.addupdateusercategory/deleteusercategory
'* 2.addupdateuserstate/deleteuserstate
'* 3.addupdateserverupdate/deleteserverupdate
'* 4.addupdateclientupdate/deleteclientupdate
'* 5.addupdateclientupdatelog/deleteclientupdatelog
'* 6.getserverupdates/getclientupdates/getclientupdatelogs
'*
'******************************************************************
一般地,我們要求內(nèi)容有:對(duì)象名稱、命名空間、作者、功能說(shuō)明、創(chuàng)建日期、修改日期、修改記錄,特別地,我們要求修改記錄應(yīng)該詳細(xì)敘述最近的修改。
3、方法、函數(shù)、事件與屬性
每個(gè)方法、函數(shù)、事件與屬性最開(kāi)始的地方必須輸入該對(duì)象的信息,樣例內(nèi)容與格式如下:
'*名稱:onlineupdatefileaddupdate
'*功能:添加更改更新信息
'*作者:chs
'*創(chuàng)建:2003/7/31
'*修改:2003/7/31
'*參數(shù):intid:唯一標(biāo)示
'* strtitle:標(biāo)題
'* strversion:版本
'* strverifier:標(biāo)示
'* strdescription:描述
'* strrelatedfile:相關(guān)文件
'* strupdatepackage:下載包
'* intstate:狀態(tài)
'* dtecreateddatetime:創(chuàng)建日期
'*返回:成功,true,反之,false
'*說(shuō)明:
一般地,我們要求內(nèi)容有:名稱、功能、作者、說(shuō)明、創(chuàng)建、修改、參數(shù)與返回。
八、完整性
1、if...else...end if
2、select case...case else...end select
九、安全性
1、try...catch...finally...end try
十、優(yōu)化
1、with
2、for...next
3、do until...loop
4、代碼重構(gòu)
十一、其它
1、 快捷鍵
2、