Dynamic Groovy和动态方法:需要Groovy老手的启示吗

Dynamic Groovy和动态方法:需要Groovy老手的启示吗,dynamic,groovy,maintenance,Dynamic,Groovy,Maintenance,首先,我必须说,我真的很喜欢Groovy以及它带给Java开发世界的所有好东西。但是,由于我使用它的不仅仅是小脚本,我有一些担心 在本文中,有这样一种说法,即当您的代码中有输入错误时,不会出现编译错误/警告,因为这可能是对稍后在运行时添加的方法的调用: 取消所有的静态输入和输入可能会让人害怕 首先进行编译时检查。但许多优秀的老兵会证明这一点 它使代码更干净,更容易重构,而且,更好 动态的 我非常同意“更动态”的部分,但不同意更干净、更容易重构的部分: 对于另外两条语句,我不确定:从Groovy初

首先,我必须说,我真的很喜欢Groovy以及它带给Java开发世界的所有好东西。但是,由于我使用它的不仅仅是小脚本,我有一些担心

在本文中,有这样一种说法,即当您的代码中有输入错误时,不会出现编译错误/警告,因为这可能是对稍后在运行时添加的方法的调用:

取消所有的静态输入和输入可能会让人害怕 首先进行编译时检查。但许多优秀的老兵会证明这一点 它使代码更干净,更容易重构,而且,更好 动态的

我非常同意“更动态”的部分,但不同意更干净、更容易重构的部分:
对于另外两条语句,我不确定:从Groovy初学者的角度来看,这会减少代码量,但以后阅读更困难,维护更麻烦(不能再依赖IDE来查找谁在声明动态方法以及谁在使用动态方法)

澄清一下,我发现阅读groovy代码非常愉快,我喜欢收集和闭包(处理复杂问题的简洁和表达方式)。 但在这些情况下,我有很多麻烦:

  • 使用地图(地图的)在“生成器”中不再自动完成 到处
  • 混乱的动态方法调用(您不知道它是打字错误还是错误) 动态名称)
  • 方法提取在闭包内部更加复杂(通常会导致代码重复:“它毕竟只是一个小闭包”)
  • 当必须为子系统的方法编写闭包参数时,很难猜测闭包参数
浏览代码不再学习:您必须使用文本搜索

我只能看到GORM的一些好处,但在这种情况下,动态方法是众所周知的,我的IDE也知道它们(因此,对我来说,动态方法更像是一种系统的代码生成)

我很高兴向groovy的老手学习如何证明这些好处。

它确实会导致不同类别的错误和进程。它还使编写测试更快、更自然,有助于缓解bug问题

发现行为的定义和使用位置可能会有问题。虽然IDE在这方面的表现随着时间的推移越来越好,但并没有很好的解决方法

您的代码不应该更难阅读——主线代码应该更容易阅读。动态行为应该消失在应用程序中,并为需要了解这些级别的功能的开发人员提供适当的文档

魔法确实使发现变得更加困难。这意味着其他文档手段,特别是人类可读的测试(想想easyb、spock等)和散文,变得更加重要。

它确实会导致不同类别的错误和过程。它还使编写测试更快、更自然,有助于缓解bug问题

发现行为的定义和使用位置可能会有问题。虽然IDE在这方面的表现随着时间的推移越来越好,但并没有很好的解决方法

您的代码不应该更难阅读——主线代码应该更容易阅读。动态行为应该消失在应用程序中,并为需要了解这些级别的功能的开发人员提供适当的文档


魔法确实使发现变得更加困难。这意味着其他的文档手段,特别是人类可读的测试(想想easyb、spock等)和散文,变得更加重要。

对我来说,重构有两种类型:

  • 基于IDE的重构(提取到方法、重命名方法、引入变量等)
  • 手动重构。(将方法移动到其他类,更改方法的返回值)
  • 对于基于IDE的重构,我还没有发现一个IDE在Groovy中的作用能像在Java中一样好。例如,在eclipse中,当您提取到方法时,它会寻找重复的实例来重构以调用该方法,而不是使用重复的代码。对于Groovy来说,这似乎没有发生

    手动重构是我相信您可以看到重构变得更容易的地方。没有测试,但我同意这可能更难

    cleaner code中的语句是100%准确的。我大胆猜测,从好Java到好Groovy代码,代码行数至少减少了3:1。作为Groovy的新手,我每天都会努力学习至少一种新的做事方式。简单地阅读API就可以极大地帮助我改进Groovy。我觉得Collection、String和List可能是功能最多的,我使用了最多的功能来帮助我的Groovy代码实现Groovy

    既然你编辑了问题,我就编辑我的答案:)

    您可以做的一件事是告诉intellij有关对象上的动态方法:。这可能会有点帮助

    我使用的另一个技巧是在进行初始编码时键入我的对象,并在完成后删除键入。例如,我似乎永远都记不起它是字符串上的.substring(..)还是.substring(..)。因此,如果您键入您的对象,您可以获得更好的代码完成


    至于你的其他要点,我真的需要看一些代码才能给出更好的答案。

    对我来说,重构有两种类型:

  • 基于IDE的重构(提取到方法、重命名方法、引入变量等)
  • 手动重构。(将方法移动到其他类,更改方法的返回值)
  • 对于基于IDE的重构,我还没有发现一个IDE在Groovy中的作用能像在Java中一样好。例如,在eclipse中,当您提取到方法时,它会寻找重复的实例来重构以调用该方法,而不是使用重复的代码。对于Groovy来说,这并不重要
    void validate(Product product) {
      // groovy stuff
    }
    
    Box pack(List<Product> products) {
      def box = new Box()
      box.value = products.inject(0) { total, item ->
        // some BigDecimal calculations =)
      }
      box
    }