Language agnostic 首先是接口还是类

Language agnostic 首先是接口还是类,language-agnostic,oop,Language Agnostic,Oop,在软件中设计新功能的过程中,哪个过程是最佳实践 设计类将实现的接口 稍后编写类并提取接口 如果走第二条路,你什么时候决定需要一个接口?如果你真的经历了设计阶段,那么在编码之前你已经为接口和类创建了设计。对吗?当您需要从几个类中重构公共功能时,会显示该接口 除非有多个具有共同特性的类,否则很难预测接口应该是什么 一旦有了几个类,就可以非常容易地推断出接口需要是什么,然后返回并重构这些类以正确地实现新发现的接口 有些人在纸上设计了很多类来确定接口应该是什么。保存重构真实代码。相反,你必须重构你的设计

在软件中设计新功能的过程中,哪个过程是最佳实践

  • 设计类将实现的接口
  • 稍后编写类并提取接口

  • 如果走第二条路,你什么时候决定需要一个接口?

    如果你真的经历了设计阶段,那么在编码之前你已经为接口和类创建了设计。对吗?

    当您需要从几个类中重构公共功能时,会显示该接口

    除非有多个具有共同特性的类,否则很难预测接口应该是什么

    一旦有了几个类,就可以非常容易地推断出接口需要是什么,然后返回并重构这些类以正确地实现新发现的接口


    有些人在纸上设计了很多类来确定接口应该是什么。保存重构真实代码。相反,你必须重构你的设计

    通常,您不需要接口,除非您考虑了几个类来实现它。因此,接口将是第一位的。

    我会说接口是第一位的,但它们是在开发特定的类/方法时出现的。当您知道自己依赖于其他类/方法时,请使用接口添加依赖项并继续编写代码。然后在编写完当前组件后返回,创建实现所需接口的组件。

    这取决于具体情况

    当您在设计阶段知道您将拥有多个具有相同“公共性”的类,但它们的实现不同时,那么首先是接口


    然而,软件是有机的;它是不断发展的,所以我可以想象,在某些情况下,您将拥有一个类,并且在一段时间后,有必要从该类中提取接口。

    我必须同意S.Lott的观点,并补充说,一旦创建了接口,接口的设计就“一成不变”


    仅出于这个原因,在您了解接口包含的所有内容之前,不应创建接口。

    我通常选择第二个选项。稍后编写一个类并提取接口。通常,提取接口的原因是需要该接口的第二个实现(通常作为单元测试的模拟)

    最终,您的设计阶段应该在实现阶段之前。在开始编写代码之前,您应该对类之间的交互有一个清晰的了解,并且希望您的接口决策将从中显而易见

    但是,如果您已经编写了一个类,现在需要对其进行重构以获得一个接口,那么请记住,接口只是选择一组函数/方法,这些函数/方法具有多个类所需的共同用途。如果您发现您的其他类需要一些有用的函数,那么这些方法将很适合作为接口的候选者

    接口的另一个真正有用的部分是,如果您发现类的某些部分不是私有的,但您希望对某些其他对象隐藏,那么在这种情况下,您可以将希望公开的函数作为接口


    我强烈反对任何人说你不应该事先设计。编码人员都喜欢直接进入它,有时重构是必要的,但一个强大的设计阶段将为您节省大量的重构时间

    诡计问题!考试是第一位的。然后是测试的实现,该类可能已经实现了接口,也可能尚未实现接口。通过测试的一部分可能涉及从现有类中提取接口,但在获得需要该接口的东西之前,不要试图猜测接口需要什么


    如果你想提前弄明白这一点,你会发疯的——或者无论如何,我在TDD之前的日子里总是这么做的。决定你的应用程序需要什么功能,编写一个测试,并让该测试指导你如何使用代码。

    对于大多数类来说,接口是非常重要的,因为实现可以随时更改,但一旦接口中提供了一些东西,就很难或不可能收回它。对于项目的其余部分来说,接口是最重要的,而实现是其他人的问题

    理想情况下,接口的主要功能将在任何实现工作之前指定。(提前设计测试也是一个好主意。)细节可以允许发展,但对接口的任何更改都应该基于其他类和例程的需要,而不是实现的工件。实现应该始终由接口决定,而不是相反


    (由于这是一个语言不可知的问题,我假设正在讨论的“接口”是类的公共功能,而不是说java替换C++抽象类。C++中,这是“公共”标记的类定义的一部分。

    < P>类应该是第一位的。p>
    一个美丽的设计只有在经历变化的考验时才能被确定为美丽。如果你的接口不是从代码开始伪造的,你怎么知道它是否经得起时间的考验呢?

    我同意Brian Guthrie的观点。首先是测试,因为它将驱动您的设计。虽然这通常意味着最终会得到一个具体的类(通过将其行为指定为一组测试来设计的类),但依赖关系通常会通过接口来表示(以允许模拟并遵循测试规则)

    这通常意味着您将在拥有类之前拥有接口,但这只是因为