5). 類型
(1). 大小寫規則
類型標識符是保留字,應當全部小寫。Win32 API 類型常常全部大寫,並且遵循諸如Windows.pas或其他API單元中關於特定類型名的規則。對於其他變量名,第一個字母應大寫,其他字母則大小寫交錯。下面是一些例子:
var
MyString: string; // 保留字
WindowsHandle: HWND; // Win32 API 類型
I: Integer; //在System單元中引入的類型標識
(2). 浮點型
不鼓勵使用Real類型,因為它只是為了與老的Pascal代碼兼容而保留的。通常情況下,對於浮點數應當使用Double。Double可被處理器優化,是IEEE定義的標准的數據格式。當需要比Double提供的范圍更大時,可以使用Extend。Extend是intel專用的類型,Java不支持。當浮點變量的物理字節數很重要時(可能使用其他語言編寫DLL),則應當使用Single。
(3).Variant和OleVariant
一般不建議使用Variant和OleVariant。但是,當數據類型只有在運行期才知道時(常常是在COM和數據庫應用的程序中),這兩個類型對編程就有必要。當進行諸如自動化ActiveX控件的COM編程時,應當使用OleVariant;而對於非COM編程,則應當使用Variant。這是因為,Variant能夠有效地保存Delphi的原生字符串,而OleVariant則將所有字符串轉換為OLE字符串(即WideChar字符串),且沒有引用計數功能。
6). 語句
(1). If 語句
在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
(2). case 語句
(1) 概述
case語句中每種情況的常量應當按數字或字母的順序排列。每種情況的動作語句應當簡短且通常不超過4 - 5 行代碼。如果動作太復雜,應將代碼單獨放在一個過程或函數中。Case語句的else子句只用於默認情況或錯誤檢測。
(2) 格式
case語句遵循一般的縮進和命名規則。
(3). while 語句
建議不要使用Exit過程來退出while循環。如果需要的話,應當使用循環條件退出循環。所有對while循環進行初始化的代碼應當位於while入口前,且不要被無關的語句隔開。任何業務的輔助工作都應在循環後立即進行。
(4). for 語句
如果循環次數是確定的,應當用for語句代替while語句。
(5). repeat 語句
repeat語句類似於while循環,且遵循同樣的規則。
(6). with 語句
(1) 概述
with語句應小心使用。要避免過度使用with語句,尤其是在with語句中使用多個對象或記錄。例如:
with Record1,Record2 do
這些情況很容易迷惑編程人員,且導致調試困難。
(2) 格式
with語句也遵循本章關於命名和縮進的規則。
7). 結構化異常處理
(1). 概述
異常處理主要用於糾正錯誤和保護資源。這意味著,凡是分配資源的地方,都必須使用try...finally來保證資源得到釋放。不過,如果是在單元的初始/結束部分或者對象的構造器/析構器中來分配/釋放資源則例外。
(2). 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;
(3). try...except的用法
如果你希望在發生異常時執行一些任務,可以使用try...except。通常,沒有必要為了簡單地顯示一個錯誤信息而使用try...except,因為Application對象能夠自動根據上下文做到這一點。如果要在子句中激活默認的異常處理,可以再次觸發異常。
(4). try...except...else的用法
不鼓勵使用帶else子句的try...except,因為這將阻塞所有的異常,包括你沒有准備處理的異常。
3.命名規范
3.1.過程(Procedure)與函數(Function)
1).命名
過程與函數名應當有意義。進行一個動作的過程最好在名稱前加上表示動作的動詞為前綴。例如:
procedure FormatHardDrive;
設置輸入參數值的過程名應當以Set 為其前綴,例如:
procedure SetUserName;
獲取數值的過程名應當以Get 為其前綴,例如:
function GetUserName:string;
2).形參
所有形參的名稱都應當表達出它的用途。如果合適的話,形參的名稱最好以字母a 為前綴,例如:
procedure SomeProc(aUserName:string; aUserAge:integer);
當參數名與類的特性或字段同名時,前綴a 就有必要了。
3).命名沖突
當兩個單元中含有相同名稱的過程時,如果調用該過程,實際被調用的是Uses 子句中較後出現的那個單元中的過程。為避免這種情況,可在方法名前加想要的單元名,例如:
SysUtils.FindClose(SR);
或Windows.FindClose(Handle);
3.2.變量(Variable)
變量的名稱應當能夠表達出它的用途。循環控制變量常常為單個字母,諸如I 、J 或K 。也可以使用更有意義的名稱,例如UserIndex。布爾變量名必須能清楚表示出True 和False 值的意義。
1). 局部變量
局部變量遵循其他變量的命名規則。
2). 全局變量
全局變量以大寫字母“G”打頭,並遵循其他變量的命名規則。
3.3.類型(Type)
3.3.1.一般類型
1). 枚舉型
枚舉類型名必須代表枚舉的用途。名稱前要加T字符作為前綴,表示這是個數據類型。枚舉類型的標識符列表的前綴應包含2 - 3 個小寫字符,來彼此關聯。例如:
TSongType=(stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB);
枚舉類型的變量實例的名稱與類型相同,但沒有前綴T ,也可以給變量一個更加特殊名稱,諸如:FavoriteSongTypel、FavoriteSongType2等等。
3.3.2.構造類型
1). 數組類型
數組類型名應表達出該數組的用途。類型名必須加字母“T”為前綴。如果要聲明一個指向數組類型的指針,則必須加字母P 為前綴,且聲明在類型聲明之前。例如:
type
PCycleArray = ^TCycleArray;
TCycleArray=array[1..100] of integer;
實際上,數組類型的變量實例與類型名稱相同,但沒有“T”前綴。
2). 記錄類型
記錄類型名應表達出記錄的用途。類型名必須加字母T為前綴。如果要聲明一個指向記錄類型的指計,則必須加字母P為前綴,且其聲明在類型聲明之前。例如:
type
PEmployee = ^TEmployee;
TEmployee = record
EmployeeName: string;
EmployeeRate: Double;
end;