Ruby on Rails 以及其与SSH框架的比较

楚嘉胜
2023-12-01

一、Ruby on Rails



1. 什么是Rails

Rails是Ruby on Rails的官方简称,非官方简称为RoR。在RubyOnRails的官网对Rails的定义是:Rails is a web application development framework written in the Ruby language. 翻译过来就是,Rails 是一个用Ruby语言写的,web应用开发的框架。

所谓web应用框架,是一种开发框架,用来支持动态网站、网络应用程序及网络服务的开发。这种框架有助于减轻网页开发时共同性活动的工作负荷,例如许多框架提供数据库访问接口、标准样板及会话管理等,课提升代码的可再用性。

而Rails的存在,是为了相比于其他的语言或框架,你可以用更少的代码去完成相同的事情。而很多资深的Rails框架使用者也表示,使用这种框架开发更有乐趣。


2. Rails哲学的两种主要指导原则

- DRY:Don't Repeat Yourself(不要重复自己): DRY是软件开发的一个原则,它表示“系统的每一部分,必须有一个单一的,明确的,权威的表示,必须能够表达所应表达的内容,而不含重复的代码。这样使我们的代码由更好的可维护性、扩展性,且有更少的错误。
 

- Convention Over Configuration (惯例胜于设定): Rails认为web应用程序中的很多操作都有最好的方式去完成,并将其设定为默认值,这使得程序员无需在配置文件中设置很多细节。如果你依照Rails的惯例,将会有令人惊艳的成果,但是对初学者可能会有点困难,例如,当你从一个已经存在的应用程序开始写,将会有很多隐藏的设定在应用程序的代码里。这些设定会让程序更加简洁,但是也会让初学者非常困惑。但是当你熟悉了这个惯例之后,将会有如虎添翼的效果。

 

 

3. 什么是Ruby

Rails是一套使用Ruby开发的网站框架,因此要认识Rails,对Ruby有一定的了解也是必须的。

Ruby是个一种面向对象、命令式、函数式、动态的编程语言,在20世纪90年代中期由日本人松本行弘(Matz)设计并开发。Ruby有着简单哲学、高生产力、精巧、自然的语法,它的设计目的是要让程式设计师能够快乐的写程式。
 

静态语言和动态语言的差别在于,前者的变数型别需要事前宣告,后者则是执行器才动态决定。实务上的表现就是,Ruby可以被动态直译(就像PHP),所以没有编译(如C、Java),这加速了迭代式开发。一个Ruby程序可以动态产生程序,即使正在执行也可以修改。Rails内部就使用这个能力,来让你可以简单享受所谓的“Magic”。

 

 

4. 为何选择Ruby

Ruby是一套非常重视使用性(Usability)的编程语言,非常看重代码的可读性及维护性。Matz在设计Ruby的时候,就特别考量一般人容不容易了解,这也是为什么我们常常会听到Ruby的代码自然简洁又漂亮。

Ruby也是目前做Domain-specific language(DSL),特别是Internal DSL最为成功的语言。透过DSL,代码不但可以拥有非常好的可读性,也可以大幅增加生产力。

 

 

看到这里,我们大概对Rails有了一定的了解。接下来将对Rails与SSH进行比较,总结出Rails框架的优点与不足。

(以下内容均整理自《Ruby On Rail 与 SSH架构的比较研究》——代科伟)

 

二、 Rails 与 SSH 框架的比较


Rails和SSH一样都是在MVC设计模式上的web应用开发框架。不同的是,Rails集成了MVC模式的所有组成部分,Rails要求开发者将应用程序按照model、view、controller进行划分,并遵循这一结构分别开发各部分的功能。而在传统的SSH架构中,Struts实现控制层,Hibernate用于对模型的操控,表现层则是通过JSP或其他方式实现,Spring则实现对Struts和Hibernate的集成和相应的管理。下面,分别从模型(Model)、视图(View)、控制器(Controller)3个角度进行比较。


1. 模型(Models)

Rails应用程序模型最主要的就是其使用的底层数据库,包括MySQL,Oracle,SQL Server等。

ActiveRecord是Rails所采用的对象-关系映射(ORM)层,它将关系型表映射为Ruby对象,完全遵循标准的ORM模型:表映射到类,记录映射到对象,字段映射到对象的属性。ActiveRecord根据类对应表的内容自动地向模型对象添加属性。每个类都继承ActiveRecord::Base基类。ActiveRecord依靠通用的约定来推断配置(这也体现了Rails惯例胜于设定的哲学)。

Hibernate是一种对象关系映射的框架,模型是通过Hibernate Annotation或者XML文件来表达映射关系的。Hibernate的类是POJO类,它的每个对象派生自一个通用的基类。

ActiveRecord 和 Hibernate最大的区别就是Rails数据迁移。在项目开发的过程中,数据库表结构会根据需求不断变化。而Rails中的每个数据迁移任务都会有属于自己的序列号,想要将数据库修改撤销回去时,只要找到对应的序列号即可,这样就实现了迁移任务的可逆性。


2. 视图(View)

ActivePack是Rails应用的核心,它由两个模块组成:ActiveController 和 ActiveView。

ActiveView模块让开发者可以方便地渲染模板,生成HTML、XML、JavaScript给用户。Rails包含有用于.rhtml的非常好的模板语言,它将纯粹的HTML与嵌入式的Ruby代码组合起来,这种格式实际上是一种增强的HTML。

在J2EE体系结构中,很多都是采用JSP作为表现层的。Struts提供一系列的JSP tag库,或者也可以通过JSTL标签库来定制完整的用户界面。

Struts中也可以进行数据检验、错误处理以及与模型的交互功能。然而在Rails中,这部分功能是定义在Model中的,同时为了提高开发效率,Rails提供了一个可以动态生成基于模型的视图插件ActiveScaffold,它可以直接从内部审视ActiveRecord模型,并动态地生成一个CRUD(创建、读取、更新、删除)用户界面来管理这些对象。


3. 控制器(Controller)

Struts 和 Hibernate都采用了前端控制器模式(ActionServlet和DispatchServlet), 他们接受HTTP请求,解析URL后把请求的处理转发给相应的动作。两者的区别在于如何决定处理请求的具体动作。

在Struts中,我们需要把特定请求添加到相应的配置文件中,当装入ActionServlet中时,由它解析配置文件,最终由ActionServlet分发到适当的Action。Struts要求扩展Action并覆盖execute(),以处理请求。前端控制器将调用execute()方法,把HTTP请求和响应对象传递给它,最后通过视图把相应的页面展示给用户。

然而在Rails中并不是通过配置文件实现,而是根据请求的URL发现适当的动作。Rails对URL请求中包含的信息进行了编码,然后由一个路由(routing)子系统来判断如何处理这些请求。

Struts使用的就是Action的单一实例,并允许多个线程调用它的execute(),使系统在处理每个请求时不用频繁创建实例。在Rails中则是为每个请求创建新的实例,这也是Rails应用程序的一个瓶颈,虽然对应能有影响,但是也使开发变得容易。Struts的Actions类是细粒度的,它提供了非常具体的工作单元,而Rails的ActionController是粗粒度的,它将具体的工作单元模拟为一些方法。


以上就是基于MVC对SSH和Rails的比较,由于初学者,以上很多内容并没有完全理解,以后深入学习之后再来重新复习~

 类似资料: