Java 你能不能吃太多“;动态”;在动态语言中?

Java 你能不能吃太多“;动态”;在动态语言中?,java,groovy,dynamic-languages,paradigms,Java,Groovy,Dynamic Languages,Paradigms,在过去的几个月里,我一直在从Java向Groovy过渡,我能体会到它带来的许多好处:代码更少,闭包更少,构建器更少,MOP最终使像Grails这样的框架成为可能,在编写测试时易于模拟等等 然而,我的同事却“指责”我的代码不够groovy。也就是说,我仍然为我的参数和字段声明类型,倾向于使用继承和多态性而不是duck类型等。在我看来,在这些情况下,它不仅是动态与静态的,而且是动态与面向对象范例的一种困境。在这些情况下,我仍然倾向于使用OO。我觉得OO范式在其基本前提中有着巨大的价值,它允许您抽象代

在过去的几个月里,我一直在从Java向Groovy过渡,我能体会到它带来的许多好处:代码更少,闭包更少,构建器更少,MOP最终使像Grails这样的框架成为可能,在编写测试时易于模拟等等

然而,我的同事却“指责”我的代码不够groovy。也就是说,我仍然为我的参数和字段声明类型,倾向于使用继承和多态性而不是duck类型等。在我看来,在这些情况下,它不仅是动态与静态的,而且是动态与面向对象范例的一种困境。在这些情况下,我仍然倾向于使用OO。我觉得OO范式在其基本前提中有着巨大的价值,它允许您抽象代码结构并将其与特定的现实世界概念联系起来

因此,以下是我需要帮助的特定问题:

  • 我应该为参数、字段等声明类型吗

  • 当简单方法可以实现时,我应该将代码块声明为闭包吗

  • 什么时候应该使用duck类型而不是多态动态分派。例如,在groovy中,我可以执行animal.“$action”()或def animal;animal.action(),而不是animal=新狗();动物。动作()。我可以在开-闭原则的上下文中看到first的问题,但是还有其他原因更喜欢OO风格的多态性吗

  • 什么时候应该在groovy中使用接口(如果有的话)

  • 我确信还有一些类似的困境我没有写下来。我还认为,这些问题不仅适用于groovy,而且适用于任何其他动态语言。
    您的看法是什么?

    我认为使用Groovy时,您应该支持最简单的方法,并且只有在情况需要时才使用groovier特性。(比如在Clojure中编写宏或创建多方法时,如果你发现自己经常使用这些工具,你应该质疑自己。)我觉得你的谨慎态度很好,可能你的同事对他们新发现的能力有些陶醉。(这不是第一次了。)

    拥有像Groovy这样灵活的语言的好处是,您可以从谨慎的方法开始,就像您喜欢知道自己有更强大的替代方案在需要时可以依靠它们一样。你知道,“最简单的事情可能会奏效。”


    更具体地说,与接口相比,更喜欢duck类型,并且不必为参数类型操心似乎是一件好事,这可能会使为测试提供mock变得更容易。

    这取决于人们对什么感到满意。我喜欢使用类型声明和方法调用,因为我熟悉Java。我编写的代码必须由没有太多动态编程经验的人来维护,因此我将其与普通Java代码保持接近,除非有充分的理由使用高级groovy功能。听起来您的团队应该创建编码标准,试图解释什么时候应该普遍使用Groovy的特定功能。

    这并不总是一个流行的观点,但我认为您的代码越明确越好

    我不喜欢让你猜到底发生了什么的结构

    我在Ruby工作了一年,一点也不喜欢它。我并不是说它没有卓越的地方,我只是说我真的很喜欢保持事情的干净和明确,我不觉得Ruby有这样的目标

    有一件事我确实弄明白了——你打字的数量并不等于总体开发速度。的确,复杂的代码库和大量重复的代码会导致非常缓慢的开发,但是简单地减少您键入的内容而不消除重复是没有用的,并且键入更长、更清晰、更明确的代码通常会比以简洁的方式编写的相同代码更快(在整个项目中),不太正式的语言

    如果您不认为键入与开发速度没有关系,那么下次发布项目时,请计算代码行数并除以所花费的人工天数(包括调试和测试)。换句话说,每天输入多少代码。您会发现结果是一个非常小的数字——实际上,键入代码是任何软件项目中非常小的一部分。

    是的

    --

    没有


    你知道这个问题没有真正的答案吗?

    有两种主要的面向对象语言

    <> >强> Simule67 < /St>家族,如C++和java,有利于静态类型变量、编译器和链接器以及方法VTAB.< /P> Smalltalk系列中的语言,如Ruby,支持动态类型的变量、解释和消息传递,而不是函数指针表


    两者都是面向对象的,但在面向对象的概念上有很大的不同。

    .1。我应该为参数、字段等声明类型吗

    我倾向于在作为公共API的一部分使用的类上声明类型,其他开发人员将大量使用这些类型,或者我希望从IntelliJ获得一些额外的自动完成帮助。否则我会“定义”事情

    .2。当简单方法可以实现时,我应该将代码块声明为闭包吗

    我使用方法,除非它是我计划作为变量传递的东西。尽管有“foo&bar”方法去引用操作符,但大多数开发人员并不知道这一点,当他们遇到它时会感到困惑。我还使用闭包,当它是一小段代码时,很明显可以保留在一个更大的方法中,而不是放在它自己的方法中进行描述

    .3。什么时候应该使用duck类型而不是多态动态分派。例如,在groovy中,我可以执行animal.“$action”()或def animal;animal.action(),而不是animal=新狗();动物。动作()。我看得出来