看了《应用Rails进行敏捷Web开发》二天后的初步总结,请指正
原文地址:
http://blog.sina.com.cn/u/1247584292
昨天一时兴起就和许老师去新华文轩买了两本RoR的书,准备这个寒假专供此道,如果顺利的话,再用它做一个缺陷管理系统的demo出来。
不过研究了两天发现,直接从RoR入手似乎不是很妥当,应该先学好Ruby,接下来再Rails。不过书已经买了,就硬着头皮搞吧,还好下载了一本Programming Ruby第二版,遇到不懂的可以查阅。
说说这两天来(准确的说是今天下午到晚上)对Rails这个基于Ruby框架的认识。
首先它是基于MVC的,这个一点也不奇怪,那么就分开介绍吧
控制器:
前端控制器:因为和J2EE的实现机制不太一样,所以前端控制器不向Struts中的ActionServlet那么明显,初步估计是由public目录下的dispatch.*组成的。虽然实现机制可能不同,但是做的事情大同小异。
应用控制器:类似于JSF中的action,一个应用控制器中可以有多个行为(action)。按照Rails的命名规约,一个应用控制器类必须以Controller结尾,其中的每一个public方法都是一个action。action中可以调用模型进行处理,处理完毕后默认跳转到action同名的rhtml页面(视图),也可以用redirect_to方法跳转到其他视图。
(注:我看的书中并没有区分前端控制器,和应用控制器,这里沿用了Struts中的叫法)
模型:
模型应该负责提供数据、封装业务逻辑、必要时还需要数据的持久化。先看看在J2EE中模型的实现:
方式1:EJB中的实体Bean
优点:数据、业务逻辑、持久化功能全部提供,代码少
缺点:持久化功能不灵活,导致一些业务逻辑难以优雅的实现。需要大量配置文件
方式2:JavaBean
优点:简单
缺点:大量重复的编码
方式3:Hibernate中的PO对象+DAO对象
优点:代码少
缺点:po和dao是分离的,导致“贫血类”,Hibernate自身对事物的管理比较弱。需要大量配置文件,映射对象关系时比较复杂。如加入Spring则会进一步增加代码的复杂度
可以看到,J2EE中各种模型实现都或多或少有自己的缺陷(其中我最看好的还是实体Bean,希望EJB 3.0能一转2.0的颓势)
而在Rails中已经使用了ORM,与Hibernate比这个ORM不需要大量的配置文件,只需要遵守命名规约,并在代码中映射对象间的关系。更像EJB 3.0吧。
Rails中模型的优点在于将数据、业务逻辑、持久化功能放在一起了,并且借助于Ruby强大的继承功能,你并不会觉得模型变得臃肿,甚至更加简单。
缺点嘛,自然就是刚学的时候有些摸不着头脑,呵呵。
据说Rails中模型还有一种实现方式,看到后几章再说吧。
视图:
视图没有什么好说的,虽然里面确实有一些新东西,比如类似于tiles的layout(布局),神奇般的获取模型中的数据,可以用于取代标签库的helper等,不过这些特性并不至于令人瞠目结舌。
总结一下,我觉得Rails也没有什么特别神奇之处,当然可能是因为我还刚入门。目前为止最震撼我的是借助于ruby脚本,可以快速根据数据表生成应用控制器、模型、视图(Rails的术语叫scaffold【骨架】),在很短的时间内完成一个CRUD的界面。但是J2EE下的AppFuse也能实现这个功能。
直到现在我还是固执的认为Ruby的快速开发就在于它提供了更多的api和更多的复杂语法。当然,这是一种成见,希望把这本书看完后会对Ruby和Rails有更深的了解
[解决办法]
看来你还是没体验到最精彩的部分
Ruby的快速开发就在于它提供了更多的api和更多的复杂语法?
恰恰相反,ruby带来是简单以及和谐社会,而不是阶级矛盾,它的快捷完全来自动态语言的天然优势
[解决办法]
学过PHP再看ROR效果好多了
[解决办法]
大家都刚入门要是都能总结一下就好了
[解决办法]
我不懂Java,从ASP/ASP.NET转过来学RoR,也是看了几天《Agile Web Development with Rails》,看的是英文版第二版的pdf,觉得学起来的感觉很不错。
我也不懂Ruby,但我觉得没必要急于去理解Ruby的所有指令。既然人家说了Agile,那么就应该抛弃一些.NET或者Java中的一些“官僚思想”,直接去接受RoR的方式。书里面说明了,RoR的特性就是Convention over Configuration(不知道中文翻译为什么)和DRY,那就没必要去对比“原来我用的ORM可以如何Configuration”,只要慢慢习惯了RoR的Convention就够了。
至于scaffold,据说只是书中例子如此用,新手也可以用它来真的当手脚架玩玩,正是开发中很少用到。
[解决办法]
像Java/C#那样的自动完成功能在Ruby中是很难实现的,因为程序不运行,根本就不会知道有哪些成员。
[解决办法]
to Underwind(Underwind):
there 's a third approach
a. make sure every piece of code has test for it -- it 's possible in Ruby and particularly easy in Rails
b. run all tests whenever you change source code, so that the IDE can be awared of your object space
c. then you can provide auto-completion and refactoring functionalities based on current objects