- dynamic/
- Dynamic Groovy和动态方法:需要Groovy老手的启示吗
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
}