论坛首页 Ruby版

有什么RoR的特性是Java模仿不了的?

浏览 18856 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2006-11-22 关键字: 新手
关于RoR和Java的争论甚嚣尘上,但是一直都没有怎么关注。这个问题可能很多人问过很多次了,如果大家觉得无意义就隐藏好了。
看见很多人都拿什么事情Java能做而RoR现在做不了很多做得不好来攻击RoR的不成熟,或者没有成熟到可以到企业应用。那么反过来说,RoR的好多特性,我承认很简单,优美,好用。那么这么多特性中,哪个是Java模仿不了的?从网络上搜索到一篇blog奉劝大家不要尝试着用Java去逼近RoR。那么如果我就是要用Java来逼近RoR呢?会有什么Java静态语言天生的硬伤阻碍其简单性易用性达到RoR同一个高度?
换一个角度说,我做为一个“没有用过RoR”的人,看到RoR的优点来源于两个方面:设计理念,语言特性。我现在比较好奇的就是,RoR应用了哪些Ruby的高级技巧实现的优良特性,是Java无法企及的高度?
或者泛泛而谈,你觉得Java要是能这么这么做就好了。

(鄙人是RoR门外汉,Java Web开发初学者,Hibernate刚学两个星期,Spring入门了两个月)
   
最后更新时间:2006-11-23
这个问题提的有意思,我先出一题,是ruby的method_missing机制,小陶同学试着用Java实现看看:

RoR的ORM映射:
先创建数据库表,然后
class User < ActiveRecord::Base
end

RoR会在运行期取得数据库表的meta信息,然后利用method_missing机制动态给User类添加相关的方法。


如果是换成了Java的ORM映射:

public class User {
  private Long id;
  private String name;
  private int age;
  ....
  省略一堆get/set方法
}


省略User.hbm.xml映射文件

要求做到RoR般简洁,先创建好数据库表,然后
public class User extends ...{
}


允许继承抽象基类,但是不允许写配置文件,不允许写annotation,不允许声明属性,不允许添加get/set方法,class里面不能有一行代码,请用Java实现之。
   
0 请登录后投票
最后更新时间:2006-11-23
我又没说我啥都能实现。我问这个问题就是抛砖引玉的……然后收集起来做一个列表,裱墙上,挂起来。
   
0 请登录后投票
最后更新时间:2006-11-23
robbin 写道
允许继承抽象基类,但是不允许写配置文件,不允许写annotation,不允许声明属性,不允许添加get/set方法,class里面不能有一行代码,请用Java实现之。


不经过大脑的想法是利用Java 6里面的Compiler Framework,动态生成java源代码,编译,然后装载执行。User类不能用getter/setter property,因为无法呼叫,所以基类要放个map,不写user.getId(),而写user.attribute("id"). classloader估计也得自己继承写一个。

这个帖子很有挑战性,继续讨论。
   
0 请登录后投票
最后更新时间:2006-11-23
Let's have a look at django first:
class Person(models.Model):
    first_name = models.CharField(maxlength=30)
    last_name = models.CharField(maxlength=30)

What we have seen? To make python aware of the column type, django is actually marking the type statically to make the type obvious. Then using this "strong typed" model, django will create the table for us.
Using java, everything is strong typed, and with hibernate and annotation, we can express above things in a more java natural way.
Ruby is different. But it has to express the type of column type somewhere.
Database Table Model > PO > BO > VO, ViewHelper, DTO
wherever you specify these things, you have to specify it at least once. Ruby chose to specify it in Database. So what? Is there any reason why Java specifying its domain model in its own language is not as clear as in database?
The bottom line is DRY. Don't repeat yourself. If we can get rid of uncessary layer, PO, VO blah blah. Then in java, we can also just specify entity structure once.
   
0 请登录后投票
最后更新时间:2006-11-23
如果局限在hibernate上面想如何在java里实现ror的ORM映射是找不到出路的。
   
0 请登录后投票
最后更新时间:2006-11-23
动态生成方法看来java是不可能模拟了,究其原理还是xx_eval。

对了,method_missing之类的还有好多,加入一个方法时候,include的时候。
   
0 请登录后投票
最后更新时间:2006-11-23
引用
有一个乡下老农,第一次来到繁华的大都市。一天,他看见一个满脸绉纹的老太太进了电梯,不一会儿,却从电梯走出来一个漂亮的妙龄女郎,他感到惊讶万分。于是回去告诉他老婆说:"城里有个铁房子,你要是进去了,就会变成个漂亮的大姑娘。"
  "有这等事?"老太婆不相信。
  "真的,是我亲眼看到的。"
----虽然是亲眼所见,但因为老农没坐过电梯,也就产生了误会。

在网络上搜索到这个,感觉这个比喻有点不恰当但也许比较贴切,呵呵
   
0 请登录后投票
最后更新时间:2006-11-23
差沙 写道
动态生成方法看来java是不可能模拟了,究其原理还是xx_eval。

对了,method_missing之类的还有好多,加入一个方法时候,include的时候。

I agree. Java can't be Ruby. But doing everything has a goal behind it. When someone is using method missing, they are not using it simply because they want to use it. It must has some benefit. So, I want concrete example and scenario of RoR achieved some fantastic feature by the language underlying, and which is not simulatable by java peer.
   
0 请登录后投票
最后更新时间:2006-11-23
引用
...语言特性。我现在比较好奇的就是,RoR应用了哪些Ruby的高级技巧实现的优良特性

语言特性方面,ruby的closure是一个非常强大的特点。这里随便说说我发现的一个意义。

我们可以从方法(函数)的角度看待:从0参数到多参数,从0代码到全代码,以及ruby的“部分代码(closure)”的做法

从参数个数上分析,一个函数,可以有0个到多个参数。一般来说,函数的定义给的参数个数越少,则函数的使用者感觉越简单,但灵活也越差。反过来,参数个数越多,则使用越灵活,但复杂性也越高

从代码数量上分析,一个函数可以只有名字,没有代码,例如java中接口里的函数声明(空函数);也可以有全部代码(类似上帝类,上帝函数)。这两种方式都有好处也有缺点。

而ruby所做的,就是上面两种情况的两个方面都追求了一个平衡,这个平衡有许多地方是靠ruby的closure来实现的,并且几乎贯穿ruby语言的每个角落。既要考虑简洁,又要把握灵活,这是ruby的优美之处。有人说ruby懂得中庸之道,也许就是这个意思,呵呵
   
0 请登录后投票
论坛首页 Ruby版

跳转论坛:
JavaEye推荐