论坛首页 海阔天空论坛

看groovy社区并不是很热闹么

浏览 18315 次
精华帖 (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的一些大神也就生活在自己创造的模式的世界里……
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的一些大神也就生活在自己创造的模式的世界里……

gof,还有写重构的2个都是smalltalker。他们玩动态语言的时间比你的年龄可能都久。你说的一些大神最好是指某些人。呵呵
0 请登录后投票
   发表时间:2009-04-20   最后修改:2009-04-20
引用
哈哈,那就是看起来牛逼而已。
哪么java的一些大神也就生活在自己创造的模式的世界里


模式不过是特定条件下的最佳实践而已。没必要神话,刻板的按照模式名,在不同的语言中实现相同的模式,是可笑的。

真正要理解的是模式实现的背景和目的,这样才可以在不同的环境下,结合条件写出最佳实践。

比如工厂模式在java中提供了灵活性和可扩展性。而前一段时间某人用ruby写的工厂模式就非常可笑(ruby本身就是弱类型的,工厂个毛啊;那么ruby中用工厂的好处可能就只剩下延迟实现这个了,那么ruby中有没有延迟实现方面的语法呢:我觉得ruby如果支持evel语法的话,工厂就可以彻底抛弃了)。
0 请登录后投票
   发表时间:2009-04-20  
bonny 写道
引用
哈哈,那就是看起来牛逼而已。
哪么java的一些大神也就生活在自己创造的模式的世界里


模式不过是特定条件下的最佳实践而已。没必要神话

哎,我没话讲了,理解的不如你深刻!
0 请登录后投票
   发表时间:2009-04-20   最后修改:2009-04-20
bonny 写道
引用
哈哈,那就是看起来牛逼而已。
哪么java的一些大神也就生活在自己创造的模式的世界里


模式不过是特定条件下的最佳实践而已。没必要神话,刻板的按照模式名,在不同的语言中实现相同的模式,是可笑的。

真正要理解的是模式实现的背景和目的,这样才可以在不同的环境下,结合条件写出最佳实践。

比如工厂模式在java中提供了灵活性和可扩展性。而前一段时间某人用ruby写的工厂模式就非常可笑(ruby本身就是弱类型的,工厂个毛啊)。


嗯,我也觉得我写的那个工厂很别扭很多余。
工厂往往是为了解决这个问题:创建过程复杂,又与本类内容关系不大。

而 ruby 的一个简单解决方法是在其它地方 open class 修改 initialize。
0 请登录后投票
   发表时间: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的耦合。然后工厂模式就是简单工厂的进化,其存在也是有价值的。
0 请登录后投票
   发表时间: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"%)

看起来可读性更好了 呵呵——额,也许这个功能提供编译器级别的实现更好。
0 请登录后投票
   发表时间:2009-04-20   最后修改:2009-04-20
bonny 写道
我说的evel(难道我拼错了?)

嗯是eval...evaluate的缩写。Ruby里有eval撒,从一开始就有。

bonny 写道
至于楼上说的解除和具体类名和new的耦合,不过是引入了一个新的耦合“参数”,从而使代码看起来和类无关,但是和字符串有关了

面向接口的编程也不过是“解除了对具体类的依赖,增加了对接口的依赖”而已。但耦合关系从m*n减少到m+n,还是有好处的。

bonny 写道
另外导致了编译和运行期错误检查的成本

要拿Ruby来说的话,如果代码里把类名或者方法名写错了也一样是等到运行时才知道,没差多少~

跑题了……遁
0 请登录后投票
   发表时间: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 郁闷好几年了。
0 请登录后投票
   发表时间:2009-04-20   最后修改:2009-04-20
楼上几个伙计。我不懂ruby,我是胡说的。你们别介意我写的烂七八糟的语法

另外楼上
引用
要拿Ruby来说的话,如果代码里把类名或者方法名写错了也一样是等到运行时才知道,没差多少~

这句话就不对了,现在好的编辑器已经可以实现对动态语言的代码提示(如果已经有的类型被声明,在编辑器里面的显示方式是有些不一样的,groovy语言在idea中即是如此)。

0 请登录后投票
论坛首页 海阔天空版

跳转论坛:
Global site tag (gtag.js) - Google Analytics