Questions tagged «interfaces»

有关接口相关设计注意事项的问题,例如接口编程。


9
我更改了一种方法签名,现在有25,000多个错误。现在怎么办?
我最近开始了新工作,正在处理一个非常大的应用程序(15M loc)。在我之前的工作中,我们有一个类似的大型应用程序,但是(不管是好是坏)我们使用OSGi,这意味着该应用程序被分解为许多微服务,这些微服务可以独立地更改,编译和部署。新的应用程序只是一个大型代码库,可能包含几个.dll。 所以我需要更改此类的界面,因为这是老板要求我执行的操作。最初,他们在编写时就采用了一些假设,但并不能很好地概括其概论,并且有一段时间以来,他们一直在避免重构问题,因为它是如此紧密地耦合在一起。我更改了界面,现在有25000多个错误。有些错误是在具有重要发音的类(如“ XYZPriceCalculator”)中重新产生的不应该打破。但是在解决所有错误之前,我无法启动应用程序来检查其是否正常运行。而且许多单元测试要么直接引用该接口,要么耦合到引用该接口的基类,因此,仅对其进行修复本身就是一项巨大的任务。另外,我真的不知道所有这些部分是如何组合在一起的,因此即使我可以开始学习,但我真的不知道如果事情破裂了会是什么样。 在上一份工作中,我从未真正遇到过这样的问题。我该怎么办?

19
为什么界面有用?
我已经在C#中学习和编码了一段时间了。但是,我仍然不知道接口的用处。他们带来的东西太少了。除了提供功能签名外,它们什么也不做。如果我能记住需要实现的功能的名称和签名,则不需要它们。它们只是为了确保在继承类中实现了所述功能(在接口中)。 C#是一种很棒的语言,但是有时它给您的感觉是,Microsoft首先提出了问题(不允许多重继承),然后提供了解决方案,这是一个乏味的工作。 我的理解是基于有限的编码经验。您对接口有什么看法?您多久使用一次,是什么使您这样做?
158 interfaces 

5
为什么我应该更喜欢合成而不是继承?
我总是读到,与继承相比,组合是首选。一对不同类型的博客文章,例如,提倡使用超过组成继承,但我看不出多态性是如何实现的。 但是我有一种感觉,当人们说喜欢组合时,他们的意思是更喜欢组合和接口实现的组合。您将如何在没有继承的情况下实现多态? 这是我使用继承的具体示例。如何将其更改为使用合成,我将获得什么? Class Shape { string name; public: void getName(); virtual void draw()=0; } Class Circle: public Shape { void draw(/*draw circle*/); }

5
当我们已经有了抽象类时,为什么要将默认方法和静态方法添加到Java 8的接口中?
在Java 8中,接口可以包含已实现的方法,静态方法和所谓的“默认”方法(实现类不需要重写)。 以我的观点(可能是幼稚的),不需要违反这样的接口。接口一直是您必须履行的合同,这是一个非常简单而纯粹的概念。现在,它是几件事情的混合体。在我看来: 静态方法不属于接口。它们属于实用程序类。 根本不应该在接口中允许使用“默认”方法。为此,您可以始终使用抽象类。 简而言之: 在Java 8之前: 您可以使用抽象和常规类来提供静态和默认方法。接口的作用很明显。 接口中的所有方法都应通过实现类来覆盖。 您不能在不修改所有实现的情况下在接口中添加新方法,但这实际上是一件好事。 在Java 8之后: 接口和抽象类之间几乎没有区别(除了多重继承)。实际上,您可以使用接口模拟常规类。 在对实现进行编程时,程序员可能会忘记覆盖默认方法。 如果类试图实现两个或多个具有默认方法且具有相同签名的接口,则会出现编译错误。 通过向接口添加默认方法,每个实现类都会自动继承此行为。这些类中的某些类可能并未在设计时考虑到该新功能,因此可能会引起问题。例如,如果有人将新的默认方法添加default void foo()到interface Ix,则不会编译Cx实现Ix并具有具有foo相同签名的私有方法的类。 进行此类重大更改的主要原因是什么?它们会带来哪些新的好处(如果有)?

15
我们是否应该从一开始就设计代码以启用单元测试?
目前,我们的团队正在争论是否修改代码设计以允许单元测试是代码的味道,或者在什么程度上可以做到而又没有代码的味道。之所以如此,是因为我们只是刚刚开始实施几乎所有其他软件开发公司中都存在的实践。 具体来说,我们将提供一个非常薄的Web API服务。它的主要职责将是整理Web请求/响应并调用包含业务逻辑的基础API。 一个示例是我们计划创建一个将返回身份验证方法类型的工厂。我们不需要它继承一个接口,因为我们不希望它有任何具体类型。但是,要对Web API服务进行单元测试,我们需要模拟该工厂。 从本质上讲,这意味着我们要么设计Web API控制器类以接受DI(通过其构造函数或设置器),这意味着我们正在设计控制器的一部分,只是为了允许DI并实现我们原本不需要的接口,或者我们使用第三方框架(如Ninject)可以避免以这种方式设计控制器,但是我们仍然必须创建一个接口。 团队中的某些人似乎不愿意仅仅为了测试而设计代码。在我看来,如果您希望进行单元测试,则必须做出一些妥协,但是我不确定他们的担忧如何得到缓解。 需要明确的是,这是一个全新的项目,因此,它并不是真正地修改代码以进行单元测试。这是关于将要编写的代码设计为可单元测试的。


