Ruby on Rails (RnR) 以「約定優於配置」與脚手架聞名,宣稱開發效率遠超 Java。本文以同一個食譜管理應用為例,對比 RnR 與 Java 模型驅動框架 OpenXava (OX),揭示 Java 生態同樣能達成高生產力,且擁有型別安全、可維護性等優勢。
| 面向 | Ruby on Rails | OpenXava |
| 核心範式 | MVC + 主動記錄 | 模型驅動 (MDA) |
| 起點 | 資料庫 Table → 產生 Model | Java Class (JPA Entity) → 產生 Schema |
| Controller | 產生 Scaffold 程式碼,需維護 | 通用 Controller,零程式碼 |
| View | .rhtml 模板,手寫 HTML/ERB | 自動渲染,零 View 程式碼 |
| 關聯維護 | 修改 Model + View 模板 | 單純 JPA 註解,自動反映 UI |
| 程式碼生成 | 被動產生,後續需手動修改 | 無生成,運行時解析註解 |
實戰對比:食譜管理應用
RnR 步驟
rails cookbook2
# 建立資料表 (SQL)
# 產生 Scaffold
ruby script/generate scaffold recipe recipe
ruby script/generate scaffold category category
結果:基礎 CRUD 頁面,但關聯下拉選單需手改 _form.rhtml,預設值需改 Controller,PDF/Excel/分頁/過濾需自行開發。
OpenXava 步驟
ant CreateNewProject.xml -Dproject=CookBook
# 撰寫 JPA Entity (Recipe.java, Category.java)
# 更新 Schema
ant updateSchema
結果:開箱即用 CRUD、PDF 匯出、Excel 匯出、欄位排序、分頁、過濾、Portlet 部署、主題適配,零 HTML/Controller 程式碼。
關鍵差異深度解析
Controller
- RnR:為每個 Entity 產生具體 Controller 程式碼,維護成本隨 Entity 增長
- OX:單一通用 Controller 處理所有 Entity,邏輯集中,修改一處處處生效
關聯處理
// RnR: category.rb + recipe.rb + _form.rhtml (3 處修改)
@Recipe.belongs_to :category
@Category.has_many :recipes
# _form.rhtml 手寫 select 下拉選單
// OX: 僅在 Entity 加註解
@ManyToOne(optional=false) @DescriptionsList
private Category category;
// Recipe.java
@OneToMany(mappedBy="category")
private Collection recipes;
OX 自動產生下拉選單、主從明細連結、集合瀏覽,零模板代碼。
預設值與業務邏輯位置
- RnR:在 Controller 設定
@recipe.date = Time.now
- OX:在 Model 加
@DefaultValueCalculator(CurrentDateCalculator.class)
- OX 推動業務邏輯下沉至 Model,符合「豐富領域模型」
開發體驗差異
- RnR 修改 Model 需重啟 Server(早期版本),OX 配合 Eclipse 熱部署即時生效
- OX 程式碼全為手寫 Java,重構、重命名、型別檢查全 IDE 支援
- RnR 動態語言特性雖靈活,但重構風險大、IDE 輔助弱
結論
Java 生產力問題非技術問題,而是文化問題。模型驅動框架(OpenXava、Naked Objects、Trails、Roma、JMatter)證明:寫純粹的 Model,其餘自動化,Java 同樣能極致高效。
選擇 RnR 或 OX 取決於團隊技術棧與長期維護策略,但「Java 必然低效」是錯覺。
- 上一篇文章: Java 執行外部程式完整指南:Runtime.exec、ProcessBuilder、輸入輸出流控制與阻塞解決
- 下一篇文章: Java 持久化框架四大天王對比:JPA、Hibernate、CMP Entity EJB、TopLink 選型指南
Copyright ©
程式碼之家 All Rights Reserved