【问题标题】:Duck type as syntactic sugar for reflection: Good or bad idea?Duck 类型作为反射的语法糖:好主意还是坏主意?
【发布时间】:2010-09-23 14:55:00
【问题描述】:

我最近一直在想,在 Java 和 C# 等语言中,将“鸭子”类型作为方法参数类型包含在内是否是一种很好的语法糖形式?如下所示:

void myFunction(duck foo) {
   foo.doStuff();
}

这可能是通过反射调用 doStuff() 的语法糖,也可以以不同的方式实现。 Foo 可以是任何类型。如果 foo 没有 doStuff() 方法,这将引发运行时异常。关键是,当您需要它们时,即大多数时候,您将获得更严格的预先指定的接口范例(性能、错误检查)的好处。同时,您将拥有一个简单、干净的后门来避免打字,这将允许您干净地进行初始设计中未预见到的更改,而无需进行大规模重构。此外,它可能会 100% 向后兼容,并与现有的语言结构完美结合。我认为这可能有助于减少过度设计的以防万一的编程风格,这种风格会导致混乱、混乱的 API。您认为这样的事情在 C# 和 Java 等静态 OO 语言中是好事还是坏事?

【问题讨论】:

    标签: refactoring language-design syntactic-sugar duck-typing


    【解决方案1】:

    dynamic 关键字支持这些精确的语义并将在 C# 4.0 中。

    不过,这不仅仅是为了反思。它是dynamic dispatch 的一个实现,只有在没有其他机制可用时才使用反射。

    This question也有很多不错的信息。

    【讨论】:

      【解决方案2】:

      实际上,这与将成为 C#4 一部分的“动态”类型非常相似。

      【讨论】:

        【解决方案3】:

        我的简短回答是“是的,Duck Typing 是一种在 OO 语言中很有用的工具。C# 团队同意这一点,并将其放入 C# 4.0”

        长答案:

        Duck Typing 有其优点和缺点......有很多人完全发誓,但我会告诉你:有一些非常令人信服的理由将 Duck Typing 用于不可能的事情在任何其他情况下都能很好地解决。

        在使用字典而不是 IDictionary 的界面上查看我的帖子,Duck Typing 可以节省一天的时间:

        http://www.houseofbilz.com/archive/2008/09/22/why-you-really-need-to-think-about-your-interfaces.aspx

        C# 从 1.0 开始就内置了一些鸭子类型!以 foreach 关键字为例。一个常见的误解是,您的类型需要是 IEnumerable 才能在 foreach 循环中使用对象。事实证明,事实并非如此。您只需要实现 GetEnumerator() 并且不需要实现接口(尽管它是很好的形式)。这是鸭子打字。

        【讨论】:

        • 我不喜欢鸭式成员名称的想法,但希望有一种方法可以鸭式接口及其组合[例如“此方法需要 IEnumerable<Thing>ILookup<Thing, OtherThing>] 并允许接口声明其他特定类型应被视为实现 [接口要么直接包含实现代码,要么指定包含它的静态类]. 这种方法将提供“打字保护”,同时保留动态类型的许多有用方面。
        • @supercat 你的意思是这样的吗? github.com/skyguy94/dynamic-wrapper
        • 是的,类似的;我没有注意到的一件事是foo.As<T>.As<U> == foo.As<U>,这对于我希望看到的那种界面鸭式打字来说是必不可少的。
        猜你喜欢
        • 2019-11-11
        • 1970-01-01
        • 1970-01-01
        • 2011-10-21
        • 2010-11-23
        • 2015-04-29
        • 2011-10-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多