Ruby 和rail:回归框架
Ruby和 rail是非常简洁的,很容易,很丰富。我无法避免的连续看到以及听到以上这样的说法。比如 说,Bill Walton 写的Rail回顾上关于Ruby的文章提到:“如果我告诉你当你使用Rail开发一个Web应用 程序可以比你使用一种特定的Java框架开发要快至少十倍的时候,你会怎么想?”
在尝试了RnR之后,我发现这就是一个伴随旧技术的非常经典的框架:
· Ruby是一种非常有力量的语言,就像Smalltalk。我选择静态语言。
· 搭建的材料是被动代码生成。就像是IDE wizards或者AppFuse。我选择动态代码生成,或者是更好 的——根本就不需要代码生成。
· 关系数据库中心:编码发生器和ActiveRecord在表中会被首先想到,然后是在类别中被想到。我选 择一种仅仅面向对象的,就像是Hibernate、JPA 甚至是ODBMS。
· MVC:我正在寻找比旧式MVC框架更新很好的工具。
Java的问题:Java开发者
在Java的世界中,生产力是文化问题,而不是技术问题。这就是所谓的这不是Java的错,而是我们的 错,我们作为Java开发者需要设计出非常漂亮的体系,以适用于任何地方的GoF模式、使得任何工具都是 可再度使用的、把三层架构放到我们所有的系统中以及使用web服务器。我们不是在寻找最直接的方法, 所以我们就没办法发现最直接的方法。但是Java、是一种非常简单的语言,使得我们很轻易就可以接近软 件开发。
Java生产力:其它的方法
解决生产力的一个方法是使用驱动模型。这就是模型环节的开发,仅仅是我们应用程序中的模型环节 ,就可以使用框架来生产所有的应用程序。MDA 、OpenXava 、Trails、 NakedObjects、 Roma框架和 JMatter都是采用的这种方式。
目标
这是所需要应用程序的主要界面:
图一
基本上,应用程序推测需要做三件事情:
· 列出所有准则的清单
· 创造新准则和编辑现有的准则
· 为某个类别指定合适的准则
Ruby on Rails第一次冲刺
使用RnR的第一步是创建一个新的项目,在命令行你需要输入:
$ rails cookbook2
现在你必须创建以及配置你的数据库。
现在是时间输入你的第一行代码了,在这个例子中使用SQL代码:
drop table if exists recipes; drop table if exists categories; create table categories ( id int not null auto_increment, name varchar(100) not null default '', primary key(id) ) engine=InnoDB; create table recipes ( id int not null auto_increment, category_id int not null, title varchar(100) not null default '', description varchar(255) null, date date null, instructions text null, constraint fk_recipes_categories foreign key (category_id) references categories(id), primary key(id) ) engine=InnoDB;
显然你需要在数据库上面执行这些语句。
最后的步骤是生成Ruby代码,你只需要执行O.S框架的下一个命令:
$ ruby script/generate scaffold recipe recipe
$ ruby script/generate scaffold category category
现在,你已经拥有RnR应用程序的第一个版本,并且准备运行。
很少量的工作,一个简单的“创建表格”,然后执行向导。让我们看看结果。
Rails结果
这是应用程序的结果:
图二
图三
图四
少量的工作,少量的结果。
JPA on OX的第一次冲刺
继续使用OpenXava。使用OpenXava的第一步是创建新的项目:
$ ant CreateNewProject.xml -Dproject=CookBook
现在你必须创建以及配置你的数据库。
现在是时间输入你的第一步代码了,在这个例子中使用Java代码:
Recipe.java: package org.openxava.cookbook.model; import java.util.*; import javax.persistence.*; import org.openxava.annotations.*; @Entity @View(members="title; description; date; instructions") public class Recipe { @Id @GeneratedValue @Hidden private Integer id; @Required @Column(length=100) private String title; @Column(length=255) private String description; private Date date; @Stereotype("HTML_TEXT") private String instructions; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDescription() { return description; } public void setDescription (String description) { this.description = description; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public String getInstructions() { return instructions; } public void setInstructions(String instructions) { this.instructions = instructions; } } Category.java: package org.openxava.cookbook.model; import java.util.*; import javax.persistence.*; import org.openxava.annotations.*; @Entity public class Category { @Id @GeneratedValue @Hidden private Integer id; @Required @Column(length=100) private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
最后一个步骤是生成数据库图表,你只需要执行项目中的一个小目标:
$ ant updateSchema
现在,你已经拥有OpenXava应用程序的第一个版本,并且准备运行。
少量的工作,简单的POJO,以及执行“更新图表”。让我们看看结果。
OpenXava结果
这是应用程序的结果:
图五
图六
注意,用户可以创建更新、删除、从列表生成PDF、将列表输入到excel、每一列的命令、大型结果和 过滤数据的支持分页。而且你可以直接部署,不需要代码,仅仅是执行一个小目标,JSR-168入口上的应 用程序,以及OpenXava的look & feel能够适用于入口的look & feel。这就是一个应用程序准备 产出的第一步。
少量的工作,完美的结果。
观察这里RnR 与 OX之间的差别,一个冷静的观点是在RnR中,你先输入表,而在OpenXava中先输入类 别。
控制器
Rails引起basic CRUD的控制逻辑,你在下面可以看到:
图七
另一方面,OX不会为CRUD生成任何代码,OpenXava仅有一个属性代码,可以执行CRUD和打印,将自动 化配置给所有的实体。你可以书写你自己的属性CRUD逻辑,或者你可以为一个特有的实体书写详细逻辑, 但是你不会为每一个实体设置控制代码。使用这种方法,你需要维护少量的代码,并且你可以改变CRUD独 立单元的逻辑。
Rails使用合成码,OX使用属性代码。
你可以在OpenXava wiki上面学到更多的OX控制器知识。
增加关联
为了规范在Ruby中从类别增加关联,你需要在category.rb中书写如下代码:
图八
以及在recipe.rb中:
图九
相当简单。但是,你要做更多的工作,你必须编译。
cookbook2/app/views/recipe/_form.rhtml
增加如下代码:
Category
:
结果是:
图十
在这个环节,OpenXava中,你不得不在Category.java中使用JPA规定关联:
@ManyToOne(optional=false) @DescriptionsListprivate Category category;and in Recipe.java:@OneToMany(mappedBy="category")private Collection recipes;
而且你不需要接触任何类似HTML代码。应用程序将会显示如下:
图十一
你有一个为修改产生的链接或者从这里创建新类别。
不增加任何辅助编码,如果使用者使用类别单元,他将获得每一个类别中准则的收集,如下所示:
图十二
在这里,RnR应用程序还是不具备这种特性,你需要书写一些Ruby 和HTML代码来实现一样的结果。
在这一块,RnR 和 OX的主要差别是,在OX中你不需要书写任何HTML类似的代码,事实上你连用户界面 代码都根本不需要书写。
精确的基础资料
Ruby on Rails指导的下一个步骤是为一种特性生成基础资料。在RnR中你不得不编译控制编码从而达 到这个目的。让我们开看看。
修改以及更新的方法是增加如下代码行:
@recipe.date = Time.nowThe equivalent in OX is adding the @DefaultValueCalculaTor annotation in model:@DefaultValueCalculaTor(CurrentDateCalculaTor.class)private Date date;
用一种更为公开的方法获得一样的结果
在这里,尽管RnR中在控制器上放置的代码,OX中统计基础资料的代码,为了确认以及业务逻辑,一般 来说是放在模型上。OX促进从控制器转移业务逻辑到模型上。
RnR的相关文章中提到:“我改良模型文件,所以我需要重新启动我们的web服务器”。尽管使用 Eclipse WTP 我只需要按一下Ctrl 加上B,在浏览器上点击刷新以便于看见OpenXava应用程序上面模型的 变化。
结论
Ruby on Rails 和 OpenXava之间最主要的差别是RnR是 MVC框架,你不得不书写模型和控制器。OX是 模型驱动框架,你只需要书写模型。结果就是更少的代码,更好的程序。
另一个大的不同点是RnR使用被动代码生成方式;这就是说,生成代码,但是这之后如果你想要扩展或 者提炼代码,你不得不编译合成码。OpenXava不需要使用代码生成器,你所拥有的代码都是你所书写的。 你可以在Java的世界中找到提高生产力的方法。
没有什么可留恋,只有抑制不住的梦想,没有什么可凭仗,