參考VCL的代碼,結合筆者近兩年來的一些經驗,可以簡單總結出一套Delphi下常用的命名規範。
- 類型定義(type)
- 包括class、record、枚舉、procedure/function變數等所有寫在type下的類型定義
- 用大寫的T開頭,例如TList(class)、TPoint(record)、TAlign(枚舉)、TNotifyEvent(procedure變數)
- 常量(const)
- 自訂的簡單類型常量(如Integer、Pointer等類型)建議用C開頭
- 也有不少常量是需要根據單詞意思推斷的,如MaxDateTime(以Max開頭,讓人從意思上猜到是常量)
- 字串常量用S開頭(因為字串常量與簡單類型常量在編譯時間處理方式不同,詳情可參考《Delphi原始碼分析》2.2.4常量)
- 類的private成員變數、implementation下的全域變數
- 用F開頭
- 類裡絕對不要出現public成員變數,所有要公開的屬性用property或者procedure、function代理出來
- interface下的全域變數
- interface下最好不要出現全域變數,可以替換為用interface裡的function返回implementation下的全域變數值
- 如果一定要有的話,用G開頭
- 局部變數
- 函數(procedure或function)實參
除了這些以外,筆者有一些自己常用的Delphi編程習慣,拿出來跟大家分享,歡迎拍磚。
- 用項目縮寫做名字開頭
- 由於Delphi裡沒有C++中的namespace或者Java裡的package這些概念,所以名字衝突問題比較嚴重。為了盡量避免這種問題,可以在一個項目的專有全域類型、常量前面加上項目名稱的縮寫。例如對於一個叫做MyProject的項目,其下的專屬類可以叫做TMPOneClass,常量可以叫做CMPOneNumber,等等。
- 用function代替全域變數
- 當我們需要訪問剪下板時,會用到Clipboard這個對象,不知道大家有沒有注意到,這其實是一個返回TClipboard對象的function,而且還用到了設計模式的Singleton模式。
- 由於Delphi裡調用無參函數可以不寫括弧,所以很多時候可以把一個function當做一個變數使用,具體怎麼用大家可以發散一下思維,Singleton只是其中一個例子。
- 用Pascal命名法
- 上面這些命名方式,總得來說是根據Pascal命名法演化而來的。
- Pascal命名法的基本思想就是一個名字裡如果包含多個單詞,每個單詞的首字母都要大寫,例如ThisIsAnExample。
- 不建議使用底線命名法(如this_is_an_example),主要是因為Delphi的變數名自動補全工具不會自動過濾底線,手動輸入比較累。。。
- 由於Delphi中變數名對大小寫不敏感(如A和a其實是同一個變數,這是跟C語系的語言最大的不同),所以絕對不要嘗試用字母大小寫區分變數,所有變數最好都用大寫字母開頭。