前段日子看完了一本《松本行弘的程序世界》,同时在网上检索了一下松本行弘本人,对这位业内前辈佩服得五体投地。既佩服其起对程序的狂热和以及对事业认真负责的态度,又佩服其淡泊名利、秉承开源的精神。
很自然的,我怀着崇敬的心情,开始了Ruby之旅。
首先,学的是Ruby语法本身,我被其优雅的语法迷住了,其语法更接近自然语言。我被块表达式迷住了,像数学公式一样简明。
例如:
def initialize(title, price_code)
@title, @price_code = title, price_code
end
命名约定造就了简洁与优雅。 唯一构造函数,避免了C++中构造函数导致的一系列问题(operator=, default constrution, copy construction)。
[[1,2],[3,4]].each do |a,b|
p [a,b]
end
块表达式优雅,简洁,自然。
我被开放类和猴子补丁给震撼了。 对一个习惯了强类型语言思维的人来说,第一感觉就是太危险了吧。一颗老鼠屎,真的可以坏一锅汤。在一个不起眼的角落,用一下开放类或者猴子补丁,整个后台程序的意义完全改变。
同时,Ruby给了程序员更大的自由,比ASP.NET中的自动生成的partial 类强大多了。
开放类也给了程序员更大的掌控能力。我不禁想到了J2EE的Spring框架,这个框架有两大功能:Bean 工厂和 面向切面编程,而以面向切面编程为甚(AspectJ)。而此时,我发现Ruby的开放类原生态支持面向切面编程。
比如:application()方法是为了完成某一特定功能,现在我需要给application加一个入口日志beforeLog()和出口日志afterLog()。
我只需要:
tmp = application;
application()
{
beforeLog();
tmp();
afterLog();
}
这种方式比Spring使用反射方式实现的切面编程直观简单得多。Spring配置方式作用原理 不禁让我想起了C++的模版,以及其导致的代码膨胀情景。
我们教研室另一拨人改造Java实现GOP,据说是软件进化编程的一种。我不禁想Ruby是不是更适合做这个。
然后,学习了一下Rails。
久闻Rails大名。盛名之下,其实几何。亲自一看才知道。我用我熟悉的J2EE与Rails对比学习。
J2EE是一个严谨的语言或者框架。同时它可以它可以给程序员一定的自由度和较大的参与度。
说到这里,我不禁讨厌起ASP.NET,讨厌起微软的一些技术。因为我一直认为微软的产品的宗旨是将用户傻瓜化。比如:Windows与Linux相比,比如ASP.NET与J2EE相比。前者向用户隐藏了太多细节,比如MFC,比如ASP.NET。对于非专业用户这样很好,但是对于程序员,这可是毒药。当初刚学WEB编程时,我发现在ASP.NET2.0上面,你不需要懂HTML,不需要懂SQL,甚至在不懂客户端控件和服务器端控件区别的条件下 可以用 鼠标拖出了一个美观,功能完整的网站。当时,我就吓坏了。
之后做完本科毕设之后就果断转向J2EE了。
言归正传,转向Rails与J2EE比较。
第一:Rails的惯例优先原则太牛了,省掉了海量的配置文件。想想Hibernate中大量的映射文件,想想Struts下的配置文件,以及Spring配置文件造成的多少头疼问题,尤其项目扩展时需要更新大量配置文件该有多头疼。
其次:rails原生就是依据MVC模式组织的,这样就从根本上规范了项目的架构。
Model功能上基本与Hibernate对应。但是,rails的Model是build-in的,比Hibernate这个第三方组建更轻量级,更契合。不过Hibernate支持双向映射,表结构<->JavaBean,不知道Rails是否支持从表结构到Model对象的映射。不过还是Java语法严谨,给人心底踏实的感觉。
Control功能上与Struts2对应。同样,rails的Control是build-in的,而Struts是第三方组件。但是rails的内置的简洁url确实令我大吃一惊。
例如:rails原生态支持 http://domain.com/show/1 这种简洁url。其中show就是Control中的方法。在J2EE中要实现这个,估计又要寻找第三方组件了。
rails的View原生支持AJAX,比J2EE使用第三方库DWR方便多了。
rails的单元测试很强大,竟然可以做登录测试,超出我意料之外。可能是ruby本身是弱类型,所以其安全性强烈依赖与测试,所以测试功能必须完备,测试必须严谨。而Java对测试要求没这么严格。
J2EE的学习曲线真长。先要学习Java,然后学习JSP+Servlet,然后学习3大框架Hibernate+Struts+Spring, 还需要学习AJAX(JQuery, DWR等)。尤其在没有人指导情况下学习,学习曲线更长。比如,学完JSP+Servlet之后,根本不知道自己要学习后面的框架,即使想学,也难以下手。
而学习Ruby + Rails,你会发现这真是一条坦途。一条直路走到底,阅尽一切。岂不畅快淋漓。
夜半随笔,直抒胸臆!
Stan Sun
2013-4-24晚