代码之家  ›  专栏  ›  技术社区  ›  Martin Smith

我应该用鸭式语言定义接口吗?

  •  15
  • Martin Smith  · 技术社区  · 14 年前

    我正要用鸭式语言(groovy)编写我的第一个应用程序。

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

    4 回复  |  直到 10 年前
        1
  •  13
  •   Dan Rosenstark    14 年前

    我最近一直在读这篇文章,所以(我现在找不到链接,但它是其中之一:“为什么动态语言很好?”博文,S.Lott的一个大回答,有很多评论),答案是:

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

    就我个人而言,这让我疯狂——我喜欢Java给我的编译时间(或真的,开发时间),但这是另一场辩论。如果您使用的是groovy,那是因为您希望编写一个简洁而清晰的代码,这些代码来自duck输入。在这种情况下,除非必要,否则应避免使用接口。

    他们需要在哪里?在程序的各个部分之间,以及在程序的公共API中(尽管它们也可以是抽象类)。 否则,我会说你应该尽量避免使用鸭式语言。这迫使你在类上写文档,或者写一些非常清楚的代码,使它们是相同的。

    我认为这是一个糟糕的实践,但是这是向动态语言转变的范例的一部分。我认为,如果您避免将接口与实现分离得足够多,那么您将理解它背后的“为什么”。我仍然没有,尽管这与不重复代码(保持干燥)有很大关系。

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

        2
  •  5
  •   longshot    14 年前

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

    1. 如果您需要更改方法签名,那么您需要在两个位置(而不是一个)重复自己的操作。

    2. 虽然接口确实有一些用作文档的用途,但在松散类型的语言中,大多数编码人员不会期望接口,因此,如果他们需要文档,就不会搜索接口。

    3. 大多数动态语言都有很好的IDE,方法完成后,进一步减少了对单独接口的需求。

    4. 方法可以在动态语言中绑定和解除绑定。因此,您可以,也可能会以不依附于接口的对象结束。拥有一个单独的接口可能会使阅读代码的人感到困惑。

        3
  •  2
  •   Vlad    14 年前

    定义接口是一种代码文档。通过接口,可以显式声明 期待 从课堂上满足你的需要。

    附言:groovy不是我的语言,所以我实际上没有 知道 是否可以在那里定义接口 完全 .

        4
  •  1
  •   user1891987    10 年前

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

    //interface injected to a java class
    public interface SomeInterface {
        <T> T getSomething(int version, Long id);
    }
    

    然后,groovy实现如下所示:

    //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模式创建对象,并在Jersey RESTful Web服务中使用它们。我正在对Web服务进行版本控制,所做的更改足以实现版本控制,但是仍然有很多代码可以重用。使用接口被证明是有问题的,所以我使用了groovy,并通过duck类型将所有类似的逻辑移动到上面提到的groovy类中。这些对象大部分都是相同的,有些改变,所以在Java类中注入一个接口的鸭子打字工作非常完美。