Interface 我应该用Duck类型的语言定义接口吗?

Interface 我应该用Duck类型的语言定义接口吗?,interface,groovy,duck-typing,Interface,Groovy,Duck Typing,我正要用duck类型语言(Groovy)编写我的第一个应用程序 如果我要用静态类型语言编写相同的应用程序,那么我需要定义一些接口。显然,由于Groovy中的duck类型,实际上并不需要它们。目前,我认为将它们定义为需要在各种对象中实现的方法的文档可能是有意义的。我没有抓住要点吗?定义接口是一种代码文档。通过一个接口,您可以显式地声明您期望从类中得到什么来满足您的需求 PS:groovy不是我的语言,所以我实际上不知道是否可以在那里定义接口。我不熟悉groovy,但一般来说,不需要用松散类型的语言

我正要用duck类型语言(Groovy)编写我的第一个应用程序


如果我要用静态类型语言编写相同的应用程序,那么我需要定义一些接口。显然,由于Groovy中的duck类型,实际上并不需要它们。目前,我认为将它们定义为需要在各种对象中实现的方法的文档可能是有意义的。我没有抓住要点吗?

定义接口是一种代码文档。通过一个接口,您可以显式地声明您期望从类中得到什么来满足您的需求


PS:groovy不是我的语言,所以我实际上不知道是否可以在那里定义接口。

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

  • 如果需要更改方法签名,则需要在两个位置进行更改,而不是一个位置

  • 虽然接口确实可以用作文档,但在松散类型的语言中,大多数编码人员都不希望有接口,因此如果他们需要文档,也不会去搜索接口

  • 大多数动态语言都有很好的IDE,并且有方法完成,这进一步减少了对单独接口的需要

  • 方法可以在动态语言中绑定和解除绑定。因此,您可以,也可能会,最终得到不符合接口的对象。拥有一个单独的界面可能会让阅读代码的人感到困惑


  • 我最近在这里读到了这篇文章(我现在找不到链接,但这是一篇“为什么动态语言好?”的帖子,s.Lott给出了一个很大的答案,有很多评论),答案是:

    你可以。特别是在Groovy中,您可以用Java或Groovy定义接口并实现它们。然而,对于duck类型(Groovy允许但也允许显式类型),许多人会说“为什么麻烦呢?”源代码是它自己的文档,接口在源代码中,“使用源代码”等等

    就个人而言,这让我发疯——我喜欢Java给我的编译时(或者说开发时)检查,但这是另一个争论。如果您使用的是Groovy,那是因为您希望编写来自duck类型的精练而清晰的代码。在这种情况下,除非必要,否则应避免使用接口

    哪里需要它们?在程序的各个部分之间,以及在程序的公共API中(尽管它们也可以是抽象类)否则,我会说您应该在duck类型的语言中尽量避免使用它们。这迫使您在类上编写文档,或编写清晰的代码,使其与类相同。

    我认为这是一种可怕的做法,然而这是向动态语言的范式转变的一部分。我认为,如果您尽量避免将接口与实现分离,您就会理解其背后的“原因”。我仍然没有,尽管这与不重复代码(保持干燥)有很大关系


    编辑:从计算机中获得了一些清晰:)不将接口与实现分离的主要原因之一是为了避免对类型的依赖。正如您所知,在duck类型中,我不在乎它是否是
    Vehicle
    接口的实现者(例如)。我只关心它是否有一个带有2个参数的
    go
    方法。因此,使用接口越多,使用Groovy编写Java的次数就越多(“可以用任何语言编写Fortran”)。这应该避免,因为新的语言会让你接触到新的东西

    在某些情况下是的。我有一个例子,我正在创建一个Groovy类,它通过Spring注入Java类。我使用以下泛型创建了一个接口:

    //interface injected to a java class
    public interface SomeInterface {
        <T> T getSomething(int version, Long id);
    }
    
    //Groovy impelentation
    class SomeInterfaceImpl implements SomeInterface {
        def getSomething(int version, Long id) {
            //use duck typing to create similar objects based on version
        }
    }
    

    我的示例是,我使用JAXB和XJC从XML模式创建对象,并在restful web服务中使用它们。我正在对web服务进行版本控制,所做的更改足以支持该版本,但仍有许多代码可以重用。使用接口被证明是有问题的,所以我改用Groovy,并将所有类似的逻辑移到上面提到的带有duck类型的Groovy类中。这些对象基本上是相同的,但有一些变化,因此在Java类中插入接口的duck类型非常有效。

    @longshot您使用什么样的IDE/语言来完成好方法?我将Netbeans与Ruby结合使用,它通常不知道有哪些方法可用,只是从全局名称空间完成它们。AllegroCL具有良好的通用Lisp自动补全功能。WingIDE对于Python有很好的自动完成功能,只要它知道您引用的是什么类型。XCode对ObjC有很好的完善性,但同样需要注意的是,它需要知道您发送消息的类型。和@Sergey Mirvoda,谢谢。Objective-C是我的新问题,所以我希望XCode能做到这点。@Martin,谢谢你,我在后面附上了我的答案,以便更好地解释。