qingrui li 根據Charles Calvert的Object Pascal Style Guide編註
註:許多用Delphi的人不注意程式碼風格,常寫一些不規範的程式碼,以致別人很難看懂且容易出錯。希望本文能鼓勵廣大Delphi愛好者統一到標準風格,共同前進。
本文描述了格式化Delphi程式碼的標準風格。次風格基於Delphi開發組的編碼約定。我們承認許多流行的源碼使用了不同於我們的風格,但是我們強烈建議在公共源碼社區使用Borland風格。
Delphi是個漂亮的語言,優點中重要的一條就是可讀性。本標準為增強可讀性設計。當開發者遵循本標準,所有開發者將從統一易讀的風格中受益。強化風格標準的努力可以提高原始程式的價值,尤其在調試和維護週期。
InfixCaps命名風格
又叫CamelCaps,名字由幾個表達意義的字組成,每個字的首字母大寫,其餘小寫。
如:MyFile,IntToStr,Items。
Delphi不使用匈牙利表示法,而推薦意義明確的名字。如用AppName而非lpszAppName,用Successful而非bSuccess,用ClientRect而非lPRectClientRect。
原始檔命名
使用InfixCaps形式。如果轉譯C/C++頭文件,則使用與原頭文件相同的名字。如果需要將多個頭檔合併到一個單元,則使用主要頭檔的名字,如:WinBase.h、Windows.h合併為Windows.pas。
命名約定
除了保留字和指示字全部小寫,其它標識符使用InfixCaps風格。
註:最近似乎傾向於局部變數和形式參數使用簡單的小寫或縮寫。
例外是轉譯頭檔的識別符保留原風格。
類型名稱都以T打頭(Type的首字母)
函數、過程、方法名稱使用動詞或動詞片語,其它標識符使用名詞或名詞片語。
類別資料成員以F打頭(Field的首字母)
枚舉類型成員前冠以小寫的類型縮寫,一般兩個字母,例:
TBitBtnKind = (bkCustom, bkOK, bkCancel, bkHelp, bkYes, bkNo, bkClose, bkAbort, bkRetry, bkIgnore, bkAll);
傳回布林值的函式以Is打頭,例:IsVisible、IsResizable
空白的使用
在適當位置插入空行,分隔程式碼的不同部分,如類別聲明間、函數實現間等。
使用空格的位置:標點的右邊,二元運算子的兩邊
不應插入空格的位置:
正確的例子:
function TMyClass.MyFunc(var Value: Integer);MyPointer := @MyRecord;MyClass := TMyClass(MyPointer);MyInteger := MyIntegerArray[5];
錯誤的例子:
function TMyClass.MyFunc( var Value: Integer ) ;MyPointer := @ MyRecord;MyClass := TMyClass ( MyPointer ) ;MyInteger := MyIntegerArray [ 5 ] ;
縮排
應使用兩個空格的縮進,不要使用Tab字元。
begin...end間的程式碼要縮進,begin...end本身不縮排
續行時縮排兩個空格
正確的例子:
function CreateWindowEx(dwExStyle: DWord; lpClassName: PChar; lpWindowName: PChar; dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU;InInstances; if ((X = Y) or (Y = X) 或 (Z = P) 或 (F = J) thenbegin S := J;end;
while (LongExpression1 or LongExpression2) do begin // DoSomething // DoSomethingElse;end;if (LongExpression1) or (LongExpression2) 或 (LongExpression3) then
類別
類聲明安下列順序組織
資料域
方法
屬性
訪問層次安下列順序組織,但IDE自動產生的程式碼是例外
建構函式和析構函式宣告在方法宣告的前面。由於TObject.Destroy是虛函數且TObject.Free呼叫的是Destroy,所以析構函數不要用其它的名字。建構函式可以用Create外的名字,但一般最好統一用Create。
例:
TMyClass = class(TObject) private protected public published end;
資料應該只在私有部分聲明,並以F打頭(Field的首字母)。
type TMyClass = class(TObject) private FMyData: Integer; function GetData: Integer; procedure SetData(Value: Integer); public published property MyData: Integer read GetData write SetData; end;
介面遵循相同規則