锁定老帖子 主题:看groovy社区并不是很热闹么
精华帖 (0) :: 良好帖 (0) :: 灌水帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-04-20
bcccs 写道 天机老人 写道 night_stalker 写道 lcllcl987 写道 groovy与java无缝互调, 又有当下流行的动态语言的特性。
groovy必火。 对于java程序员, 要想掌握一个动态语言, 那么groovy几乎是首选, 学习成本几乎为零。你把java写的code原封不动的copy到groovy中, 几乎不用怎么改, 就可以run。至于它的小花招, 那是慢慢修炼的。 相关的书也很多啊, groovy in action个人感觉很不错。 IDE确实没看到很强的。这是软肋。 动态语言其实不太依赖 IDE。 要说哪种动态语言的 IDE 支持比较好,估计就是 javascript 和 ruby 了。 很多 java 库、框架就是为了弥补语言的弱点而存在的,如 spring。 如果类型是动态的,或者是 auto 的,这个依赖关系就消失了,动态语言的使用者从来不需要去考虑什么 DI、IOC、AOP。 貌似是晴天霹雳…… 不过我是听说过,很多牛逼人的模式在 ruby面前完全失去了颜色…… 如果一个牛B人只是背住一些套路,露馅只是早晚的事情。 哈哈,那就是看起来牛逼而已。 哪么java的一些大神也就生活在自己创造的模式的世界里…… |
|
返回顶楼 | |
发表时间:2009-04-20
天机老人 写道 bcccs 写道 天机老人 写道 night_stalker 写道 lcllcl987 写道 groovy与java无缝互调, 又有当下流行的动态语言的特性。
groovy必火。 对于java程序员, 要想掌握一个动态语言, 那么groovy几乎是首选, 学习成本几乎为零。你把java写的code原封不动的copy到groovy中, 几乎不用怎么改, 就可以run。至于它的小花招, 那是慢慢修炼的。 相关的书也很多啊, groovy in action个人感觉很不错。 IDE确实没看到很强的。这是软肋。 动态语言其实不太依赖 IDE。 要说哪种动态语言的 IDE 支持比较好,估计就是 javascript 和 ruby 了。 很多 java 库、框架就是为了弥补语言的弱点而存在的,如 spring。 如果类型是动态的,或者是 auto 的,这个依赖关系就消失了,动态语言的使用者从来不需要去考虑什么 DI、IOC、AOP。 貌似是晴天霹雳…… 不过我是听说过,很多牛逼人的模式在 ruby面前完全失去了颜色…… 如果一个牛B人只是背住一些套路,露馅只是早晚的事情。 哈哈,那就是看起来牛逼而已。 哪么java的一些大神也就生活在自己创造的模式的世界里…… gof,还有写重构的2个都是smalltalker。他们玩动态语言的时间比你的年龄可能都久。你说的一些大神最好是指某些人。呵呵 |
|
返回顶楼 | |
发表时间:2009-04-20
最后修改:2009-04-20
引用 哈哈,那就是看起来牛逼而已。
哪么java的一些大神也就生活在自己创造的模式的世界里 模式不过是特定条件下的最佳实践而已。没必要神话,刻板的按照模式名,在不同的语言中实现相同的模式,是可笑的。 真正要理解的是模式实现的背景和目的,这样才可以在不同的环境下,结合条件写出最佳实践。 比如工厂模式在java中提供了灵活性和可扩展性。而前一段时间某人用ruby写的工厂模式就非常可笑(ruby本身就是弱类型的,工厂个毛啊;那么ruby中用工厂的好处可能就只剩下延迟实现这个了,那么ruby中有没有延迟实现方面的语法呢:我觉得ruby如果支持evel语法的话,工厂就可以彻底抛弃了)。 |
|
返回顶楼 | |
发表时间:2009-04-20
bonny 写道 引用 哈哈,那就是看起来牛逼而已。
哪么java的一些大神也就生活在自己创造的模式的世界里 模式不过是特定条件下的最佳实践而已。没必要神话 哎,我没话讲了,理解的不如你深刻! |
|
返回顶楼 | |
发表时间:2009-04-20
最后修改:2009-04-20
bonny 写道 引用 哈哈,那就是看起来牛逼而已。
哪么java的一些大神也就生活在自己创造的模式的世界里 模式不过是特定条件下的最佳实践而已。没必要神话,刻板的按照模式名,在不同的语言中实现相同的模式,是可笑的。 真正要理解的是模式实现的背景和目的,这样才可以在不同的环境下,结合条件写出最佳实践。 比如工厂模式在java中提供了灵活性和可扩展性。而前一段时间某人用ruby写的工厂模式就非常可笑(ruby本身就是弱类型的,工厂个毛啊)。 嗯,我也觉得我写的那个工厂很别扭很多余。 工厂往往是为了解决这个问题:创建过程复杂,又与本类内容关系不大。 而 ruby 的一个简单解决方法是在其它地方 open class 修改 initialize。 |
|
返回顶楼 | |
发表时间:2009-04-20
bonny 写道 引用 哈哈,那就是看起来牛逼而已。
哪么java的一些大神也就生活在自己创造的模式的世界里 模式不过是特定条件下的最佳实践而已。没必要神话,刻板的按照模式名,在不同的语言中实现相同的模式,是可笑的。 真正要理解的是模式实现的背景和目的,这样才可以在不同的环境下,结合条件写出最佳实践。 比如工厂模式在java中提供了灵活性和可扩展性。而前一段时间某人用ruby写的工厂模式就非常可笑(ruby本身就是弱类型的,工厂个毛啊;那么ruby中用工厂的好处可能就只剩下延迟实现这个了,那么ruby中有没有延迟实现方面的语法呢:我觉得ruby如果支持evel语法的话,工厂就可以彻底抛弃了)。 evel语法是什么? Ruby是动态类型语言,但同时也是强类型语言。像Perl那样不但变量没有类型,而且值也能根据需要而自动在不同类型间变化的才会是弱类型语言。 创建对象时无法避免对new的调用,而这正是工厂要封装的——去除对具体类型产生依赖。 Product.new对“Product”这个名字产生了依赖,得到的毫无疑问只能是Product的实例。如果想根据不同参数得到不同版本的特化的Product,直接调用new就是不合适的。 class Product # 因为有duck type,不一定需要这个类型 def items; end end class Product1 < Product # 因为有duck type,不继承也罢;下同 def initialize item @item = item end def items yield @item end end class Product2 < Product def initialize item1 item2 @item1 = item1 @item2 = item2 end def items yield @item1 yield @item2 end end class ProductN < Product def initialize *args @items = args end def items @items.each {|i| yield i } end end 如果常用到的Product大多是只有1个或者2个成员,那么制作像上面的特化版本是一种合理的做法,省去了不必要的数组包装。但对上面的代码使用Product.new能得到什么?就是一个空壳Product而已。 但如果有: class Factory def product *args case args.length when 0: Product.new when 1: Product1.new args.first when 2: Product2.new *args else ProductN.new args end end end 这样Factory就能根据需要生产出不同的特化版本,而用户不需要知道这点,解除了对具体类名和new的耦合。然后工厂模式就是简单工厂的进化,其存在也是有价值的。 |
|
返回顶楼 | |
发表时间:2009-04-20
最后修改:2009-04-20
工厂模式的延迟实现,原理就是传入一个参数,依据这个参数选择返回的实现类。java中是用反射实现的。我说的evel(难道我拼错了?)语法是js的语法,比如evel(‘alert("")’)。这也相当于一种反射。
对于参数-》返回对象的逻辑关系比较复杂的,工厂方法当然还有必要存在。对于简单的,直接evel就ok了。 至于楼上说的解除和具体类名和new的耦合,不过是引入了一个新的耦合“参数”,从而使代码看起来和类无关,但是和字符串有关了——另外导致了编译和运行期错误检查的成本。 我们引入这种那个新的耦合的收益,就是降低我们代码的复杂度——如果对象生成逻辑不是很复杂的话,没必要了。 比如我们假设,在java中,一个工厂提供了生成4种CPU的能力。这个能力,被4个另外的类调用,分别是HP电脑,联想电脑。。。。调用的逻辑大概是:pc_factory("hp").cpu(cpu_factory("hp")) 而在ruby中,根本没必要存在这样一个工厂。直接evel("new hp_pc").cpu(evel("new hp_cpu")). 你可以说“new hp_pc”这种字符串看起来不好,但是本质上他和“hp”没什么区别的,只是看起来不好而已。 上面的语句evel("new hp_pc").cpu(evel("new hp_cpu"))变成 "new hp_pc"%.cpu("new hp_cpu"%) 看起来可读性更好了 呵呵——额,也许这个功能提供编译器级别的实现更好。 |
|
返回顶楼 | |
发表时间:2009-04-20
最后修改:2009-04-20
bonny 写道 我说的evel(难道我拼错了?)
嗯是eval...evaluate的缩写。Ruby里有eval撒,从一开始就有。 bonny 写道 至于楼上说的解除和具体类名和new的耦合,不过是引入了一个新的耦合“参数”,从而使代码看起来和类无关,但是和字符串有关了
面向接口的编程也不过是“解除了对具体类的依赖,增加了对接口的依赖”而已。但耦合关系从m*n减少到m+n,还是有好处的。 bonny 写道 另外导致了编译和运行期错误检查的成本
要拿Ruby来说的话,如果代码里把类名或者方法名写错了也一样是等到运行时才知道,没差多少~ 跑题了……遁 |
|
返回顶楼 | |
发表时间:2009-04-20
最后修改:2009-04-20
我猜 bonny 你说的 evel 指 eval ?
虽说 eval 很强大,你这样是滥用 eval 了吧~ 而且这是什么语言的代码 ?…… 你说的这个场景,Ruby 的类是对象,传一个类即可。 譬如 HPComputer 可能用到 Pentium 和 AMD 的 CPU。 # 并没有和 Pentium 或者 AMD 耦合 class HPComputer def initialize cpu_brand @cpu = cpu_brand.new # 属性 cpu 是传入的牌子的新实例 end end 使用时: HPComputer.new( Pentium ) HPComputer.new( AMD ) 想批评一个事物,得先学学它。我可是被 java 和 ssh 郁闷好几年了。 |
|
返回顶楼 | |
发表时间:2009-04-20
最后修改:2009-04-20
楼上几个伙计。我不懂ruby,我是胡说的。你们别介意我写的烂七八糟的语法
另外楼上 引用 要拿Ruby来说的话,如果代码里把类名或者方法名写错了也一样是等到运行时才知道,没差多少~
这句话就不对了,现在好的编辑器已经可以实现对动态语言的代码提示(如果已经有的类型被声明,在编辑器里面的显示方式是有些不一样的,groovy语言在idea中即是如此)。 |
|
返回顶楼 | |