在设计软件中的新功能的过程中,哪个过程是最佳实践
如果走2号路线,你什么时候决定需要接口?
答案 0 :(得分:16)
当您需要重构多个类中的常用功能时,界面会显示。
在你有多个具有共同特征的类之前,很难预见接口应该是什么。
一旦有了几个类,就可以更容易地推断出接口需要什么,然后返回并重构这些类以正确实现新发现的接口。
有些人在纸上设计了很多课程,以确定界面应该是什么。保存重构实际代码。相反,你必须重构你的设计。
答案 1 :(得分:6)
欺骗问题!测试首先进行。然后是测试的实现,这是一个可能已经或可能不会实现接口的类。进行测试通过的一部分可能涉及从现有类中提取接口,但在您需要该接口之前,不要试图猜测您的接口需要什么。
你会让自己疯狂地试图提前解决这个问题 - 或者无论如何,我总是在我之前的TDD日做过。确定您的应用程序需要哪些功能,编写测试,并让测试指导您对代码执行的操作。
答案 2 :(得分:3)
我同意Brian Guthrie的观点。首先是测试,因为它会驱动你的设计。虽然这通常意味着最终得到一个具体的类(您通过在一组测试中指定其行为而设计的类),依赖关系通常将通过接口表示(以允许模拟并遵循dependency inversion principle )。
这通常意味着您在拥有类之前会拥有接口,但这只是因为您之前需要它们。
答案 3 :(得分:2)
我通常选择第二种选择。稍后编写一个类并提取界面。通常,提取接口的原因是需要第二次实现该接口(通常作为单元测试的模拟)
答案 4 :(得分:1)
我会说接口是第一位的,但是当你开发一个特定的类/方法时它们会出现。如果您知道自己依赖某些其他类/方法,请使用接口添加依赖关系并继续编写代码。然后在完成编写当前组件之后返回并创建实现所需接口的组件。
答案 5 :(得分:1)
一切都取决于具体情况......
当您在设计阶段知道您将拥有多个具有相同“共性”的类,但它们的实现方式不同时,则首先是界面。
然而,软件是有机的;它不断发展,所以我可以想象,在某些情况下,你会有一个类,经过一段时间后,有必要从该类中提取一个接口。
答案 6 :(得分:1)
最终,您的设计阶段应该在您的实施阶段之前进行,无论如何。在你开始编码之前,你应该对你的课程之间的相互作用有一个强烈的了解,并希望你的界面决策能够从中明显看出。
但是,如果你已经编写了一个类,现在需要重构它以获得一个接口,那么请记住,接口只是选择一组具有共同目的的函数/方法。不止一个班级。如果您发现其他类需要一些有用的函数,那么这些方法将是接口的良好候选者。
使它们真正有用的接口的另一部分是,如果你发现你的类的某些部分不是私有的,但你想要隐藏某些其他对象,那么你可以采取你的功能想暴露,并使它们成为一个界面。
我强烈反对任何说你不应事先设计的人。编码人员都喜欢直接进入它,有时,重构是必要的,但强大的设计阶段将为您节省大量的重构时间。
答案 7 :(得分:1)
接口对于大多数类来说是非常重要的,因为可以随时更改实现,但是一旦在接口中提供了某些内容,就很难或不可能撤消它。对于项目的其余部分,界面是重要的,实现是别人的问题。
理想情况下,接口的主要功能将在任何实现工作之前指定。 (预先设计测试也是一个好主意。)可以允许细节发展,但是接口的任何更改都应该基于其他类和例程所需的内容,而不是实现的工件。实现应始终由界面决定,而不是相反。
(因为这是一个与语言无关的问题,我假设所讨论的“接口”是该类的公共功能,而不是Java替代C ++抽象类。在C ++中,这将是类定义的部分标记为“public”。)
答案 8 :(得分:0)
如果您真的经历了设计阶段,那么在编码之前,您将为接口和类创建设计。正确?
答案 9 :(得分:0)
通常,您不需要接口,除非您考虑过几个将实现它的类。所以,界面将首先出现。
答案 10 :(得分:0)
我不得不同意S. Lott的观点,并补充说,一旦你创建了Interface的设计就会“一成不变”。
仅凭这个原因,在您知道它将包含的所有之前,不应创建接口。
答案 11 :(得分:0)
班级应该是第一位的。
美丽的设计只有在经历变革的坩埚时才能被认为是美丽的。你怎么知道如果他们的代码不是从代码开始伪装的话,你的界面是否经得起时间的考验?
答案 12 :(得分:0)
我想在两种不同的视图中讨论接口:
但是,在这两种情况下,您首先进行设计,然后进行编码。
对于一个新系统,我希望首先识别候选接口,然后由类实现。对于现有系统,当您在系统中发现重要实体或变异点时,会发生现有类的接口,而在此之前或之前您不需要提供变异点之前的重要实体或变异点。 / p>
答案 13 :(得分:0)
哪个先来?是否需要功能或实现功能?
在我自己的工作流程中,界面首先自发出现。如果我的项目的某些部分需要一个新功能,它是围绕我想要使用它的方式构建的,即它的界面。然后执行如下。
这样,实现只包含实际需要的内容,并且不会浪费时间来过度使用闪亮的无用代码。
答案 14 :(得分:0)
接口随着时间的推移变得非常糟糕。每当您更改界面时,您都会违反合同。实现接口的所有类都必须重构。为了保持向后兼容,开发人员可以通过IFoo获得创意并设计IFoo2。随着时间的推移,这将成为维护的噩梦。
注意以下几点:更喜欢在接口上定义类。如果要提供值类型的多态层次结构,请使用接口。另一种使用接口的方法是实现与多重继承类似的效果。
答案 15 :(得分:-1)
我不知道哪个是最好的,但我确信在所有情况下,正确的答案总是这两个选项中的一个!