跨越边界: Streamlined,第1部分2011-07-22 IBM Bruce Tate我生平首次参加马拉松培训。马拉松培训最有趣的方面——实际上,也是惟一的方面——就是提高不 断叠加所带来的影响。有时,我为了提高效率而进行专门为了改进身体条件而设计的长短跑。有时,在跑 步过程中,我学习避免小的错误,避免重复多余的姿势(多余的姿势对单个步幅没有太大影响,但却会在 整个 26.2 英里的跑步过程中浪费能量或伤害到我)。我每周都有提高,可每周之间的区别并不显著。但 是一个训练计划周期过后,我会从最初只能跑 4 英里提高到能跑 26.2 英里。软件开发也与此类似。如 果持续进行小的改进,消除多余的重复,您就会不断地累积提高,从而在今后的每个项目中都会做得更好 。在这篇包含两部分的文章中,我把重点放在 Ruby on Rails 搭建上,这是一个能够在早期开发阶段削 减重复的 Rails 特性。第 1 部分介绍 Rails 搭建的限制和 Streamlined,Streamlined 是个代码生成 器,它高效地应用了元编程技术来消除更高层次上的重复。第 2 部分将进一步深入 Streamlined 的元编 程模型及其定制特性。低级重复与高级重复在整个 跨越边界 系列中,我介绍了通过降低重复和提高效率实现反复改进的语言和框架:具备诸如 duck typing 这类特性的编程语言,通过使用更少的类型定义、减少纯粹为了支持编译器所 需要的代码数,能够提高灵活性和减少重复。框架试图通过处理核心任务(例如持久性或事务)来提高效率和消除重复,这样就不必为每个新的应 用程序编写代码。Ruby on Rails 通过利用公共规范消除重复配置,允许框架推断您的意图,而不是强迫您配置应用程 序特性(例如应用程序中特定的数据库表名称和列名称)。就像所有高效的语言和框架必须做的那样,这些措施都把重点放在每个步骤上,或低级重复上。但是 一旦搭建了一个有效的基础,就可以把目标放得更高。Rails 的搭建特性试图通过公共应用程序类型(数 据库支持的 Web 应用程序)消除重复。多数数据库支持的 Web 应用程序,几乎要为系统中每个主要的表都提供执行 CRUD 操作(创建、读取 、更新和删除)的用户界面。 搭建这些用户界面应当自动进行,而不应当重复。 Rails 通过 搭建开始 消除这种重复,搭建是一个特性,可以根据数据库表集合的内容构建默认的 CRUD 界面。使用 Rails,只 用几个简单步骤,就可以从头开始构建一个搭建完整的应用程序。如果一直跟随 跨越边界 系列,那么以 前就看过这些步骤。这次,我再把这些步骤简要介绍一下:输入 rails trails 生成编排山地摩托车赛道的 Rails 应用程序。用选中的数据库引擎创建叫作 trails_development 的数据库,并修改 trails/config/database.yml ,以反映选中的配置。切换到 trails 目录,,生成模型和控制器:输入 ruby script/generate model Trail (如果在 UNIX 上运行,可以省略 ruby) 生成叫作 Trail 的模型,输入 script/generate controller Trails 生成叫作 TrailsController 的控制器。把文件 db/migrate/001_create_trail.rb 编辑成清单 1 那样:清单 1. 初始迁移
class CreateTrails < ActiveRecord::Migration
def self.up
create_table :trails do |t|
t.column :name, :string
t.column :difficulty, :string
t.column :description, :text
end
end
def self.down
drop_table :trails
end
end把文件 app/controllers/trails_controller.rb 编辑成像清单 2 一样:清单 2. TrailsController 中的搭建
class TrailsController < ApplicationController
scaffold :trail
end输入 rake migrate,运行迁移。用命令 script/server 启动服务器,并把浏览器指到 localhost:3000/trails/list。现在就已经得到了一个简单的能够工作的带有数据库支持的 Web 应用程序,可以进行基于 CRUD 的每 个操作,如图 1 所示。可以看到主屏幕列出了每个项目和相关的图片,提供了 Ajax 窗口用来创建、读 取、更新和删除项目。图 1. 简单的 Rails 应用程序

到现在,只付出了很少努力,就到达了一个可以把应用程序开发带到更高档次的地步。Rails 演示人 员总会展示搭建功能,因为它是如此之炫,而且对于调试和在匆忙之间为客户做演示,都极为有用。可以 通过代码生成器生成搭建 —— 在这个示例中输入了 script/generate scaffold Trail Trails —— 或 者在控制器中指定 scaffold 元编程标记。每种方式都有自己的用途。