在 MyAppfuse 專案規劃初期,引入代碼生成工具是關鍵議題。CodeGeneration.net 匯集了跨平台、跨語言的各類生成器,但代碼生成其實與「代碼重複」這類壞味道一樣古老。即使在繼承、委託、反射、AOP 等技術充分發展的今天,編碼工作依然枯燥且充滿重複。此時,我們需要從更高抽象層次描述系統,再由機器生成我們又愛又恨的代碼,這就是生成式編程的核心價值。
高階 MDA 以 UML 為元模型,配合 MOF、OCL 定義轉換語法,試圖完整描述系統。然而,這類方案短期內難以大規模推廣:
為減少落差,AndroMDA 等工具選擇降低模型高度,僅依賴 UML 靜態類圖。隨著 AOP、Metadata、O/R Mapping、IOC 容器及微軟 DSL 技術演進,MDA 仍將緩慢發展——畢竟這是開發者的終極夢想。
當前階段,採用輕量級方案最為實際。本文採用的技術棧為:XML 格式自定義模型 + Groovy Template 模板語言(注意是 Groovy Template,非完整 Groovy 語言)。
OMG 已承認 UML 非唯一解,更高層模型同樣可用於描述與轉換。XML 以其原生樹狀結構、廣泛工具鏈支持,成為輕型建模的最佳載體。
遷移戰場從 Web 表現層至代碼生成,評判標準隨之改變:
| 維度 | JSP | Velocity/Freemarker | Groovy Template |
|---|---|---|---|
| 邏輯處理能力 | 強 (純 Java 語法) | 弱 (需依賴工具類) | 極強 (Groovy 腳本語法) |
| XML DOM 原生支持 | 無 (需 JDOM/XPath,語法冗長) | Freemarker 內建優雅語法 | 原生 GPath,極致簡潔 |
| 代碼簡潔度 | 最差 (標籤瀰漫) | 優 | 優 |
| 運行依賴 | 需 Web Container | 獨立運行 | 獨立運行 |
假設元數據結構:
<TABLE name="user">
<COLUMN name="id"/>
<COLUMN name="name"/>
</TABLE>
<#list table.column as col> ${col.@name} 或 table.column*.@nameGroovy Template 結合了 JSP 的邏輯表達力與 Freemarker 的標記語言簡潔性,且原生支援 GPath 處理 XML,是當前代碼生成場景的最優解。雖生態尚在成熟期,但遷移成本低,值得投入實踐。工具選型無絕對標準,記錄決策過程以備團隊參考。