關於開發習慣的思考積壓已久,今日不吐不快。發文動機或許包含博取積分,但更希望能為同行提供參考,同時也期待各位批評指正,共同精進。
新專案第一步:建立獨立目錄(目錄名與專案同名或簡潔明確)。目錄下再建立以下子目錄:
<Doc>:存放需求說明、概要設計、詳細設計等開發文檔<Source>:存放 .dpr、.pas、.dfm 等原始碼<Dcu>:存放編譯產生的 .dcu 檔,與原始碼分離保持 Source 整潔<Bin>:存放輸出檔(.exe、.dll、.ocx 等)<Log>:存放日誌檔,習慣放一個「專案名_程式設計師日誌.txt」<Images>、<Wav>、<Avi> 等:依資源類型分類存放在 Delphi 中建立新專案並存入 Source 目錄,同步設定:
Project Options → Directories/Conditionals:Output Directory 指向 Bin,Unit output Directory 指向 Dcu新增單元 unt<專案名>Consts.pas,集中存放專案所有常數,避免硬編碼散落各處。
採用匈牙利命名法:登入視窗表單命名 FrmLogin,對應單元 untLogin。去除前綴後名稱保持一致。單元頭部務必加入註解:功能描述、作者、版權、建立時間、最後修改時間、修改歷史等。
表單 Caption 設為類別名(如 TFrmLogin),而非預設 FrmLogin——因為設計的是類別而非實例。「操作員登入」等顯示標題屬執行期工作,存於常數單元以 ResourceString 或 Const 定義,在 OnCreate 事件動態賦值:
procedure TFrmLogin.FormCreate(Sender: TObject);
begin
Caption := csLoginTitle;
...
end;
Format 函數需顯示「生日:1976/3/18」時,勿用字串相加。習慣在常數單元定義 csBirthDayFormat = '生日:%d/%d/%d',再用 Format(csBirthDayFormat, [iYear, iMonth, iDay]) 組裝。優勢顯而易見:顯示格式只需在一處維護。Format 功能強大,深得我心,你呢?
早期分別用 TRegistry、TIniFile,介面不統一。後發現 TRegistryIniFile 繼承自 TCustomIniFile,TIniFile 亦然。故可用抽象類 TCustomIniFile 統一存取:
var csmIniFile: TCustomIniFile;
begin
if blUseIniFile then
csmIniFile := TIniFile.Create(csRootKey)
else
csmIniFile := TRegistryIniFile.Create(csRootKey);
// 後續統一用 csmIniFile 讀寫
end;
TFileStream、TMemoryStream 均繼承自 TStream。定義介面時傾向用抽象類型參數:
function Save(AStream: TStream): Boolean; // 靈活、具前瞻性
// 優於
function Save(AStream: TFileStream): Boolean; // 死板、僅限檔案流
習慣:若存在抽象類,盡量將參數定義為抽象類型——我們無法預見未來。
TAction 簡化 UI 狀態同步Delphi 4 引入 Action 概念與 TActionList,徹底解決控制項狀態同步煩惱。