在动态语言中你能拥有太多“动态”吗?

时间:2009-12-09 20:53:45

标签: java groovy dynamic-languages paradigms

在过去的几个月里,我一直在从Java转换到Groovy,我可以欣赏它带来的许多好处:更少的代码,闭包,构建器,MOP最终使像Grails这样的框架成为可能,轻松嘲笑写测试等。

然而,我被同事“指责”我的代码并不够常规。也就是说,我仍然为我的参数和字段声明类型,倾向于使用继承和多态而不是鸭子打字等。在我看来,在这些情况下,它不仅是动态与静态,而且是动态与面向对象的范式。有点困境。在那些情况下,我仍然倾向于选择OO。我觉得OO范式在其基本前提中具有很大的价值,它允许您将代码结构抽象化并与特定的现实世界概念相关联。

所以,以下是我需要帮助的特殊问题:

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

  2. 我应该在简单方法时将代码块声明为闭包吗?

  3. 我应该何时使用duck typing而不是多态动态调度。例如,在groovy我可以做动物。“$ action”()或def动物; animal.action(),而不是Animal animal = new Dog(); animal.action()。我可以在开放 - 封闭原则的上下文中首先看到问题,但是更喜欢OO样式多态的任何其他原因?

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

  5. 我确信还有一些其他类似的困境,我没记下来。我也认为这些问题不仅适用于groovy,也适用于任何其他动态语言。 你有什么看法?

6 个答案:

答案 0 :(得分:6)

这并不总是一种流行的观点,但我认为代码越清晰明确越好。

我不喜欢让你猜测发生了什么的结构......

我在Ruby工作了一年,根本不喜欢它。我并不是说它没有擅长的地方,我只是说我真的喜欢保持清洁和明确,并且不觉得Ruby将其作为目标。

我确实想到了一件事 - 你所做的打字数量并不等于整体开发速度。确实,具有大量重复代码的复杂代码库使得开发速度非常慢,但是简单地减少您键入的内容而不消除重复是没有用的,并且键入更长,更清晰,更明确的代码通常会更快(在项目的长度)而不是用简洁,不那么正式的语言编写的相同代码。

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

答案 1 :(得分:2)

我认为使用Groovy你应该赞成最简单的做事方式,并且只有在情况需要时才能回归到groovier功能。 (就像在Clojure中编写宏或创建多方法时一样,如果你发现自己很多时候都会使用这些工具,那么你应该对自己提出质疑。)你的谨慎态度对我来说似乎很好,可能你的同事对他们新发现的力量有点陶醉。 (这不是第一次。)

拥有像Groovy这样的灵活语言的好处是你可以从像你喜欢的谨慎方法开始,因为你知道你有更强大的替代方案可以在你需要的时候依赖它们。你知道,“最简单的事情可能有用。”

更具体地说,优先选择接口上的鸭子打字而不打扰参数上的类型似乎可能是一件好事,它可以使测试提供模拟更容易。

答案 2 :(得分:1)

归结为人们对此感到满意。我喜欢使用类型declerations和方法调用,因为我对Java很满意。我编写的代码必须由具有大量动态编程经验的人员维护,因此我保持接近普通的Java代码,除非有充分的理由使用高级groovy功能。听起来你的小组应该创建编码标准,试图解释何时应该使用Groovy的特定功能。

答案 3 :(得分:1)

0.1。我应该为参数,字段等声明类型吗?

我倾向于在用作公共API一部分的类上声明类型,其他开发人员会消耗很多东西,或者我想从IntelliJ获得一些额外的自动完成帮助。否则我就会“贬低”。

0.2。我应该在简单方法的情况下将代码块声明为闭包吗?

我使用方法,除非我计划作为变量传递。即使有“foo。& bar”方法解除引用运算符,大多数开发人员都不知道这一点,并且当它们遇到它时会被它弄糊涂。我还使用闭包,当它是一小段代码时,可以清楚地保留在一个更大的方法中,而不是为了描述目的而放入它自己的方法。

0.3。我什么时候应该使用duck typing而不是多态动态调度。例如,在groovy我可以做动物。“$ action”()或def动物; animal.action(),而不是Animal animal = new Dog(); animal.action()。我可以在开放 - 封闭原则的上下文中首先看到问题,但是更喜欢OO样式多态的任何其他原因?

我只使用动物。“$ action”()形式,当我需要该级别的间接时,因为方法名称因代码执行路径而异(通常在重度元编程期间)。我用动物动物=新狗(); animal.action()当我想要IDE帮助自动完成时,或者那个级别的文档有助于代码清晰度(并且不会受到可能明显或限制的额外冗长的伤害)。

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

我很少使用它们。我可以看到它们主要用作公共API调用的预期字段的文档,或者可能用作标记接口,以帮助从元编程的角度区分一组类和另一组类。它们在groovy中的用处远不如在java中。

答案 4 :(得分:0)

面向对象语言有两种主要类型。

Simula 67 系列中的语言,如C ++和Java,支持静态类型变量,编译器和链接器以及方法vtable。

Smalltalk 系列中的语言(如Ruby)支持动态类型变量,解释和消息传递,而不是函数指针表。

两者都是面向对象的,但是面向对象的概念却截然不同。

答案 5 :(得分:-1)

YES

-

NO

你是否意识到这个问题没有真正的答案?