Freewind @ Thoughtworks scala java javascript dart 工具 编程实践 月结 math python english [comments admin] [feed]

(2011-09-13) Rails的ORM

广告: 云梯:翻墙vpn (省10元) 土行孙:科研用户翻墙http proxy (有优惠)

这几天一直在看ruby和rails的书,感触颇多。特别是今天看到了rails的ActiveRecord,即rails提供的ORM,感觉非常欣慰--看来这次转ruby是转对了。

为什么?因为我从Java转到Ruby,就是因为Java的ORM。也许是跟语言本身的限制有关,也许跟Javaer的文化有关,Java的ORM就是找不到好用的。Hibernate,这个东西把我折腾坏了。它认为SQL是罪恶、难以理解和学习的,而且不够OO,所以在SQL的基础上,自己搞了一套叫HQL的查询语言。可惜,这个HQL复杂度跟SQL差不多,但是功能却不够强大(在不少地方有限制),为了增强其功能,又弄了一些其它的东西加进去。所以最终的结果,就是把问题弄得更复杂了:你不光要学习HQL,最终还是得学习SQL。

说到这里,我感觉java中有一种文化,就是死板僵硬,思路全被设计模式固定死了,写代码一定要按套路来。把实现功能、处理异常做为主要目的,而易用性却无所谓。Java的开源库有很多,但是顺手好用的,却没有多少。(好在这两年有不少人意识到了这一点,设计出来的库很好用,比如Mockito,相比之前的EasyMock,好用多了)

我认为,从根源上来说,这是由于Java语言本身的限制和JDK本身的代码风格所决定的。比如,java的String类,内置的方法只有那么多,很多常用的功能都得靠第三方的库来完成(比如commons-lang)。虽然借助第三方库可以做到,但是用起来就是没那么顺手。再看看那些集合类,如ArrayList,要想新建一个有三个元素的ArrayList,必须得先建生成一个List,再调用三次add,四行代码,明明可以简化的,可惜当时写这些代码的大牛们却没多做一点点。同时由于Java本身的限制,太静态了,以至于有时候想设计一些易用的函数都困难。形象一点的比喻,用Java写代码就像是穿着紧身的西装在球场上踢球,除了跑步传球,是没办法做出复杂精彩的动作的。

然而ActiveRecord不一样。它认为SQL是很好的,所以直接利用SQL本身,再结合自己动态语言的优势,弄出了一个ORM。在看书的过程中,我开始还担心这样做会不会有问题,但是发现不但没问题,反而很优雅的解决了一些在Hibernate很难处理的问题。现在觉得,Hibernate真是把简单的弄复杂,然后再用更复杂的方法来解决复杂。而ruby,则是想方设法让事情更简单,让程序更容易使用。

comments powered by Disqus