【问题标题】:Interface design? Can I do it iteratively? How should I handle changes to the interface?界面设计?我可以迭代地做吗?我应该如何处理界面的变化?
【发布时间】:2009-06-02 00:09:34
【问题描述】:

在 C# 或 Java 中定义接口的最佳方法是什么?我们是否需要在真正需要时进行泛型或添加方法?

问候, 斯里尼瓦斯

【问题讨论】:

    标签: c# java oop interface


    【解决方案1】:

    一旦定义了接口,它就不会被更改。 您必须考虑界面的目的并尽可能完整。

    如果你以后发现需要添加一个方法,你真的应该定义一个新的接口,可能是一个 _V2 接口,带有附加的方法。

    附录Here you will find some good guidelines on interface design in C#,作为 C# 设计总体上更大的、有价值的工作的一部分。它通常也适用于 Java。

    摘录:

    虽然大多数 API 最好使用类和结构进行建模,但在某些情况下接口更合适或者是唯一的选择。
    务必至少提供一种类型,即 一个接口的实现。 这有助于验证设计 界面。例如, System.Collections.ArrayList 是一个 的实施 System.Collections.IList 接口。
    务必提供至少一个 API 消耗 您定义的每个接口(一个方法 将接口作为参数或 类型为接口的属性)。 这有助于验证接口 设计。例如,List.Sort 使用 IComparer 接口。
    不要向接口添加成员 之前已经发货了。这样做 会破坏 界面。你应该创建一个新的 避免版本控制的接口 问题。

    我建议依靠the broad type design guidelines

    【讨论】:

    • 我 100% 同意这一点,除了 IMO 这是一个理想的情况。在实践中,我认为你最终需要重构你的接口来处理你第一次没有想到的事情。如果您的接口是公开的,例如 Web 服务或某种 API,那么一定要采纳上述@Cheeso 的建议并将它们版本化。如果它仅在您的项目内部,我认为只要有一个正式的流程来更改它就没有什么问题。您不应该总是随时更改它。
    • +1。当然,在开发过程中,迭代方法是正常的。您将添加方法并查看是否有意义,然后在获得经验时添加和删除更多方法。但是在某些时候你发布了代码,从那时起,接口需要保持固定,除非在非常特殊的情况下。
    【解决方案2】:

    引用约书亚·布洛赫的话:

    如有疑问,请忽略它。

    您以后可以随时添加到界面。一旦成员成为您界面的一部分,就很难更改或删除它。在创建接口时要非常保守,因为它们是具有约束力的合同。

    作为与 Vance Morrison(来自 Microsoft CLR 团队)的附注 here is an excellent interview,他提到了 CLR 的未来版本允许“mixin”或与其成员的默认实现接口的可能性。

    【讨论】:

      【解决方案3】:

      如果您的界面是与其他项目和团队共享的代码的一部分,请听听 Cheeso。但是,如果您的接口是私有项目的一部分,并且您可以访问所有更改点,那么您可能一开始就不需要接口,而是继续更改它们。

      【讨论】:

        【解决方案4】:

        如果界面要公开,我觉得在设计中需要非常小心,因为如果接下来大量代码会突然中断,对界面的更改将会很困难迭代。

        需要谨慎对待界面的更改,因此,如果在初始版本之后不必进行更改,那将是理想的选择。这意味着,就设计而言,第一次迭代将非常重要。

        但是,如果需要更改,实现接口更改的一种方法是deprecate 旧方法,并为旧代码提供转换路径以使用新设计的功能。这确实意味着已弃用的方法仍将保留,以防止使用旧方法的代码被破坏——这并不理想,因此第一次没有正确处理是“要付出的代价”。

        昨天,我偶然发现了 Google 技术讲座:How to Design a Good API and Why It Matters by Joshua Bloch。他是 Java Collection 库等的设计和实现的幕后推手,是Effective Java 的作者。

        该视频时长大约一个小时,其中他详细介绍了什么是好的 API,为什么我们应该制作精心设计的 API 等等。这是一个很好的视频,可以在考虑设计 API 时获得一些想法和灵感。

        【讨论】:

          【解决方案5】:

          稍后向接口添加方法会立即破坏接口的所有未意外实现这些方法的实现。因此,请确保您的接口规范是完整的。我建议您从接口的(示例)客户端开始,该部分实际上使用实现所述接口的类的实例。无论客户需要什么,都必须是界面的一部分(显然)。然后制作接口的(示例)实现,并查看哪些附加方法通常有用且可用(在可能的其他实现中),因此它们也应该是接口的一部分。检查对称完整性(例如,如果有一个“openXYZ”,也应该有一个“closeXYZ”。如果有一个“addFooBar”,应该有一个“removeFooBar”。等等) 如果可能,让同事检查您的规格。

          并且:确定你真的想要一个界面。也许抽象基类更适合您的需求。

          【讨论】:

            【解决方案6】:

            嗯,这真的取决于你的具体情况。如果您的团队是该界面的唯一用户/维护者,那么请务必按照您认为合适的方式对其进行修改,并忘记所有关于“最佳实践 blabla”之类的东西。毕竟这是你的代码......永远不要在不了解其基本原理的情况下盲目遵循最佳实践。

            现在,如果您正在创建一个其他团队或客户可以使用的公共 API(想想插件、扩展点或类似的东西),那么您必须对您在界面中放置的内容持保守态度。正如其他提到的,您可能必须在这些情况下添加 _V2 类型的接口。 Microsoft 使用了几个 Web 浏览器 COM 接口。

            微软在框架设计指南中发布的指南就是:PUBLIC 接口指南。不适用于私人内部物品;艰难的其中许多仍然适用。知道什么适用于您的情况。

            没有规则可以弥补常识的不足。

            【讨论】:

              猜你喜欢
              • 2010-10-17
              • 2011-02-25
              • 1970-01-01
              • 2017-04-26
              • 1970-01-01
              • 1970-01-01
              • 2023-01-16
              • 2010-10-13
              • 1970-01-01
              相关资源
              最近更新 更多