您的位置:首页 > 产品设计 > 产品经理

Agile Web Development with Rails 翻译(二)

2006-09-11 14:33 351 查看
Agile Web Development with Rails 翻译(二)

第二章 Rails应用程序的体系

在你构造你的Web应用程序时,Rails引进了一些合理的约束。令人惊讶的是这些约束反而使创建应用程序更容易。让我们看看这是为什么。

2006年4月16日更新

2.1 模型, 视图, 和 控制器

回到1979年,Trygve Reenskaug为开发交互式应用程序提出了一个新的体系。在他的设计中,应用程序被分解成三个组成部分:model(模型),view(视图),和controller(控制器)。
“模型”的作用是管理应用程序的状态。有时候,这个状态是短暂的,用于保持交互用户间的联系。有时候这个状态是持久的,它将被存储到外部应用程序,通常是到数据库中。
“模型”主要是数据;它给这些数据的应用强加所有商业规则。例如,如果小于20美元的商品没有折扣,则“模型”会强制执行这个约束。可以想到只要把这些商业规则的实现放入到“模型”内就可以了,并且我们要确保在应用程序内没有什么东西会让我们的数据失效。“模型”的行为看起来即像个守护也像个数据仓库。
“视图”用于生成用户界面,通常是建立在“模型”内的数据上的。例如,一个在线商店将有产生清单显示在分类屏幕内。这个清单通过“模型”来访问,但它是个“视图”,因为它从“模型”中访问数据,并在格式化之后显示给用户。虽然“视图”可以以各种方式将输入的数据呈现给用户,但是“视图”本身却从不处理数据。“视图”的工作只是显示数据。它可以基于不同的目的,以多种界面来访问同一“模型”的数据。对于在线商店来说,会在一个分类页面显示产品信息界面,而其它界面则可能是用来给管理员添加和编辑产品的。
“控制器”用于为应用程序谱曲。“控制器”接受外部世界(通常是用户输入)的事件,与“模型”相互作用,并显示应用程序“视图”给用户。
这是个三人政治—“模型,视图,控制器”—形成了众所周知的体系MVC。图2.1显示了被抽象化的MVC。



MVC原是用于传统的GUI应用程序的,此处的开发者发现关系的分离会减少耦合,它们会使代码更易写和维护。每个概念或行为只出现在一个地方。使用MVC就像在用现在钢梁构造摩天大楼—它可容易地用现有结构来替换余下部分。
在软件世界里,我们通常会忽略好的思想。当开发者首先开始制做Web应用程序时,它们想的是写那种集成式的程序,混杂有表示数据访问,商业逻辑,和事件控制的一大堆代码。过去的思想总会有时慢慢地走回来,有些人开始用20年前MVC思想来检验Web应用程序体系。结果是我们看到了框架如,WebObjects,Structs,和JavaServer Faces。所有这些都是基于MVC思想的。
Ruby on Rails也是个MVC框架。Rails强制一个结构给你的应用程序,在这个结构中你可以配置“模型”,“视图”,和“控制器”每个单独部分的功能—在你的应用程序运行时,框架会将它们组织在一起。让人高兴的是,框架的组织过程是缺省的,所以你不需要写任何配置元数据来协调它们的工作。这是Rails的配置约定的一个例子。
在Rails应用程序中,请求首先被发送给一个“路由器”,它的工作是将应用程序内的请求发送,并将请求本身进行解析。最后,这个阶段会识别“控制器”代码内某处的一个特定方法(调用Rails内的一个“动作”)。这个“动作”可查看请求者本身的数据,它会与“模型”交互,然后,它引发被调用的其它“动作”。最后,“动作”准备发送信息给“视图”,来显示一些东西给用户。

下面的图2.2显示了Rails如何处理一个新到的请求。在这个例子中,假设应用程序先前显示的是产品分类页面,用户按下了”Add To Cart”按钮来到下一个产品。这个按钮使用的URL是 http://my.url/store/add_to_cart/123链接到我们的应用程序,其中123是我们的内部id,它用于选择产品。[本书稍后会转换Rails URL的格式。但是,仍应该提到的是,URL完成的动作如,”add to cart”可能是危险的。参考16.9节,有关GET请求问题的更多细节在324页。]



“路由器”组件接收新到请求,并立即进行挑选。简单情况下,它挑选路径的第一个部分,store,做为“控制器”的名字,和第二个部分,add_to_cart,做为一个“动作”的名字。路径的最后部分,123,被约定是名为id的内部参数。通过这个分析的结果,“路由器”知道它必须调用“控制器”类StoreController(我们在180页会谈到命名习惯)内的add_to_cart()方法。
方法add_to_cart()处理用户请求。在这个例子中,它发现了当前用户的购物车(它是由“模型”管理的一个对象)。然后它请求这个方法查找有关产品123的信息。然后它告诉购物车给自己添加这个产品。(看看“模型”如何使用保存的所有商业数据;“控制器”告诉它如何做,然后“模型”就知道该如何做了。)
现在,购物车包含了新的产品,我们可以显示它给用户。“控制器”排列“视图”要从“模型”内访问的购物车对象,然后启动“视图”代码。在Rails中,这个启动的过程是在暗中完成的;依靠约定的帮助来将一个给定的“动作”与一个特定的“视图”连结起来。
这是一个MVC Web应用程序的所有部分。通过适当地集中和划分你的功能,你会现你的代码变得易于工作,你的应用程序变得易于扩展和管理。这可是个好生意。
如果MVC可以解决这么多问题,那么你应该需要一个框架如,Ruby on Rails。回答很肯定:Rails为你处理所有低级的管理—你可以与所有些细节的处理说拜拜了—这会让你只关注于你的应用程序的代码功能。让我们看看如何….
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: