首页 / 软件开发 / JAVA / 用Rails创建高质量Web应用
用Rails创建高质量Web应用2011-07-06 infoq 胡振波越来越多的企业开始选择Rails作为Web应用的框架。Rails曾经还主要是一些轻公司的选择,但今天一些“重”企业(比如保险、金融等行业的企业)也开始把Rails纳入内部应用甚至外部应用的考虑范围。我最近服务过的客户是国外某大型保险公司,该公司就选择了Rails来创建他们的保险销售网站。选择Rails的原因,是因为它快速构建的能力,是因为它是Web开发的DSL。但是否选择了Rails就代表了高效开发?是否在Rails上创建的Web应用就一定是高质量的?答案是否定的。从我参与过的几个Rails项目来看,质量可谓是参差不齐,开发速度也是判若云泥。而开发的效率低下的原因,则常常是应用本身质量的低下和设计的拙劣。在本文中,我将逐一讨论几个影响Web应用质量的因素。同时,我们也可以从中领悟到Rails为创建高质量的Web应用所做的努力、它的各种设计给我们的启示,以及Rails 3的改进所代表的意义和趋势。MVC我们都知道Rails是一个MVC架构模式的Web框架,MVC各部分的职责也很清楚。但问题在于我们是否真的遵循了MVC架构模式做到了各部分职责的明确分离?是否遵循了单一职责的原则?在大多数代码里面,这种混沌不清的状态存在于model和controller之间:controller承担了太多本应由model承担的职责。其中比较典型的例子是内嵌(多)对象表单。比如,Album和Photo之间是一对多的关系,我们要创建一个含有多个photo的album。在 Rails 2.3之前,我们可能会写出类似的代码:AlbumsController
def create
album = Album.new params[:album]
album.photos << Photo.new params[:album][:photo]
...如果是一个涉及更多种类型对象的表单,这里的代码可能会更加复杂。但在AlbumsController里面,我们真正想关心的只是Album的创建,而不是Photo或其它关联对象的创建。而且从Album的角度看,创建过程中photo跟其它attributes没有区别,应该得到一致地处理。Rails 2.3之后,我们就可以很简单地达到这个目的。在Album里面做这样的声明:class Album < ActiveRecord::Base
...
accepts_nested_attributes_for :photos
end 然后,controller中的代码就可以被简化为:AlbumsController
def create
album = Album.new params[:album]
...从这个例子中可以看到Rails在推进MVC三部分之间职责明确上所做的努力和进步。很多人可能会说,我们的代码没有这样的问题。但MVC三部分之间职责开始模糊,往往出现在业务逻辑变得复杂之后。我们应该经常审视我们的代码,做到真正的职责单一。