注:很多用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; hInstance: HINST; lpParam: Pointer): HWND; stdcall; if ((X = Y) or (Y = X) or (Z = P) or (F = J) then begin S := J; end;
while (LongExpression1 or LongExpression2) do begin // DoSomething // DOSomethingElse; end; if (LongExpression1) or (LongExpression2) or (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;
接口遵循相同規則