Delphi 建立在 Object Pascal 之上,完整支援封裝、繼承、多型等 OOP 特性。然而,許多開發者僅停留在拖拉元件的 RAD 模式,忽略了良好的類別設計對專案長期維護的關鍵性。本文整理 20 條實戰守則,涵蓋單元劃分、命名慣例、封裝策略、表單繼承等核心議題,助你邁向 Delphi 高手行列。
Private/Protected 成員僅對「其他單元」隱藏。若將多個類別放在同一單元,它們互相可見,破壞封裝。建議:複雜類別各自獨立單元;簡單衍生類別可共用單元,但單一單元不超過 20 個複雜類別。
表單、單元、元件皆需有意義名稱。慣用「類別縮寫 + 功能」格式,如 BtnAdd、EdtName。命名風格以團隊共識為準,重點在一致性。
預設名稱 BtnAddClick 僅說明觸發來源。改為 AddToList 等動作導向名稱,可讀性大增,且利於多元件共用同一事件處理器,或在程式碼中主動呼叫。
表單本質是類別。將功能封裝為表單的 Public 方法,供其他表單呼叫,優於直接操作他表單的元件。
執行期建立的表單需自訂初始化參數。使用 overload 重載 Create,並呼叫 inherited Create(Application),確保 Owner 關係正確。
單元 interface 區宣告的變數即全域變數。改用:
• 表單類別的 Private 欄位 (各實例獨有)
• 單元 implementation 區變數 (同類別多實例共享)
• 主表單 Private 欄位或 Screen.Forms 陣列 (跨表單共享)
在 TForm1 方法中引用全域 Form1 會導致多實例時邏輯錯誤。需用 Self 參考當前實例,或盡量省略物件前綴直接存取成員。
跨表單存取應透過屬性、方法或建構子參數傳遞,減少耦合。
專案選項中取消「Auto-create forms」,並在 .dpr 中手動建立/釋放。這能強迫開發者正視「類別 vs 實例」的差異,編譯器也會攔截殘留的全域引用。
Private 欄位 + Public 屬性 (Read/Write 對應 Get/Set 方法) 是標準封裝模式。修改 UI 元件時,只需調整 Get/Set 內部實作,呼叫端完全不受影響。
若外部需存取表單內 Edit1.Text,請在表單定義 property Text: string read GetText write SetText;,內部再映射到 Edit1.Text。未來換成 ComboBox 只改 Get/Set 即可。
如需索引存取 ListBox 項目,可定義 property Items[Index: Integer]: string read GetItems write SetItems; 並實作邊界檢查,甚至設為 default 讓 Form1[3] 直接可用。
Set 方法中可同步更新多個 UI 元件、觸發驗證、啟用/禁用按鈕等,將商業邏輯集中於屬性層,避免分散在事件處理器中。
IDE 為了 DFM 串流化,預設將元件宣告在 published。手動移至 private 可隱藏實作細節,但會失去 IDE 自動連結 (SetReference) 功能。解決方案:在 OnCreate 中呼叫 Edit1 := FindComponent('Edit1') as TEdit;,並在單元初始化區註冊類別 RegisterClass([TEdit]);。
手動搬移元件、寫 Get/Set 極易出錯。可撰寫專家精靈 (Wizard) 自動產生程式碼片段,再貼上即可。作者網站 marcocantu.com 提供相關工具。
大型專案中,建立基底表單包含共用選單、工具列、資料庫連線、事件處理器等,衍生表單僅擴充差異部分。File → New → Inheritable Form 即可啟用。
為了讓子類別存取而將欄位設為 Protected,違反封裝原則。若遵循守則 14 (元件在 Private),子類別本就無法直接存取基類元件,這反而強迫你提供存取方法,才是正確設計。
基類元件放 Private,對外提供 protected function GetText: string; procedure SetText(const Value: string);。子類別可呼叫 SetText('') 或覆寫它們。
虛擬方法允許子類別覆寫行為,基類流程呼叫虛擬方法即可實現多型。例如 procedure Validate; virtual; 讓每個衍生表單自行實作驗證邏輯。
將 Get/Set 宣告為 virtual,子類別覆寫 Set 時可加入額外邏輯 (如空值檢查) 並呼叫 inherited,無需重新定義屬性本身。
這 20 條守則並非教條,而是經驗萃取。專案越大、團隊越多,遵循程度越需提高。初期投入的額外程式碼 (建構子、屬性、封裝層),將換來架構彈性、維護容易、團隊協作順暢的長期紅利。期待未來 Delphi 版本能以語言層面支援 (如 class helpers, record 方法等) 降低這些成本。