11

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

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

所以,这里有一些我需要帮助的特殊问题:

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

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

  3. 我什么时候应该使用鸭子类型而不是多态动态调度。例如,在 groovy 中我可以做 animal."$action"() 或 def animal; animal.action() ,而不是 Animal animal = new Dog(); 动物.action()。我可以在 Open-Closed 原则的上下文中看到问题,但还有其他原因更喜欢 OO 风格的多态性吗?

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

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

4

6 回答 6

6

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

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

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

我确实弄清楚了一件事——你输入的数量并不等同于整体开发速度。确实,包含大量重复代码的复杂代码库会导致开发速度非常慢,但简单地减少键入的内容而不消除重复是没有用的,键入更长、更清晰、更明确的代码通常会更快(超过项目的长度)而不是用简洁、不太正式的语言编写的相同代码。

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

于 2009-12-09T21:44:21.027 回答
2

我认为对于 Groovy,您应该支持最简单的做事方式,并且仅在情况需要时才使用 groovier 功能。(就像在 Clojure 中编写宏或创建多方法时一样,如果您发现自己经常使用这些工具,您应该质疑自己。)您谨慎的方法对我来说似乎很好,可能您的同事对他们新发现的力量有点陶醉. (这不会是第一次。)

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

更具体地说,更喜欢鸭子类型而不是接口而不是参数类型似乎是一件好事,它可能会使为测试提供模拟变得容易得多。

于 2009-12-09T21:15:09.980 回答
1

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

于 2009-12-09T21:40:24.867 回答
1

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

我倾向于在用作公共 API 的一部分的类上声明类型,其他开发人员将大量使用的东西,或者我希望 IntelliJ 提供一些额外的自动完成帮助。否则我'定义'事情。

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

我使用方法,除非它是我计划作为变量传递的东西。尽管有 "foo.&bar" 方法解引用运算符,但大多数开发人员并不知道这一点,并且在遇到它时会被它弄糊涂。当一小段代码很明显要保留在更大的方法中而不是出于描述目的而放入它自己的方法时,我也会使用闭包。

.3. 我什么时候应该使用鸭子类型而不是多态动态调度。例如,在 groovy 中我可以做 animal."$action"() 或 def animal; animal.action() ,而不是 Animal animal = new Dog(); 动物.action()。我可以在 Open-Closed 原则的上下文中看到问题,但还有其他原因更喜欢 OO 风格的多态性吗?

我只在需要这种间接级别时使用 animal."$action"() 形式,因为方法名称根据代码执行路径而变化(最常见于重元编程期间)。我使用 Animal 动物 = new Dog(); 当我需要 IDE 的自动完成帮助时,或者该级别的文档有助于代码清晰(并且不会因可能明显或限制的额外冗长而受到伤害)时,请使用 animal.action()。

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

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

于 2009-12-10T04:49:07.677 回答
0

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

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

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

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

于 2009-12-09T21:59:19.027 回答
-1

是的

--

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

于 2009-12-09T21:52:39.813 回答