前言
面向物件設計優於任何具體技術,但需防止過度設計。本文彙整十二條在 J2EE 開發中經驗證證的核心原則。
十二條設計原則
- 介面鬆耦合:面向介面編程,雖增微複雜度,但獲取:實現可替換不影響調用端、促進重用、利於測試 Stub 實現。
- 組合優於繼承:組合提供運行時行為變更彈性,Strategy/State 模式基石。
- 模板方法模式:正確使用繼承。已知演算法骨架、延遲具體步驟實現。IoC/DI 即模板方法應用——框架調用用戶碼,反轉控制。適合框架設計。
- 策略模式:比模板方法更靈活。適用於:所有步驟可變、具體步驟類有繼承層次、需與其他類關聯、運行時切換、步驟持續增加。
- 回調機制:策略模式特例。集中錯誤處理/資源管理、與底層實現解耦、單一流程多種實現重用。缺點:調用鏈隱藏、需建立回調介面。適合單方法回調介面(可用內部類實現)。
- 觀察者模式:僅當出現鬆耦合監聽者需求時使用。過度使用導致業務邏輯淹沒於事件發布碼。監聽者須快速返回、線程安全。
- 參數物件化:將多參數封裝為物件,簡化簽名、支援預設參數、調用端不變。代價:可能產生大量小物件消耗堆記憶體。
- 異常處理策略:
- Java 分 Checked (Exception) / Unchecked (RuntimeException)。
- 傳統觀點偏好 Checked,作者主張視情況:
— 所有調用者必須處理/作為替代回傳值 → Checked
— 僅少數調用者處理 → Runtime
— 嚴重不可恢復錯誤 → Runtime
— 不確定 → Runtime (並建議文檔聲明)
- 最佳實踐:保留原始異常、重寫
getMessage()/printStackTrace()、豐富錯誤資訊 (錯誤碼、詳細上下文)。
- 反射增強框架性:
- 運行時載入/實例化/操作類,強化工廠模式(類名外部配置)。
- 替代
switch/if-else 進行屬性驗證:掃描 validateXxx 方法建立 Map,新增屬性無需修改核心邏輯,一次測試應對所有變更。
- 動態代理 (JDK 1.3+) 為 AOP 基石。
- JavaBeans 靈活性:利用
PropertyEditor、PropertyChangeListener、VetoableChangeListener、Introspector 實現外部配置驅動。
- 應用程式登記表替代單例:傳統單例硬編碼、難測試、不支援介面/繼承。應用上下文 可動態配置、支援 JNDI、普通 Java 類實現,解決所有痛點。
- 全方位重構:不限程式碼,錯誤訊息、日誌、文檔皆為重構對象。