編碼標準主要是為開發組提供一種程式設計時的準則,使專案開發人員在程式設計時有一致格式可遵循。這樣,開發組中每個程式設計師所寫的程式碼能夠被其他人理解,從而提高程式碼的可維護性,使得一套多人寫的軟體就像一人寫的,使得程式碼更容易理解。這要求大家使用一致的程式碼樣式。 那麼,之所以老生常談介紹這些標準,是因為當新的開發人員加入專案開發小組時,有的可能還不熟悉Delphi的編碼標準。 這裡將分成以下幾類來介紹這些標準:1 一般的原始碼格式規則2過程與函數3 檔案、窗體與資料模組命名4 套件、元件命名一般的原始碼格式規則縮排縮排就是每級間有兩個空格。不要在原始程式碼中放置製表符。這是因為,製表符的寬度隨著不同的設定和程式碼管理實用程式(列印、文件及版本控制等)而不同。邊距邊距設定為80個字元。原始碼一般不會因為寫一個單字而超過邊距,但本規則比較靈活。只要可能,長度超過一行的語句應用逗號或運算子換行。換行後,應縮排兩個字元。括號在左括號與下一字元之間沒有空格。同樣,右括號與前一字元也沒有空格。下面的例子示範了正確與不正確的空格。 CallPRocedure( Parameters ); // 錯誤!CallProcedure (Parameters); // 正確!保留字和關鍵字Object Pascal語言的保留字和關鍵字總是完全的小寫。 begin...endbegin語句必須單獨佔一行。例如,下面第一行是錯誤的,而第二行正確:for i:=0 to 10 do beginStatement end// 錯, begin 與for在同一行for i:=0 to 10 do //正確! begin 在另外一行中beginStatementend本規則的一個特殊情況是,當begin為else語句的一部分。例如:if Condition thenbeginStatement endelse beginStatement;endend語句總是單獨一行。當begin不為else語句的一部分時,對應的end語句與begin語句的縮排量相同。語句(1) if_then_else語句最有可能執行的情況應放在then子句中,不太可能的情況放在else子句中。為了避免出現許多if語句,可以使用case語句來代替。如果多於5級,不要使用if語句。請改用更清楚的方法。不要在if語句中使用多餘的括號。在原始碼中,括號只有在確實需要時才使用。例如:if (I=42) then // 錯,括號是多餘的if (I=42) or (J=42) then // 正確,必須使用括號如果在if語句中有多個條件要測試,應依照計算的複雜程度從右向左排。這樣,可以使程式碼充分利用編譯器的短路估算邏輯。如果Condition1比Condition2快,Condition2比Condition3快,則if語句應這樣建構:if Conditior1 and Condition2 and Condition3 then(2) case_else語句case語句中每種情況的常數應按數字或字母的順序排列。每種情況的動作語句應簡短且通常不超過4 ~ 5行程式碼。如果動作太複雜,應將程式碼單獨放在一個過程或函數中。 case語句的else子句只用於預設情況或錯誤偵測。 (3) while 語句建議不要使用exit程序來退出while迴圈。如果需要的話,應使用循環條件退出循環。所有對while迴圈進行初始化的程式碼應位於while入口前,且不要被無關的語句隔開。任何業務的輔助工作都應在循環後立即進行。 (4) for語句如果迴圈次數是確定的,應當用for語句代替while語句。 (5) repeat語句repeat語句類似while循環,且遵循同樣的規則。 (6) with語句with語句應小心使用。若要避免過度使用with語句,尤其是在with語句中使用多個物件或記錄。例如:with Record1,Record2 do這些情況很容易迷惑程式設計人員,且導致除錯困難。結構化異常處理異常處理主要用於修正錯誤和保護資源。這意味著,凡是分配資源的地方,都必須使用try... finally來保證資源得到釋放。不過,如果是在單元的初始/結束部分或物件的建構器/析構器中來分配/釋放資源則例外。 (1) try... finally的用法在可能的情況下,每個資源分配應與try... finally結構相符。例如://下面程式碼可能導致錯誤SomeClass1: = TSomeClass.Create;SomeClass2: = TSomeClass.Create;try{do some code}finallySomeClass.Free;SomeClass.Free;end ;//上述資源分配的一個安全方案是: SomeClass1: = TSomeClass Create;trySomeClass2: = TSomeClass Create;try{do some code}finallySomeClass2.Free;end;finallySomeClass1.Free;end;(2) try...except的用法如果你希望在發生異常時執行一些任務,可以使用try...except。通常,沒有必要為了簡單地顯示一個錯誤訊息而使用try...except,因為application物件能夠自動根據上下文做到這一點。如果要在子句中啟動預設的異常處理,可以再次觸發異常。 (3) try... except...else的用法不鼓勵使用帶有else子句的try...except,因為這將阻塞所有的異常,包括你沒有準備處理的異常。