?? delphi代碼規(guī)范.txt
字號(hào):
Delphi 4 程序員代碼編寫(xiě)標(biāo)準(zhǔn)指南
版權(quán)所有 1998 Xavier Perched和 Steve Teiseira
一、序言
二、通用源代碼格式規(guī)則
2.1 縮格
2.2 頁(yè)邊空格
2.3 Begin...End 配對(duì)
三、Object Pascal
3.1 括號(hào)
3.2 保留字和關(guān)鍵字
3.3 過(guò)程和函數(shù)(例程)
3.3.1 命名/格式化
3.3.2 形式參數(shù)
3.3.2.1 格式化
3.3.2.2 命名
3.3.2.3 參數(shù)的排序
3.3.2.4 常量參數(shù)
3.3.2.5 名稱(chēng)的沖突
3.4 變量
3.4.1 變量的命名和格式
3.4.2 局部變量
3.4.3 全局變量的使用
3.5 類(lèi)型
3.5.1 大寫(xiě)約定
3.5.1.1 浮點(diǎn)指針類(lèi)型
3.5.1.2 枚舉類(lèi)型
3.5.1.3 變數(shù)和ole變數(shù)類(lèi)型
3.5.2 結(jié)構(gòu)類(lèi)型
3.5.2.1 數(shù)組類(lèi)型
3.5.2.2 記錄類(lèi)型
3.6 語(yǔ)句
3.6.1 if 語(yǔ)句
3.6.2 case 語(yǔ)句
3.6.2.1 一般性話(huà)題
3.6.2.2 格式
3.6.3 while 語(yǔ)句
3.6.4 for 語(yǔ)句
3.6.5 repeat 語(yǔ)句
3.6.6 with 語(yǔ)句
3.6.6.1 一般話(huà)題
3.6.6.2 格式
3.7 結(jié)構(gòu)異常處理
3.7.1 一般話(huà)題
3.7.2 try...finally的使用
3.7.3 try...except的使用
3.7.4 try...except...else的使用
3.8 類(lèi)類(lèi)型
3.8.1 命名和格式
3.8.2 域
3.8.2.1 命名/格式
3.8.2.2 可視化
3.8.3 方法
3.8.3.1 命名/格式
3.8.3.2 使用靜態(tài)的方法
3.8.3.3 使用虛擬/動(dòng)態(tài)的方法
3.8.3.4 使用抽象的方法
3.8.3.5 屬性存取方法
3.8.4 屬性
3.8.4.1 命名/格式
3.8.4.2 使用存取的方法
四、文件
4.1 工程文件
4.1.1 命名
4.2 窗體文件
4.2.1 命名
4.3 數(shù)據(jù)模板文件
4.3.1 命名
4.4 遠(yuǎn)端數(shù)據(jù)模板文件
4.4.1 命名
4.5 Unit文件
4.5.1 通用Unit結(jié)構(gòu)
4.5.1.1 unit的名字
4.5.1.2 uses子句
4.5.1.3 interface部分
4.5.1.4 implementation部分
4.5.1.5 initialization部分
4.5.1.6 finalization部分
4.5.2 窗體單元
4.5.2.1 命名
4.5.3 數(shù)據(jù)模板單元
4.5.3.1 命名
4.5.4 一般目的單元
4.5.4.1 命名
4.5.5 構(gòu)件單元
4.5.5.1 命名
4.6 文件頭
五、窗體和數(shù)據(jù)模板
5.1 窗體
5.1.1 窗體類(lèi)型命名標(biāo)準(zhǔn)
5.1.2 窗體實(shí)例命名標(biāo)準(zhǔn)
5.1.3 自動(dòng)創(chuàng)建窗體
5.1.4 模式窗體實(shí)例化函數(shù)
5.2 數(shù)據(jù)模板
5.2.1 數(shù)據(jù)模板命名標(biāo)準(zhǔn)
5.2.2 數(shù)據(jù)模板實(shí)例命名標(biāo)準(zhǔn)
六、包
6.1 使用運(yùn)行包和設(shè)計(jì)包的比較
6.2 文件命名標(biāo)準(zhǔn)
七、構(gòu)件
7.1 用戶(hù)自定義構(gòu)件
7.2 構(gòu)件單元
7.3 使用注冊(cè)單元
7.4 構(gòu)件實(shí)例命名約定
7.5 構(gòu)件的前綴
7.6 Standard頁(yè)
7.7 Additional頁(yè)
7.8 Win32頁(yè)
7.9 System頁(yè)
7.10 Internet頁(yè)
7.11 Data Access頁(yè)
7.12 Data Controls頁(yè)
7.13 Decision Cube頁(yè)
7.14 QReport頁(yè)
7.15 Dialogs頁(yè)
7.16 Win3.1頁(yè)
7.17 Samples頁(yè)
7.18 ActiveX頁(yè)
7.19 Midas頁(yè)
一、序言
本文檔詳述了在Delphi 4開(kāi)發(fā)者指南下進(jìn)行編程的代碼編寫(xiě)標(biāo)準(zhǔn)。在通常情況下,本文檔遵循“取消”式格式的指引方針,該方針由Borland國(guó)際通過(guò)一些例外來(lái)使用。在Delphi 4開(kāi)發(fā)者指南中包含本文檔的目的在于闡述一種方法,通過(guò)該方法,開(kāi)發(fā)小組可以在他們所編寫(xiě)的代碼中保持一貫的風(fēng)格。這樣做的目的是使在開(kāi)發(fā)小組中的每一個(gè)程序員都可以明白其他程序員的代碼。這有助于提高代碼編寫(xiě)的可讀性和使用的一貫性。
本文檔并不意味著包含了所有存在于代碼中的標(biāo)準(zhǔn)。但是,它的內(nèi)容已足夠幫你起個(gè)好頭。你可以自由的增加修改這些標(biāo)準(zhǔn)來(lái)滿(mǎn)足你的需要。我們不贊成你偏離這些由Borland開(kāi)發(fā)人員所使用的標(biāo)準(zhǔn)太遠(yuǎn)。我們推薦這么做是因?yàn)橐坏┯行碌某绦騿T加入到你的開(kāi)發(fā)小組中,而他們最喜歡和最熟悉的是Borland的標(biāo)準(zhǔn)。象大多數(shù)代碼標(biāo)準(zhǔn)文檔,本文檔也會(huì)根據(jù)需要進(jìn)行改動(dòng)。因此,你可以到www.xapware.com/ddg中找到最新的更新版本。本文檔不包括用戶(hù)接口標(biāo)準(zhǔn)。本文檔是獨(dú)立的但也是同樣重要的。已經(jīng)有足夠的第三方書(shū)籍和Microsoft文檔包括了另外一些指導(dǎo)方針,而我們決定并不復(fù)制這些信息,但我們會(huì)指引你到Microsoft Developers Network 和一些資源,在那兒可以找到你所需的信息。
二、通用源代碼格式規(guī)則
2.1 縮格
縮格是指在每一級(jí)有兩個(gè)空格。不要在源代碼中保留tab字符,這是因?yàn)閠ab字符會(huì)隨著不同用戶(hù)的不同設(shè)置和不同的資源管理工具(打印、文檔、版本控制等)而代表不同的寬度。
你可以通過(guò)關(guān)閉Environment選項(xiàng)對(duì)話(huà)框中Editor頁(yè)上的“Use tab character”和“Optimal fill”檢查框(通過(guò)Tools|Environment)來(lái)禁止保存tab字符。
2.2 頁(yè)邊空格
頁(yè)邊空格會(huì)被設(shè)置成80字符寬。通常,源碼不會(huì)超出這個(gè)邊界,但這個(gè)方針會(huì)有一些彈性。不管是否有可能,那些超出到另一行的語(yǔ)句會(huì)在一個(gè)逗號(hào)或其他操作符之后與前面的語(yǔ)句相連。當(dāng)一個(gè)語(yǔ)句被打斷相連時(shí),它應(yīng)比原來(lái)的那一行語(yǔ)句縮進(jìn)兩個(gè)字符。
2.3 Begin...End 配對(duì)
Begin 子句應(yīng)寫(xiě)在獨(dú)立的一行。例如,下面第一行是錯(cuò)誤的寫(xiě)法而第二行是正確的。
for I := 0 to 10 do begin //錯(cuò)誤,begin同for在同一行
for I := 0 to 10 do //正確,begin出現(xiàn)在獨(dú)立的一行
begin
這個(gè)規(guī)則的例外是當(dāng)begin子句的出現(xiàn)是作為一個(gè)else子句的一部分-參考例子:
if some statement then
begin
...
end
else begin
someOtherStatement;
end;
end 語(yǔ)句永遠(yuǎn)出現(xiàn)在獨(dú)立的一行。
當(dāng)begin語(yǔ)句不是一個(gè)else子句的一部分時(shí),相應(yīng)的end語(yǔ)句永遠(yuǎn)縮進(jìn)到與begin部分相對(duì)應(yīng)的位置。
三、Object Pascal
3.1 括號(hào)
永遠(yuǎn)不要在括號(hào)與括號(hào)之間的字符中間留下空格。下面的例子示范了錯(cuò)誤的與正確地使用括號(hào)中的空格:
CallProc( Aparameter ); //錯(cuò)誤
CallProc(Aparameter); //正確
永遠(yuǎn)不要在一個(gè)語(yǔ)句中使用不必要的括號(hào)。括號(hào)只應(yīng)在源代碼中需要的地方使用。以下的例子示范了錯(cuò)誤和正確的使用:
if (I = 42) then //錯(cuò)誤 - 多余的括號(hào)
if (I = 42) or (J = 42) then //正確 - 需要括號(hào)
3.2 保留字和關(guān)鍵字
Object Pascal 保留字和關(guān)鍵字永遠(yuǎn)是全部小寫(xiě)。
3.3 過(guò)程和函數(shù)(例程)
3.3.1 命名/格式化
例程的名字永遠(yuǎn)應(yīng)該以大寫(xiě)的字母開(kāi)頭并且中間錯(cuò)落分明以便于可讀性。下面是一個(gè)不正確格式的過(guò)程名稱(chēng):
procedure thisisapoorlyformattedroutinename;
下面是一個(gè)合適的大小寫(xiě)例程名稱(chēng)的例子:
procedure ThisIsMuchMoreReadableRoutineName;
例程的名稱(chēng)應(yīng)該同它的內(nèi)容相符。一個(gè)會(huì)導(dǎo)致某個(gè)行為的例程應(yīng)以動(dòng)詞開(kāi)頭。例如:
procedure FormatHardDrive;
一個(gè)用于設(shè)置輸入?yún)?shù)的例程應(yīng)以單詞set作為前綴,例如:
procedure SetUserName;
一個(gè)用來(lái)接收某個(gè)值的例程應(yīng)以單詞get作為前綴,例如:
procedure GetUserName : string;
3.3.2 形式參數(shù)
3.3.2.1 格式化
如果有的話(huà),相同類(lèi)型的形參應(yīng)合并在一個(gè)語(yǔ)句中:
procedure Foo(Param1, Param2, Param3 : Integer; Param4 : string);
3.3.2.2 命名
所有形參的名字應(yīng)是十分符合它們所代表的意義,特別是應(yīng)該以傳送到例程中的標(biāo)志符的名稱(chēng)為基礎(chǔ)。一個(gè)好的參數(shù)名稱(chēng)應(yīng)以字符A為前綴 - 例如:
procedure SomeProc(AuserName : string; AuserAge : integer);
“A”前綴按約定表示該參數(shù)的名稱(chēng)是與類(lèi)類(lèi)型中的一個(gè)屬性或域的名稱(chēng)相對(duì)應(yīng)的。
3.3.2.3 參數(shù)的排序
下面的形參的順序重點(diǎn)說(shuō)明了注冊(cè)者調(diào)用約定調(diào)用的好處。
- 最常用的參數(shù)應(yīng)放在第一位,其它的參數(shù)應(yīng)按從左到右的順序排列。
- 輸入?yún)?shù)列表應(yīng)放在輸出參數(shù)列表的左邊。
- 將通用的參數(shù)放在特殊參數(shù)的左邊,例如:
procedure SomeProc(Aplanet, AContinent, Acountry, Astate, Acity)
- 排序有可能有些例外,比如事件的處理。類(lèi)型為T(mén)Object的Sender參數(shù)經(jīng)常放在第一位。
3.3.2.4 常量參數(shù)
當(dāng)一個(gè)參數(shù)為記錄型、數(shù)組類(lèi)型、ShortString、或接口類(lèi)型并且在例程中不被改變時(shí),這些參數(shù)應(yīng)做上常量標(biāo)記。這樣做會(huì)讓編譯器更加有效率的產(chǎn)生有關(guān)這些不改變的參數(shù)的代碼。
而例程中另外一些非變參數(shù)也可常量來(lái)傳送。盡管這樣做沒(méi)有產(chǎn)生任何效果和提高效率,這將會(huì)給調(diào)用例程的使用者提供更多的信息。
3.3.2.5 名稱(chēng)的沖突
當(dāng)使用擁有兩個(gè)名稱(chēng)相同的例程的兩個(gè)單元時(shí),如果你調(diào)用該例程時(shí),在uses子句中排在后面的單元中的例程將會(huì)被調(diào)用。為了解決這種“在uses子句上的模糊”沖突,要在調(diào)用該例程時(shí)寫(xiě)上相關(guān)的單元的前綴,例如:
sysUtile.FindClose(SR);
或
windows.FindClose(Handle);
3.4 變量
3.4.1 變量的命名和格式
變量的命名應(yīng)以使用它們的目的相符
循環(huán)控制變量應(yīng)采用一個(gè)單獨(dú)的字符作為名字,比如 I,J,或K,也可以采用更加有意義的名字,比如 UserIndex。
邏輯變量的名字應(yīng)能充分表達(dá)準(zhǔn)確的真或假的意思。
3.4.2 局部變量
一個(gè)過(guò)程中的局部變量應(yīng)遵循所有其它變量的使用和命名約定。臨時(shí)變量的取名應(yīng)合理。
如果必須的話(huà),在一進(jìn)入例程就應(yīng)初始化局部變量。局部的AnsiString變量會(huì)自動(dòng)初始化為一個(gè)空的字符串。
局部接口和派分接口類(lèi)型變量將會(huì)自動(dòng)初始化為nil,并且局部變數(shù)和ole變數(shù)類(lèi)型變量會(huì)自動(dòng)初始化為Unassigned
3.4.3 全局變量的使用
使用全局變量是不推薦的。但是,在某些時(shí)候還是必須使用,而且它們也只應(yīng)在必須使用的時(shí)候才使用。在這種時(shí)候,你應(yīng)努力只在一段上下文范圍內(nèi)使用全局變量。例如,一個(gè)全局變量只應(yīng)在一個(gè)單元的implemntation部分內(nèi)是全局的。如果打算在多個(gè)單元類(lèi)使用全局?jǐn)?shù)據(jù),你應(yīng)將它們移到一個(gè)公共的單元中然后被其它所有單元使用。
全局變量可以在var子句中直接初始化為一個(gè)值。記住,所有的全局?jǐn)?shù)據(jù)會(huì)自動(dòng)初始化為0,因此不要將全局變量初始化為一個(gè)“空”值比如 0、nil、''、Unassigned、等等。這樣做的一個(gè)理由是因?yàn)榱悖跏蓟娜謹(jǐn)?shù)據(jù)在exe文件中不會(huì)占據(jù)任何空間。零-初始化數(shù)據(jù)被存儲(chǔ)在一個(gè)虛擬的數(shù)據(jù)段,它在應(yīng)用程序啟動(dòng)后被分配在一段內(nèi)存中。非零-初始化的全局?jǐn)?shù)據(jù)在硬盤(pán)的exe文件占用空間。
3.5 類(lèi)型
3.5.1 大寫(xiě)約定
如果類(lèi)型的名字是保留字,那么它應(yīng)全部小寫(xiě)。Win32 API類(lèi)型通常全部大寫(xiě),并且你必須遵循在Windows.pas或其他API單元中的詳細(xì)類(lèi)型名稱(chēng)的約定。對(duì)于其他變量名字,地一個(gè)字母應(yīng)為大寫(xiě),而其他字母應(yīng)錯(cuò)落有致。下面是一些例子:
var
MyString : string; //保留字
WindowHandle : HWND; //Win32 API 類(lèi)型
I : Integer; //在System單元中引進(jìn)的類(lèi)型標(biāo)識(shí)符
3.5.1.1 浮點(diǎn)指針類(lèi)型
不推薦使用Real類(lèi)型,因?yàn)樗拇嬖谥皇菫榱讼蚯凹嫒菰缙诘腜ascal代碼。在通常情況下用Double來(lái)實(shí)現(xiàn)浮點(diǎn)指針的需要。并且,Double對(duì)處理器和總線而言是做了最優(yōu)化處理的,它也是IEEE中定義的標(biāo)準(zhǔn)數(shù)據(jù)格式。只有當(dāng)需要的范圍超出Double所定義的范圍時(shí)才使用Extended。Extended是intel定義的類(lèi)型且在Java中不支持。只有當(dāng)浮點(diǎn)指針變量的實(shí)際字節(jié)大小有其意義時(shí)才使用Single。(比如當(dāng)使用另一種語(yǔ)言的DLLs時(shí))。
3.5.1.2 枚舉類(lèi)型
枚舉類(lèi)型的名字需符合使用該類(lèi)型的目的。該類(lèi)型的名字需以字符T為前綴,以表明這是一個(gè)類(lèi)型。枚舉類(lèi)型中的標(biāo)識(shí)符列表必須包含兩個(gè)或三個(gè)字符的前綴來(lái)對(duì)應(yīng)于該枚舉類(lèi)型的名字 - 例如:
TsongType = (stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB);
一個(gè)枚舉類(lèi)型的實(shí)例的名字應(yīng)與不要前綴的枚舉類(lèi)型(SongType)相同,除非有更好的原因來(lái)賦予該變量更特殊的名字,比如:FavoriteSongType1,FavoriteSongType2 等等。
3.5.1.3 變數(shù)和ole變數(shù)類(lèi)型
通常不建議使用變數(shù)和Ole變數(shù)類(lèi)型。但在只有運(yùn)行時(shí)刻才能知道數(shù)據(jù)類(lèi)型的程序中必須使用該類(lèi)型,這種情形多出現(xiàn)在COM和數(shù)據(jù)庫(kù)開(kāi)發(fā)中。Ole變數(shù)使用在以COM為基礎(chǔ)的編程中例如自動(dòng)化和ActiveX控制,而變數(shù)使用在非COM的編程中,這是因?yàn)樽償?shù)可以十分有效地存儲(chǔ)本地Delphi字符串(同一個(gè)字符串變量一樣),但Ole變數(shù)會(huì)將所有的字符串轉(zhuǎn)換為Ole字符串(WideChar 字符串)并且并不實(shí)例運(yùn)算 - 它們永遠(yuǎn)拷貝。
3.5.2 結(jié)構(gòu)類(lèi)型
3.5.2.1 數(shù)組類(lèi)型
數(shù)組類(lèi)型的名字需符合它們使用的目的。該類(lèi)型的名字必須加以前綴T。如果須聲明該數(shù)組類(lèi)型的指針,那么該指針需加以前綴P而且應(yīng)立即聲明在該數(shù)組聲明的前面。例如:
type
PCycleArray = ^TCycleArray;
TCycleArray = array[1...100] of integer;
在實(shí)際應(yīng)用中,數(shù)組的變量實(shí)例的名稱(chēng)應(yīng)是其類(lèi)型的名字去掉前綴T。
3.5.2.2 記錄類(lèi)型
記錄類(lèi)型的名字應(yīng)符合使用它們的目的。其類(lèi)型的聲明應(yīng)加以前綴T。如果要聲明該記錄類(lèi)型的指針,就應(yīng)加以前綴P并且應(yīng)緊靠在類(lèi)型聲明的前面聲明。例如:
type
PEmployee = ^TEmployee;
TEmployee = record
EmployeeName : string;
EmployeeRate : Double;
end;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -