是否有令人信服的理由不使用Groovy?

Leo*_*tin 35 java groovy jvm

我在平台上长时间缺席后开发了一个用Java开发的LoB应用程序(花了大约8年左右的时间在Fortran,C,一个微软的C++和后来的.Net).

Java,这种语言,与我记忆中的方式相比并没有太大变化.我喜欢它的优点,我可以解决它的弱点 - 平台已经发展并决定了无数不同的框架,这些框架似乎做了很多相同的事情是一个不同的故事; 但这可以等待另一天 - 总而言之,我对Java感到满意.然而,在过去的几周里,我迷上了Groovy,纯粹是出于自私的观点:但不仅仅是因为它使得针对JVM的开发变得更加简洁和有趣(并且,很好,"groovy")命题比Java(语言).

Groovy最令我印象深刻的是其固有的可维护性.我们所有人(我希望!)努力编写记录良好,易于理解的代码.但是,有时我们使用的语言会让我们失望.例如:2001年,我在C中编写了一个库,将EDIFACT EDI消息转换为ANSI X12消息.这不是一个特别复杂的过程,如果稍微涉及,我当时认为我已经正确记录了代码 - 我可能已经 - 但是大约六年后我重新访问项目(并且在适应C#之后)我找到了我自己迷失在如此多的C样板(mallocs,指针等等)中,经过三天深思熟虑的分析才终于明白我六年前做过的事情.

今天晚上我写了大约2000行Java(毕竟这是休息日!).我记得最好,因为我知道如何,但是,在那2000行Java中,很大一部分是Java样板.

这是我看到Groovy和其他动态语言获胜的地方 - 可维护性和后来的理解.Groovy让您专注于您的意图,而不会陷入特定于平台的实现; 这几乎是,但并不完全是自我记录.我认为这对我来说是一个巨大的好处,当我重新审视我当前的项目(我将在几年后将其移植到Groovy)以及我的继承者,他们将继承它并继续做好工作.

那么,有没有理由不使用Groovy?

Dav*_*Ray 26

我可以想到两个不使用Groovy(或Jython或JRuby)的原因:

  • 如果你真的,真的需要表现
  • 如果您错过静态类型检查

这些都是大问题.在大多数应用程序中,性能可能不如人们想象的那么重要,静态类型检查是一个宗教问题.也就是说,所有这些语言的一个优点是它们能够与本机Java代码混合和匹配.最好的两个世界和所有这一切.

由于我不对您的业务负责,我说"去吧".

  • 现在,Groovy 2.x可以使用注释进行编译时类型检查. (5认同)

Dan*_*ark 13

如果你使用Groovy,你基本上丢弃了有关类型的有用信息.这使您的代码"groovy":简洁明了.

Bird b 
Run Code Online (Sandbox Code Playgroud)

def b
Run Code Online (Sandbox Code Playgroud)

另外,你可以玩所有的元类内容和动态方法调用,这些都是Java中的折磨.

但是 - 是的,我已经广泛地尝试过IntelliJ,Netbeans和Eclipse--在Groovy中不可能进行严重的自动重构.这不是IntelliJ的错:类型信息不存在.开发人员会说,"但是如果你对每一个代码路径(hmmmm)进行单元测试,那么你就可以更轻松地进行重构." 但不要相信炒作:添加更多代码(单元测试)将增加大规模重构的安全性,但它们不会使工作更容易.现在你必须手动修复原始代码单元测试.

因此,这意味着您不会在Groovy中经常进行重构,尤其是在项目成熟时.虽然您的代码简洁易读,但它不会像每天,每小时和每周自动重构的代码那样精彩.

当您意识到不再需要Java中的类所代表的概念时,您可以删除它.在Eclipse或Netbeans或其他任何东西中,您的项目层次结构就像圣诞树一样亮起,告诉您究竟是什么搞砸了这一变化.def thing告诉编译器(以及你的IDE)没有关于如何使用变量,方法是否存在等等.并且IDE只能做很多猜测.

最后,Java代码中充满了"样板文件",但经过多次重构后,它已被捏成最终形式.对我而言,这是为未来的程序员提供高质量,可读代码的唯一途径,包括那些未来的程序员在未来.

  • 我意识到这是旧的,但我发现我在Groovy中重构了很多 - 因为我们的代码文件更具可读性,代码味道更好.较少的LOC意味着更容易看到反模式.此外,我们的团队更有可能首先使用健康模式,而不是采取快捷方式来避免样板.例如,使用List <SimpleInnerClass>而不是Lists <List <String >>.由于属性的原因,Groovy中的小类很容易,但是由于样板文件,很难用Java阅读 - 因此不透明.我怀疑在过去的5年中编译器在Groovy方面也变得更好了. (2认同)
  • @EthelEvans如果简单值类型的样板文件正在杀死你,我强烈建议你看一下[Immutables库](http://immutables.github.io/),这是一个非常小的Java添加来解决值类型创造(我发现80%的样板问题).当然,这确实需要你的工具链的支持,如果你有很多可变的值类型可能无法解决你的问题(当我在自己的代码中看到它并且重视创建可变类型的难度时,我认为这是一种气味,但是每个开发人员都有不同的理想功能集. (2认同)

Fab*_*eeg 9

Scala可能是Groovy的一个引人注目的替代品的两个原因:

  • 性能与Java相当
  • 静态打字没有杂乱

  • @Scott,介意给出参考?:-) (2认同)

bil*_*dev 7

当您使用动态语言时,尤其是在大型代码库中,您丢失的最大问题之一就是能够使用IDE进行重新分解.现在的IDE无法解析允许动态地向对象添加代码的语言,以允许从Eclipse等处获得简单的重构方法,用于Java,C++等.

这不是"动态语言比静态更好"的情况.使用最适合你的东西.Groovy特别酷的一点是你可以在同一个项目中混合搭配Java和Groovy,它们都可以在VM上运行.是的,Scala是另一个例子.