7
接口名称是否应该以“ I”前缀开头?
我一直在阅读Robert Martin的“ Clean Code ”,希望成为一个更好的程序员。尽管到目前为止还没有一个真正的突破性进展,但是它使我对我设计应用程序和编写代码的方式有了不同的看法。 我不仅同意书中的一部分,而且对我没有任何意义,特别是关于接口命名约定。这是直接从书中摘录的文字。我将这方面加粗了,我感到困惑,并希望澄清。 我更喜欢不修饰界面。前面的I在当今的一堆旧书中很常见,充其量可以使人分心,而在最坏的情况下则可以提供过多的信息。我不想让用户知道我正在给他们一个接口。 也许是因为我只是一个学生,或者可能是因为我从未做过任何基于专业或团队的编程,但是我希望用户知道它是一个界面。 实现接口和扩展类之间有很大的区别。 因此,我的问题归结为:“为什么我们应该隐藏一部分代码期望接口的事实?” 编辑 回答: 如果您的类型是接口或类是您的业务,而不是使用您的代码的人的业务。因此,您不应在此第三方代码中泄漏代码的详细信息。 我为什么不“泄漏”给定类型是第三方代码的接口还是类的详细信息?对于使用我的代码的第三方开发人员来说,知道他们将要实现接口还是扩展类不是很重要吗?差异是否不如我要记住的那么重要?

7
什么时候在C#中使用抽象类代替具有扩展方法的接口?
“抽象类”和“接口”是相似的概念,其中接口是两者中比较抽象的。一个区别因素是抽象类在需要时为派生类提供方法实现。但是,在C#中,最近引入的扩展方法已减小了这种差异因素,该扩展方法使得可以为接口方法提供实现。另一个区别因素是,一个类只能继承一个抽象类(即没有多重继承),但可以实现多个接口。这使接口的限制更少,更加灵活。因此,在C#中,什么时候应该使用抽象类而不是具有扩展方法的接口? 接口+扩展方法模型的一个著名示例是LINQ,其中为IEnumerable通过多种扩展方法实现的任何类型提供了查询功能。

10
是更好的Show()+ Hide()或SetVisible(bool可见)?
有什么更好的,为什么?(从界面设计的角度来看): a)具有两个Show()和Hide()函数 b)具有一项SetVisible(bool visible)功能 编辑:例如,某些对象具有可见性状态,并且可以使用此功能对其进行更改。 c)向有三个Show(),Hide(),SetVisible(bool visible)功能
59 java  c++  interfaces 

3
为什么C#允许接口中的属性?
在C#中,以下代码有效 interface I{ int property{get;set;} } 这对我来说毫无意义。这似乎打破了接口最重要的原则之一:缺少状态(换句话说,没有字段)。该属性是否不会创建隐式私有字段?这对接口真的不好吗?

9
编程以供将来使用接口
我旁边有一位同事,他设计了这样的界面: public interface IEventGetter { public List<FooType> getFooList(String fooName, Date start, Date end) throws Exception; .... } 问题是,现在,我们在代码中的任何地方都没有使用此“ end”参数,它只是存在,因为将来可能需要使用它。 我们试图说服他,将参数放入当前不使用的接口是一个坏主意,但是他坚持认为,如果我们实现一段时间的“结束”日期使用,则必须做很多工作之后,必须修改所有代码。 现在,我的问题是,是否有任何来源正在处理像“尊敬的”编码专家这样的主题,我们可以将其链接到?

4
Rich Hickey说道:“ [接口/类/类型]的所有特殊性杀死了您的重用!”是什么意思?
在Rich Hickey 在第29分钟发人深省的goto会议主题演讲“ 值的价值 ”中,他谈论的是Java之类的语言的开销,并声明“所有这些接口都会破坏您的重用”。他什么意思?真的吗? 在寻找答案时,我遇到了: 最少知识原则(又称为“德米特定律”)鼓励密闭的API接口。维基百科还列出了一些缺点。 凯夫林·汉尼(Kevlin Henney)的《帝国服装危机》认为,使用而不是重复使用是适当的目标。 杰克·迪埃德里奇(Jack Diederich)的“ 停止写作课 ”演讲反对一般的过度设计。 显然,任何写得不好的东西都是没有用的。但是,编写良好的API的接口将如何阻止使用该代码?整个历史上都有一些例子,出于一种目的制造的东西被更多地用于其他目的。但是在软件世界中,如果您出于某种非预期目的使用某种东西,通常会破坏它。 我正在寻找一个好的界面的良好示例,该界面可以防止对某些代码的合法但无意的使用。是否存在?我无法想象。


11
抽象类/方法过时了吗?
我曾经创建许多抽象类/方法。然后我开始使用接口。 现在,我不确定接口是否不会使抽象类过时。 您需要一个完全抽象的类吗?创建一个接口。您需要一个带有一些实现的抽象类吗?创建一个接口,创建一个类。继承该类,实现接口。另一个好处是某些类可能不需要父类,而只实现接口。 那么,抽象类/方法是否过时了?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.