本文檔主要是爲Delphi開發人員提供一個源代碼書寫標準,以及程序和文件的命名標準,使他們在編程時有一致格式可遵循。這樣,每一個編程人員編寫的代碼可以被其餘人理解。數據庫
縮進就是每級間有兩個空格。不要在源代碼中放置製表符。這是由於,製表符的寬度隨着不一樣的設置和代碼管理實用程序(打印、文檔及版本控制等)而不一樣。編程
經過使用Tools|Environment 菜單,在Environment Options 對話框的General頁上,不要選中Use Tab Character 和Optional Fill 複選框,這樣,製表符就不會被保存。數組
邊距設置爲80個字符。源代碼通常不會因寫一個單詞而超過邊距,但本規則比較靈活。只要可能,長度超過一行的語句應當用逗號或運算符換行。換行後,應縮進兩個字符。安全
begin...end 語句ide
begin 語句必須單獨佔一行。例如,下面第一行是錯誤的,而第二行正確:函數
for i:=0 to 10 do begin // 錯, begin 與f o r 在同一行 for i:=0 to 10 do // 對, begin 在另一行中 begin
本規則的一個特殊狀況是,當begin 爲else 語句的一部分時,例如:測試
if some statement = then begin . . . end else begin Some Other Statement; end;
注意:end 語句總單獨一行。當begin 不爲else 語句的一部分時,相應的end 語句與begin 語句的縮進量相同。優化
咱們一般使用「{...}」類型的塊註釋,之前的「(...)」類型的塊註釋用於臨時註釋掉暫不使用的代碼,從Delphi 2開始支持「//」行註釋,若是決定不在支持Delphi 2.0如下的版本,可使用「//」註釋。版本控制
Object Pascal語句格式語句書寫規範與用法指針
在左括號與下一字符之間沒有空格。一樣,右括號與前一字符也沒有空格。下面的例子演示了正確與不正確的空格。
CallProc( Aparameter ); // 錯! CallProc(Aparameter); // 正確!
不要在語句中包含多餘的括號。在源代碼中,括號只有在確實須要時才使用。下面的例子演示了正確與不正確用法:
if (I=42) then // 錯,括號是多餘的 if (I=42) or (J=42) then // 正確,必須使用括號
Object Pascal 語言的保留字和關鍵字老是徹底的小寫。
類型標識符是保留字,應當所有小寫。Win32 API 類型經常所有大寫,而且遵循諸如Windows.pas或其餘API單元中關於特定類型名的規則。對於其餘變量名,第一個字母應大寫,其餘字母則大小寫交錯。下面是一些例子:
var MyString: string; // 保留字 WindowsHandle: HWND; // Win32 API 類型 I: Integer; //在System單元中引入的類型標識
不鼓勵使用Real類型,由於它只是爲了與老的Pascal代碼兼容而保留的。一般狀況下,對於浮點數應當使用Double。Double可被處理器優化,是IEEE定義的標準的數據格式。當須要比Double提供的範圍更大時,可使用Extend。Extend是intel專用的類型,Java不支持。當浮點變量的物理字節數很重要時(可能使用其餘語言編寫DLL),則應當使用Single。
Variant和OleVariant
通常不建議使用Variant和OleVariant。可是,當數據類型只有在運行期才知道時(經常是在COM和數據庫應用的程序中),這兩個類型對編程就有必要。當進行諸如自動化ActiveX控件的COM編程時,應當使用OleVariant;而對於非COM編程,則應當使用Variant。這是由於,Variant可以有效地保存Delphi的原生字符串,而OleVariant則將全部字符串轉換爲OLE字符串(即WideChar字符串),且沒有引用計數功能。
在if/then/else語句中,最有可能執行的狀況應放在then子句中,不太可能的狀況放在else子句中。爲了不出現許多if語句,可使用case語句代替。若是多於5級,不要使用if語句。請改用更清楚的方法。不要在if語句中使用多餘的括號。
若是在if語句中有多個條件要測試,應按照計算的複雜程度從右向左排。這樣,可使代碼充分利用編譯器的短路估算邏輯。例如,若是Condition1比Condition2快,Condition2比Condition3快,則if語句通常應這樣構造:
if Condition1 and Condition2 and Condition3 then
若是Condition3爲False的機會很大,利用短路估算邏輯,咱們也能夠將Condition3放在最前面:
if Condition3 and Condition1 and Condition2 then
概述
case語句中每種狀況的常量應當按數字或字母的順序排列。每種狀況的動做語句應當簡短且一般不超過4 - 5 行代碼。若是動做太複雜,應將代碼單獨放在一個過程或函數中。Case語句的else子句只用於默認狀況或錯誤檢測。
格式
case語句遵循通常的縮進和命名規則。
建議不要使用Exit過程來退出while循環。若是須要的話,應當使用循環條件退出循環。全部對while循環進行初始化的代碼應當位於while入口前,且不要被無關的語句隔開。任何業務的輔助工做都應在循環後當即進行。
若是循環次數是肯定的,應當用for語句代替while語句。
repeat語句相似於while循環,且遵循一樣的規則。
概述
with語句應當心使用。要避免過分使用with語句,尤爲是在with語句中使用多個對象或記錄。例如:
with Record1,Record2 do
這些狀況很容易迷惑編程人員,且致使調試困難。
格式
with語句也遵循本章關於命名和縮進的規則。
結構化異常處理
概述
異常處理主要用於糾正錯誤和保護資源。這意味着,凡是分配資源的地方,都必須使用try...finally來保證資源獲得釋放。不過,若是是在單元的初始/結束部分或者對象的構造器/析構器中來分配/釋放資源則例外。
在可能的狀況下,每一個資源分配應當與try...finally結構匹配,例如,下面代碼可能致使錯誤:
SomeClass1 := TSomeClass.Create; SomeClass2 := TSomeClass.Create; try { do some code } finally SomeClass1.Free; SomeClass2.Free; end;
上述資源分配的一個安全方案是:
SomeClass1 := TSomeClass.Create; try SomeClass2 := TSomeClass.Create; try { do some code } finally SomeClass2.Free; end; finally SomeClass1.Free; end;
try...except的用法
若是你但願在發生異常時執行一些任務,可使用try...except。一般,沒有必要爲了簡單地顯示一個錯誤信息而使用try...except,由於Application對象可以自動根據上下文作到這一點。若是要在子句中激活默認的異常處理,能夠再次觸發異常。
try...except...else的用法
不鼓勵使用帶else子句的try...except,由於這將阻塞全部的異常,包括你沒有準備處理的異常。
命名
過程與函數名應當有意義。進行一個動做的過程最好在名稱前加上表示動做的動詞爲前綴。例如:procedure FormatHardDrive;
設置輸入參數值的過程名應當以Set 爲其前綴,例如:procedure SetUserName;
獲取數值的過程名應當以Get 爲其前綴,例如:function GetUserName:string;
全部形參的名稱都應當表達出它的用途。若是合適的話,形參的名稱最好以字母a 爲前綴,例如:
procedure SomeProc(aUserName:string; aUserAge:integer);
當參數名與類的特性或字段同名時,前綴a 就有必要了。
當兩個單元中含有相同名稱的過程時,若是調用該過程,實際被調用的是Uses 子句中較後出現的那個單元中的過程。爲避免這種狀況,可在方法名前加想要的單元名,例如:
SysUtils.FindClose(SR);
或Windows.FindClose(Handle);
變量的名稱應當可以表達出它的用途。循環控制變量經常爲單個字母,諸如I 、J 或K 。也可使用更有意義的名稱,例如UserIndex。布爾變量名必須能清楚表示出True 和False 值的意義。
局部變量遵循其餘變量的命名規則。
全局變量以大寫字母「G」打頭,並遵循其餘變量的命名規則。
枚舉類型名必須表明枚舉的用途。名稱前要加T字符做爲前綴,表示這是個數據類型。枚舉類型的標識符列表的前綴應包含2 - 3 個小寫字符,來彼此關聯。例如:
TSongType=(stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB);
枚舉類型的變量實例的名稱與類型相同,但沒有前綴T ,也能夠給變量一個更加特殊名稱,諸如:FavoriteSongTypel、FavoriteSongType2等等。
數組類型名應表達出該數組的用途。類型名必須加字母「T」爲前綴。若是要聲明一個指向數組類型的指針,則必須加字母P 爲前綴,且聲明在類型聲明以前。例如:
type PCycleArray = ^TCycleArray; TCycleArray=array[1..100] of integer;
實際上,數組類型的變量實例與類型名稱相同,但沒有「T」前綴。
記錄類型名應表達出記錄的用途。類型名必須加字母T爲前綴。若是要聲明一個指向記錄類型的指計,則必須加字母P爲前綴,且其聲明在類型聲明以前。例如:
type PEmployee = ^TEmployee; TEmployee = record EmployeeName: string; EmployeeRate: Double; end;