1. 一般的慣例(命名 - 縮進(jìn)和空格 - 邊距 - 大小寫(xiě) - 注釋?zhuān)?/DIV>
2. 語(yǔ)句(begin…end語(yǔ)句-if語(yǔ)句-case語(yǔ)句-for語(yǔ)句-while語(yǔ)句-repeat語(yǔ)句-with語(yǔ)句-異常處理語(yǔ)句)
3. 過(guò)程和函數(shù)(命名與格式-形參-變量-類(lèi)型-自定義類(lèi)型)
4. 面向?qū)ο笙嚓P(guān)(類(lèi)的命名與格式-字段-方法-屬性-方法的實(shí)現(xiàn))
制定編碼規(guī)范的目的是為了使一組程序員生成同樣風(fēng)格的代碼,使一個(gè)團(tuán)隊(duì)形成并保持一定的風(fēng)格。如果這個(gè)目標(biāo)能夠?qū)崿F(xiàn),那么整個(gè)項(xiàng)目的文件看上去就像是一個(gè)程序員寫(xiě)的。好性很好玩,但這樣的好處是每個(gè)程序員的代碼都易于為他人所理解,從而會(huì)在很大程度上提高代碼的可維護(hù)性,也因此會(huì)降低維護(hù)費(fèi)用。對(duì)于任何團(tuán)隊(duì)來(lái)說(shuō),這均是一個(gè)十分理想的境界。對(duì)于個(gè)人,選擇或自我生成一種編碼規(guī)范,并堅(jiān)持這個(gè)規(guī)范,同樣會(huì)產(chǎn)生良好的效果。順便提一下這是一個(gè)十分誘人的目標(biāo),不過(guò)并不太難實(shí)現(xiàn)。
每種程序設(shè)計(jì)語(yǔ)言都有屬于自己的編碼規(guī)范,編碼規(guī)范可以說(shuō)是經(jīng)驗(yàn)的總結(jié),當(dāng)然也要借鑒其他的程序設(shè)計(jì)語(yǔ)言的規(guī)范。所以,向別人學(xué)習(xí)是十分重要的。其次,編碼規(guī)范的使用是為了簡(jiǎn)化程序員的工作,“簡(jiǎn)化”的含義不是減少代碼量(相反,很多時(shí)候遵從規(guī)范會(huì)帶來(lái)更多的代碼),而是減少程序員在維護(hù)代碼時(shí)的勞動(dòng)量。程序設(shè)計(jì)是一種非常復(fù)雜的工作,處理各種各樣的關(guān)系是令人生畏的,而且各種關(guān)系之間還有著千絲萬(wàn)縷的聯(lián)系。程序員應(yīng)將大部分精力用來(lái)處理關(guān)系,而避免在過(guò)于細(xì)節(jié)的問(wèn)題上浪費(fèi)心機(jī)。如果他一眼就能夠明白程序的思路和結(jié)構(gòu),那么對(duì)維護(hù)方案就會(huì)很快形成。而且,編碼規(guī)范應(yīng)該是一個(gè)非常人性化的規(guī)范,你可以參考,也可以修改,但是要保證易于使用。但是在一個(gè)小組中要保證大家使用同樣的規(guī)范。程序設(shè)計(jì)是非常靈活的工作,只有靈活的思考,靈活的應(yīng)用,才可能得到好的結(jié)果。另外,使用規(guī)范在很大程度上是為了減少程序員的記憶負(fù)擔(dān)。人的思維能力是極其優(yōu)秀的,而記憶則十分可憐,我們整天面對(duì)電腦,她要幫我們做得很重要的事情應(yīng)該是記憶。所以盡可能發(fā)揮程序員的思維優(yōu)勢(shì)是我們的目標(biāo)之一。
最后,程序設(shè)計(jì)工具對(duì)編碼規(guī)范有很大的影響,這個(gè)影響來(lái)源于開(kāi)發(fā)商的程序設(shè)計(jì)風(fēng)格。同樣基于C++,在Microsoft Visual C++和Borland C++ Builder中我們不會(huì)使用完全相同的編碼規(guī)范。Microsoft和Borland有著各自不同的而且十分鮮明的風(fēng)格。作為用戶,我們可以在此基礎(chǔ)上有所改變,但是這是有限度的。其實(shí),在做出對(duì)供應(yīng)商和開(kāi)發(fā)工具的選擇時(shí),我們同時(shí)確定了我們未來(lái)的風(fēng)格。
1. 一般的慣例
1.1 命名
命名的基本原則是名稱要能夠明確表示數(shù)據(jù)的功能。
Object Pascal支持長(zhǎng)文件名。名稱應(yīng)該使用動(dòng)詞、名詞或二者的組合。絕對(duì)不可以使用Delphi中定義的保留字和關(guān)鍵字,而且盡量不要使用其他語(yǔ)言中定義的保留字和關(guān)鍵字。盡量使用完整的詞語(yǔ)而避免使用縮寫(xiě)、前綴和后綴、下劃線或其它符號(hào),不推薦使用匈牙利命名法。
命名規(guī)范是為了確保名稱的可讀性。以匈牙利命名法為代表的命名規(guī)范制定了許多前綴和后綴以表示數(shù)據(jù)的類(lèi)型、作用域或其它各種屬性。在Delphi中,你當(dāng)然可用這種方法,但是這不是推薦的方法。有個(gè)原因是這類(lèi)命名規(guī)范帶來(lái)個(gè)太多額外的記憶任務(wù),另外一個(gè)原因是由Delphi自身的特點(diǎn)決定的。Delphi的強(qiáng)制類(lèi)型檢查會(huì)自動(dòng)監(jiān)測(cè)所有的變量使用狀況,所以只需要我們稍加留心(注意單詞的大小寫(xiě))而不必費(fèi)勁的添加五花八門(mén)的前綴。另外,對(duì)數(shù)據(jù)的考慮要基于含義而不是類(lèi)型或作用域,注意力應(yīng)該放在放在程序結(jié)構(gòu)、邏輯關(guān)系和設(shè)計(jì)思路上。所以在Delphi中只需要使用完整的詞語(yǔ)組合來(lái)命名,不要考慮其它,當(dāng)然應(yīng)該盡可能的保持簡(jiǎn)潔。
在一些語(yǔ)句(比如for循環(huán))中我們要用到若干個(gè)整形數(shù)作為計(jì)數(shù)變量。在此可以簡(jiǎn)單的使用i、j、k這三個(gè)字母作為變量名稱。這是在Fortran語(yǔ)言中形成并被保留下來(lái)的習(xí)慣,事實(shí)證明這非常好用并且易于理解。當(dāng)然,我們使用更有意義的名稱會(huì)產(chǎn)生更好的效果,比如:MyCounter。一般來(lái)說(shuō)i、j、k三個(gè)字母已完全夠用了,否則應(yīng)該劃分出更多的過(guò)程或函數(shù)。
下面是幾個(gè)例子:
1. SongsList //表明這是一個(gè)歌曲的列表,song使用復(fù)數(shù)表明歌曲不止一首
2. SetCarColor //表明這是一個(gè)設(shè)置汽車(chē)顏色的函數(shù),若定義了一個(gè)TCar類(lèi),那么在類(lèi)中就使用SetColor作為設(shè)置汽車(chē)顏色的函數(shù)成員。
另外要注意對(duì)布爾變量的命名。布爾變量的名稱要能夠明確的表示出True和False的含義。比如說(shuō)記錄某文件是否存在的變量,使用IsFileExisted,就比使用FileExisted好。
最后,永遠(yuǎn)不要將一個(gè)全局變量命名為:Temp或Tmp,但是在過(guò)程或函數(shù)中如此命名還是允許的。其實(shí)對(duì)于這條規(guī)則存在一點(diǎn)爭(zhēng)議,在有的編碼規(guī)范中更為嚴(yán)格,如此命名是絕對(duì)禁止的,即使是在過(guò)程或函數(shù)中。但是,很多時(shí)候這樣命名的確很方便,尤其對(duì)于過(guò)程或函數(shù)。如果作為全局變量,很可能會(huì)出現(xiàn)類(lèi)型不匹配的賦值語(yǔ)句,雖然此時(shí)編譯器會(huì)給你很大的幫助,但是難以避免細(xì)小錯(cuò)誤的發(fā)生。總之,遵守此規(guī)則會(huì)產(chǎn)生較好的效果,但是在必要的情況下沒(méi)有什么是要嚴(yán)格遵守的。
1.2 縮進(jìn)和空格
每級(jí)之間要縮進(jìn)兩個(gè)空格,這樣會(huì)使程序?qū)哟畏置鳎e(cuò)落有致。千萬(wàn)不要使用制表符,因?yàn)橹票矸膶挾入S不同的設(shè)置和應(yīng)用程序的不同而難以保持一致,可不要指望你的程序只在Delphi中察看。另外要注意編輯器的使用,如果你只選擇了Delphi,那么沒(méi)有什么問(wèn)題;如果你同時(shí)還使用了
Word等文本處理器,請(qǐng)注意要使用適當(dāng)?shù)?a >字體,以確保每個(gè)字母、符號(hào)的寬度相同。用Word等文本處理器打印時(shí),同樣要注意字體的選擇。
空格的使用同樣是為了保持程序的整潔,是程序員能夠快速明白程序結(jié)構(gòu)。下面是一些規(guī)范和相應(yīng)的例子:
1. 每個(gè)單詞之間要留有一個(gè)空格。例如:for TMyClass = class(TObject)
2. 在“=”、“<>”、“>=”、“<=”左右要留有一個(gè)空格;在“:=”和“:”右邊要留有一個(gè)空格,而左邊不留。例如:if a = b then a:= b;a: integer;
3. 保留字和關(guān)鍵字與左邊的符號(hào)間要留有一個(gè)空格,與右邊的符號(hào)間不留。例如:
PRocedure ShowMessage; overload;
4. 括號(hào)的使用:在過(guò)程和函數(shù)的定義和調(diào)用中,括號(hào)與外部的單詞和符號(hào)之間不留空格;與內(nèi)部的單詞之間不留空格。在if語(yǔ)句的條件判斷中,與and、or等保留字之間要使用空格。例如:function Exchange(a: integer; b: integer); if (a = b) and ((a = c) or (a = d)) then … end;
1.3 邊距
Delphi編輯器在右邊大約第81個(gè)字符處留有一條暗線,實(shí)際上在Delphi的默認(rèn)界面下,當(dāng)分辨率在800*600時(shí),最大化窗口將顯示到該暗線左邊4個(gè)字母處。因此,不要將源代碼寫(xiě)到暗線之外,也就是說(shuō)每行包括前面和中間的空格不要多于80個(gè)字符。如果語(yǔ)句過(guò)長(zhǎng),那么換行完成,換行后要縮進(jìn)兩個(gè)字符。這樣也易于打印,在Delphi中超過(guò)暗線的部分不會(huì)被打印。如果使用Word等文字處理軟件打印Delphi程序,超出的部分會(huì)調(diào)到下一行的首部,這樣打印出的程序?qū)㈦y以閱讀。所以,盡量在編寫(xiě)代碼的時(shí)候做好一切調(diào)整,不要把這種工作留到打印的時(shí)候進(jìn)行。
換行時(shí)要注意保持程序的可讀性,盡量保持完整的部分。作為例子,如果函數(shù)過(guò)長(zhǎng),那么再換行時(shí)要將某個(gè)完整的參數(shù)說(shuō)明換行,而不要只將數(shù)據(jù)類(lèi)型聲明換行。下面的前兩種寫(xiě)法是正確的,后面的幾種寫(xiě)法都是錯(cuò)誤的:
function AdditonFiveInputNumber(a: integer; b: integer; c: integer; d: ineger;
e: integer): integer; //正確
function AdditonFiveInputNumber(
a: integer;
b: integer;
c: integer;
d: ineger;
e: integer): integer; //正確
function AdditonFiveInputNumber(a: integer; b: integer; c: integer; d:
ineger; e: integer): integer; //錯(cuò)誤
function AdditonFiveInputNumber(a: integer; b: integer; c: integer; d: ineger;
e: integer): integer; //錯(cuò)誤
function AdditonFiveInputNumber(a: integer; b: integer; c: integer; d: ineger;
e: integer): integer; //錯(cuò)誤
1.4 大小寫(xiě)
所有的自定義名稱中的每個(gè)單詞的首字母要使用大寫(xiě),其它字母使用小寫(xiě)。Delphi保留字和關(guān)鍵字要全部使用小寫(xiě)。Delphi預(yù)定義函數(shù)的寫(xiě)法與自定義名稱寫(xiě)法相同。Delphi中的基本數(shù)據(jù)類(lèi)型要使用小寫(xiě),擴(kuò)展的類(lèi)類(lèi)型要的前兩個(gè)字母要大寫(xiě)(類(lèi)類(lèi)型的首字母是“T”)。下面是一些例子:
1. 自定義名稱:MyFavouriteSong, CarList;
2. 保留字:if (a = b) and ((a = c) or (a = d)) then … end;
3. Delphi預(yù)定義函數(shù):ShowMessage('Everything all right');
4. Delphi擴(kuò)展類(lèi)類(lèi)型:MyStrings = TStrings.Create;
1.5 注釋
Delphi支持兩種注釋?zhuān)簤K注釋?zhuān)▄})和單行注釋?zhuān)?/)。注釋的作用是為了解釋程序的設(shè)計(jì)思路,幫助程序員盡快明白兩年前甚至昨天寫(xiě)的程序的思路。這實(shí)際上是為了解決記憶問(wèn)題,大腦不該被過(guò)分作為存儲(chǔ)器使用,在程序設(shè)計(jì)中永遠(yuǎn)不要過(guò)分依賴大腦,而要盡可能借助文字。所以說(shuō),注釋在程序設(shè)計(jì)語(yǔ)言中是十分重要的方面,盡管很多人(尤其是初學(xué)者,也包括相當(dāng)數(shù)量的程序員)對(duì)此毫不介意,他們很少寫(xiě)注釋。注釋的另外一個(gè)應(yīng)用是在程序調(diào)試階段,比如說(shuō)有兩個(gè)語(yǔ)句,事先并不知道哪一個(gè)更好,于是需要測(cè)試:將一條語(yǔ)句前放置"http://"(也就是說(shuō)將這條語(yǔ)句改為注釋?zhuān)\(yùn)行另一條語(yǔ)句,然后再做相反的工作,我們就可以輕松做出選擇。如果是一組語(yǔ)句,那就用塊注釋?zhuān)欢ㄗ⒁庖獙?{"和"}"放在顯眼的位置,比如說(shuō)放在單獨(dú)的上下兩行。下面是一些使用原則:
1. 多數(shù)情況下,在自定義變量、類(lèi)型的前面放置注釋是有必要的。
2. 多數(shù)情況下,在單元文件頂部放置注釋是必要的。在此,注釋中要包含:文件名、創(chuàng)建日期、修改日期、作者、修改作者以及必要的描述。
3. 注釋要有意義,不要使用沒(méi)用的注釋。比如:
while i < 8 do
begin
…
i:= i + 1; //Add one to i
end;
注釋“//Add one to i”在此是毫無(wú)意義的,當(dāng)然并不是說(shuō)簡(jiǎn)單的語(yǔ)句(類(lèi)似于:i : = i + 1)就不需要注釋。因?yàn)楹?jiǎn)單的語(yǔ)句往往會(huì)起到十分重要的作用,所以,如果這條語(yǔ)句會(huì)使人產(chǎn)生疑問(wèn)或者讓人難以理解,那么就要將此語(yǔ)句的作用標(biāo)記下來(lái)。
4. 不要試圖在注釋中創(chuàng)建組合圖案,除非你認(rèn)為這十分必要。因?yàn)樵诒3謭D案完整美觀的情況下修改注釋是非常困難的。。
5. 要區(qū)分臨時(shí)注釋和永久注釋?zhuān)憧梢杂媚愕姆椒ㄔ谧⑨屩蟹胖锰厥夥?hào)來(lái)區(qū)分。這樣的好處是易于查找。
6. 對(duì)語(yǔ)句的更改要映射到相應(yīng)的注釋中。
7. 注釋與代碼間要留有明顯的間隔,要一眼就能夠分清楚哪是語(yǔ)句哪是注釋。可以將注釋放在代碼行的前一行、后一行或留有至少兩個(gè)空格緊跟在代碼的后面,但是在代碼與注釋在同一行時(shí)不要使代碼跟在注釋的后面,另外,不要將在注釋放在代碼中間。