本文通過構建同一個「食譜管理應用」(Cookbook),對比 Ruby on Rails (RnR) 與 Java 生態中的模型驅動框架 OpenXava (OX),深度剖析兩種開發篩式的核心差異:MVC 手寫代碼 vs 模型驅動自動生成。
| 維度 | Ruby on Rails | OpenXava (模型驅動) |
|---|---|---|
| 核心哲學 | 約定優於配置,MVC 分層手寫 | 模型即應用,僅寫領域模型 |
| 代碼生成 | 被動生成:脚手架生成後需手工維護 | 無代碼生成:運行時動態構建 UI |
| 數據庫優先 | 先建表,再生成模型 | 先寫類,自動更新表結構 |
| 控制器邏輯 | 為每個實體生成 CRUD 控制器代碼 | 通用控制器,零代碼支持 CRUD/打印/導出 |
| 關聯處理 | 需修改模型+視圖模板 | 僅在模型加注解(@ManyToOne/@OneToMany) |
| 默認值/業務邏輯 | 寫在控制器 | 寫在模型(@DefaultValueCalculator) |
$ rails cookbook2
# 配置 database.yml
# 編寫 SQL 建表
$ ruby script/generate scaffold recipe recipe
$ ruby script/generate scaffold category category
結果:基本 CRUD 界面,需手工修改視圖添加關聯下拉框。
$ ant CreateNewProject.xml -Dproject=CookBook
# 編寫 POJO 實體類(含 JPA/Bean Validation 注解)
$ ant updateSchema
結果:功能完整的 Web 應用,含列表過濾、分頁、PDF/Excel 導出、JSR-168 Portlet 部署、關聯導航、集合視圖等企業級特性,零 HTML/JS 代碼。
has_many/belongs_to,還需編輯 _form.rhtml 手寫 select 標籤。@ManyToOne @DescriptionsList,自動生成帶搜索/創建彈窗的下拉組件,零視圖代碼。Rails 傾向胖控制器(如 @recipe.date = Time.now 在 Controller);OX 推崇富領域模型(@DefaultValueCalculator 在實體),邏輯隨模型復用,利於測試。
文章指出:Java 低生產力非語言問題,而是「過度設計文化」——追求 GoF 模式、三層架構、Web Service 通用性,而非最直接解決方案。模型驅動(MDA、OpenXava、Naked Objects、Roma、JMatter、Trails)正是打破此困境的鑰匙:只寫模型,框架負責其餘一切。
對比同樣需求,OpenXava 以極少代碼產出功能更豐富的企業級應用。Rails 的脚手架生成代碼後需大量手工定制,本質是「代碼生成器」;OX 的運行時元數據驅動架構,才是真正的「模型驅動」。Java 生態擁有同樣甚至更強的模型驅動能力,關鍵在於架構選型與思維轉變。