編碼標(biāo)準(zhǔn)主要是為開(kāi)發(fā)組提供一種編程時(shí)的準(zhǔn)則,使項(xiàng)目開(kāi)發(fā)人員在編程時(shí)有一致格式可遵循。這樣,開(kāi)發(fā)組中每個(gè)編程人員編寫(xiě)的代碼能夠被其他人理解,從而提高代碼的可維護(hù)性,使得一套多人寫(xiě)的軟件就像一人寫(xiě)的,使得代碼更易理解。這要求大家使用一致的代碼樣式。 那么,之所以老生常談介紹這些標(biāo)準(zhǔn),是因?yàn)楫?dāng)新的開(kāi)發(fā)人員加入項(xiàng)目開(kāi)發(fā)組時(shí),有的可能還不熟悉Delphi的編碼標(biāo)準(zhǔn)。
在這里將分以下幾類來(lái)介紹這些標(biāo)準(zhǔn):
1 一般的源代碼格式規(guī)則
2過(guò)程和函數(shù)
3 文件、窗體與數(shù)據(jù)模塊命名
一般的源代碼格式規(guī)則
縮進(jìn)
縮進(jìn)就是每級(jí)間有兩個(gè)空格。不要在源代碼中放置制表符。這是因?yàn)椋票矸膶挾入S著不同的設(shè)置和代碼管理實(shí)用程序(打印、文檔及版本控制等)而不同。
邊距
邊距設(shè)置為80個(gè)字符。源代碼一般不會(huì)因?qū)懸粋€(gè)單詞而超過(guò)邊距,但本規(guī)則比較靈活。只要可能,長(zhǎng)度超過(guò)一行的語(yǔ)句應(yīng)當(dāng)用逗號(hào)或運(yùn)算符換行。換行后,應(yīng)縮進(jìn)兩個(gè)字符。
括號(hào)
在左括號(hào)與下一字符之間沒(méi)有空格。同樣,右括號(hào)與前一字符也沒(méi)有空格。
下面的例子演示了正確與不正確的空格。
Call
PRocedure( Parameters ); // 錯(cuò)!
CallProcedure (Parameters); // 正確!
保留字和關(guān)鍵字
Object Pascal語(yǔ)言的保留字和關(guān)鍵字總是完全的小寫(xiě)。
begin...end
begin語(yǔ)句必須單獨(dú)占一行。
例如,下面第一行是錯(cuò)誤的,而第二行正確:
for i:=0 to 10 do begin
Statement
end// 錯(cuò), begin 與for在同一行
for i:=0 to 10 do //正確! begin 在另外一行中
begin
Statement
end
本規(guī)則的一個(gè)特殊情況是,當(dāng)begin為else語(yǔ)句的一部分時(shí)。
例如:
if Condition then
begin
Statement
end
else begin
Statement;
end
end語(yǔ)句總單獨(dú)一行。當(dāng)begin不為else語(yǔ)句的一部分時(shí),相應(yīng)的end語(yǔ)句與begin語(yǔ)句的縮進(jìn)量相同。
語(yǔ)句
(1) if_then_else語(yǔ)句
最有可能執(zhí)行的情況應(yīng)放在then子句中,不太可能的情況放在else子句中。
為了避免出現(xiàn)許多i f語(yǔ)句,可以使用case語(yǔ)句代替。
如果多于5級(jí),不要使用i f語(yǔ)句。請(qǐng)改用更清楚的方法。
不要在i f語(yǔ)句中使用多余的括號(hào)。在源代碼中,括號(hào)只有在確實(shí)需要時(shí)才使用。
例如:
if (I=42) then // 錯(cuò),括號(hào)是多余的
if (I=42) or (J=42) then // 正確,必須使用括號(hào)
如果在i f語(yǔ)句中有多個(gè)條件要測(cè)試,應(yīng)按照計(jì)算的復(fù)雜程度從右向左排。這樣,可以使代碼充分利用編譯器的短路估算邏輯。如果Condition1比Condition2快,Condition2比Condition3快,則if語(yǔ)句應(yīng)這樣構(gòu)造:if Conditior1 and Condition2 and Condition3 then
(2) case_else語(yǔ)句
case語(yǔ)句中每種情況的常量應(yīng)當(dāng)按數(shù)字或字母的順序排列。
每種情況的動(dòng)作語(yǔ)句應(yīng)當(dāng)簡(jiǎn)短且通常不超過(guò)4 ~ 5行代碼。如果動(dòng)作太復(fù)雜,應(yīng)將代碼單獨(dú)放在一個(gè)過(guò)程或函數(shù)中。case語(yǔ)句的else子句只用于默認(rèn)情況或錯(cuò)誤檢測(cè)。
(3) while 語(yǔ)句
建議不要使用exit過(guò)程來(lái)退出while循環(huán)。如果需要的話,應(yīng)當(dāng)使用循環(huán)條件退出循環(huán)。所有對(duì)w h i l e循環(huán)進(jìn)行初始化的代碼應(yīng)當(dāng)位于w h i l e入口前,且不要被無(wú)關(guān)的語(yǔ)句隔開(kāi)。任何業(yè)務(wù)的輔助工作都應(yīng)在循環(huán)后立即進(jìn)行。
(4) for語(yǔ)句
如果循環(huán)次數(shù)是確定的,應(yīng)當(dāng)用for語(yǔ)句代替while語(yǔ)句。
(5) repeat語(yǔ)句
repeat語(yǔ)句類似于while循環(huán),且遵循同樣的規(guī)則。
(6) with語(yǔ)句
with語(yǔ)句應(yīng)小心使用。要避免過(guò)度使用with語(yǔ)句,尤其是在with語(yǔ)句中使用多個(gè)對(duì)象或記錄。
例如:
with Record1,Record2 do
這些情況很容易迷惑編程人員,且導(dǎo)致調(diào)試?yán)щy。
結(jié)構(gòu)化異常處理
異常處理主要用于糾正錯(cuò)誤和保護(hù)資源。這意味著,凡是分配資源的地方,都必須使用try... finally來(lái)保證資源得到釋放。不過(guò),如果是在單元的初始/結(jié)束部分或者對(duì)象的構(gòu)造器/析構(gòu)器中來(lái)分配/釋放資源則例外。
(1) try... finally的用法
在可能的情況下,每個(gè)資源分配應(yīng)當(dāng)與try... finally結(jié)構(gòu)匹配。
例如:
//下面代碼可能導(dǎo)致錯(cuò)誤
SomeClass1: = TSomeClass.Create;
SomeClass2: = TSomeClass.Create;
try
{do some code}
finally
SomeClass.Free;
SomeClass.Free;
e n d ;
//上述資源分配的一個(gè)安全方案是:
SomeClass1: = TSomeClass Create;
try
SomeClass2: = TSomeClass Create;
try
{do some code}
finally
SomeClass2.Free;
end;
finally
SomeClass1.Free;
end;
(2) try...except的用法
如果你希望在發(fā)生異常時(shí)執(zhí)行一些任務(wù),可以使用try...except。通常,沒(méi)有必要為了簡(jiǎn)單地顯示一個(gè)錯(cuò)誤信息而使用try...except,因?yàn)?a href="http://m.survivalescaperooms.com/tag-9.html">application對(duì)象能夠自動(dòng)根據(jù)上下文做到這一點(diǎn)。如果要在子句中激活默認(rèn)的異常處理,可以再次觸發(fā)異常。
(3) try... except...else的用法
不鼓勵(lì)使用帶else子句的try...except,因?yàn)檫@將阻塞所有的異常,包括你沒(méi)有準(zhǔn)備處理的異常。