我应该在Duck Typed语言中定义接口吗?

Mar*_*ith 15 groovy duck-typing interface

我正准备用鸭子式语言(Groovy)编写我的第一个应用程序.

如果我是用静态类型语言编写相同的应用程序,那么我需要定义一些接口.显然,由于在Groovy中打字,他们实际上并不需要.目前我认为将它们定义为有意义的是作为需要在各种对象中实现的方法的文档.我错过了这一点吗?

Dan*_*ark 13

我最近在这里阅读了这篇文章(我现在找不到链接,但它是"为什么动态语言很好?"的帖子之一,以及S. Lott的很多评论) ,答案是:

你可以.特别是在Groovy中,您可以在Java或Groovy中定义接口并实现它们.但是,使用duck-typing(Groovy允许但也允许使用显式类型),许多人会说"为什么要打扰?" 源代码是它自己的文档,接口在源代码中,"使用源代码"等.

就个人而言,这让我很生气 - 我喜欢Java给我的编译时间(或真正的开发时间)检查,但那是另一场辩论.如果你正在使用Groovy,那是因为你想要编写那些来自鸭子类型的简洁明了的代码.在这种情况下,除非必要,否则应避免使用接口.

他们在哪里必要?在程序的各个部分之间,以及在程序的公共API中(尽管它们也可以是抽象类).否则,我会说你应该试着用鸭子式的语言来避免它们.这会强制您在类上编写文档,或编写非常清楚的代码,这是相同的.

我认为这是一种可怕的做法,但这是向动态语言转变范式的一部分.而且我认为如果你避免将界面与实现分开,你就会理解它背后的"原因".我仍然没有,尽管它与不重复代码(保持DRY)有很大关系.

编辑:远离计算机有一些清晰度:)不将接口与实现分开的主要原因之一是让你摆脱对类型的依赖.在鸭子打字中,如你所知,我不在乎它是否是Vehicle界面的实现者(例如).我只关心它是否go有2个参数的方法.因此,使用接口越多,您在Groovy中编写Java就越多("您可以用任何语言编写Fortran").应该避免这种情况,因为新语言可以为您提供新的东西.


lon*_*hot 5

我不熟悉groovy,但总的来说,不,你不需要用松散类型的语言定义接口.

  1. 您将重复自己,如果您需要更改方法签名,那么您需要在两个地方进行,而不是一个.

  2. 尽管接口确实有一些用作文档,但是在松散类型的语言中,大多数编码器都不会期望接口,因此如果需要文档,则不会搜索接口.

  3. 大多数动态语言具有良好的IDE可用,并且方法完成,这进一步减少了对单独接口的需求.

  4. 方法可以在动态语言中绑定和解绑.因此,您可能并且可能最终会遇到不符合该接口的对象.拥有一个单独的界面可能会使阅读代码的人感到困惑.