Delphi代碼規範

1. 前言

本文檔主要是爲Delphi開發人員提供一個源代碼書寫標準,以及程序和文件的命名標準,使他們在編程時有一致格式可遵循。這樣,每一個編程人員編寫的代碼可以被其餘人理解。數據庫


2. 源程序書寫規範

2.1. 2.1.通用源代碼格式規則
2.2. 縮進

縮進就是每級間有兩個空格。不要在源代碼中放置製表符。這是由於,製表符的寬度隨着不一樣的設置和代碼管理實用程序(打印、文檔及版本控制等)而不一樣。編程

經過使用Tools|Environment 菜單,在Environment Options 對話框的General頁上,不要選中Use Tab Character 和Optional Fill 複選框,這樣,製表符就不會被保存。數組

2.3. 邊距

邊距設置爲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 語句的縮進量相同。優化

2.4. 註釋

咱們一般使用「{...}」類型的塊註釋,之前的「(...)」類型的塊註釋用於臨時註釋掉暫不使用的代碼,從Delphi 2開始支持「//」行註釋,若是決定不在支持Delphi 2.0如下的版本,可使用「//」註釋。版本控制

Object Pascal語句格式語句書寫規範與用法指針

2.5. 括號

在左括號與下一字符之間沒有空格。一樣,右括號與前一字符也沒有空格。下面的例子演示了正確與不正確的空格。

CallProc( Aparameter ); // 錯!
CallProc(Aparameter); // 正確!

不要在語句中包含多餘的括號。在源代碼中,括號只有在確實須要時才使用。下面的例子演示了正確與不正確用法:

if (I=42) then // 錯,括號是多餘的
if (I=42) or (J=42) then // 正確,必須使用括號
2.6. 保留字和關鍵字

Object Pascal 語言的保留字和關鍵字老是徹底的小寫。

2.7. 類型
2.7.1. 大小寫規則

類型標識符是保留字,應當所有小寫。Win32 API 類型經常所有大寫,而且遵循諸如Windows.pas或其餘API單元中關於特定類型名的規則。對於其餘變量名,第一個字母應大寫,其餘字母則大小寫交錯。下面是一些例子:

var
 MyString: string; // 保留字
 WindowsHandle: HWND; // Win32 API 類型
 I: Integer; //在System單元中引入的類型標識
2.7.2. 浮點型

不鼓勵使用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字符串),且沒有引用計數功能。

2.8. 語句
2.8.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.8.2. case 語句

概述

case語句中每種狀況的常量應當按數字或字母的順序排列。每種狀況的動做語句應當簡短且一般不超過4 - 5 行代碼。若是動做太複雜,應將代碼單獨放在一個過程或函數中。Case語句的else子句只用於默認狀況或錯誤檢測。

格式

case語句遵循通常的縮進和命名規則。

2.8.3. while 語句

建議不要使用Exit過程來退出while循環。若是須要的話,應當使用循環條件退出循環。全部對while循環進行初始化的代碼應當位於while入口前,且不要被無關的語句隔開。任何業務的輔助工做都應在循環後當即進行。

2.8.4. for 語句

若是循環次數是肯定的,應當用for語句代替while語句。

2.8.5. repeat 語句

repeat語句相似於while循環,且遵循一樣的規則。

2.8.6. with 語句

概述

with語句應當心使用。要避免過分使用with語句,尤爲是在with語句中使用多個對象或記錄。例如:

with Record1,Record2 do

這些狀況很容易迷惑編程人員,且致使調試困難。

格式

with語句也遵循本章關於命名和縮進的規則。

結構化異常處理

概述

異常處理主要用於糾正錯誤和保護資源。這意味着,凡是分配資源的地方,都必須使用try...finally來保證資源獲得釋放。不過,若是是在單元的初始/結束部分或者對象的構造器/析構器中來分配/釋放資源則例外。

2.8.7. 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,由於這將阻塞全部的異常,包括你沒有準備處理的異常。

3. 命名規範

3.1. 過程(Procedure)與函數(Function)

命名

過程與函數名應當有意義。進行一個動做的過程最好在名稱前加上表示動做的動詞爲前綴。例如:procedure FormatHardDrive;

設置輸入參數值的過程名應當以Set 爲其前綴,例如:procedure SetUserName;

獲取數值的過程名應當以Get 爲其前綴,例如:function GetUserName:string;

3.2. 形參

全部形參的名稱都應當表達出它的用途。若是合適的話,形參的名稱最好以字母a 爲前綴,例如:

procedure SomeProc(aUserName:string; aUserAge:integer);

當參數名與類的特性或字段同名時,前綴a 就有必要了。

3.3. 命名衝突

當兩個單元中含有相同名稱的過程時,若是調用該過程,實際被調用的是Uses 子句中較後出現的那個單元中的過程。爲避免這種狀況,可在方法名前加想要的單元名,例如:

SysUtils.FindClose(SR);

或Windows.FindClose(Handle);

3.4. 變量(Variable)

變量的名稱應當可以表達出它的用途。循環控制變量經常爲單個字母,諸如I 、J 或K 。也可使用更有意義的名稱,例如UserIndex。布爾變量名必須能清楚表示出True 和False 值的意義。

3.4.1. 局部變量

局部變量遵循其餘變量的命名規則。

3.4.2. 全局變量

全局變量以大寫字母「G」打頭,並遵循其餘變量的命名規則。

3.5. 類型(Type)
3.5.1. 枚舉型

枚舉類型名必須表明枚舉的用途。名稱前要加T字符做爲前綴,表示這是個數據類型。枚舉類型的標識符列表的前綴應包含2 - 3 個小寫字符,來彼此關聯。例如:

TSongType=(stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB);

枚舉類型的變量實例的名稱與類型相同,但沒有前綴T ,也能夠給變量一個更加特殊名稱,諸如:FavoriteSongTypel、FavoriteSongType2等等。

3.5.2. 數組類型

數組類型名應表達出該數組的用途。類型名必須加字母「T」爲前綴。若是要聲明一個指向數組類型的指針,則必須加字母P 爲前綴,且聲明在類型聲明以前。例如:

type
 PCycleArray = ^TCycleArray;
 TCycleArray=array[1..100] of integer;

實際上,數組類型的變量實例與類型名稱相同,但沒有「T」前綴。

3.5.3. 記錄類型

記錄類型名應表達出記錄的用途。類型名必須加字母T爲前綴。若是要聲明一個指向記錄類型的指計,則必須加字母P爲前綴,且其聲明在類型聲明以前。例如:

type
 PEmployee = ^TEmployee;
 TEmployee = record
   EmployeeName: string;
   EmployeeRate: Double;
 end;
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息