1
12
使用接口与性能关系不大(除了开发团队的性能,即开发速度)。它更多的是控制依赖关系,并分离程序的不相关部分。 如果您的代码直接依赖于具体的C类,那么该代码就更难进行单元测试。如果您依赖于一个接口,那么在单元测试中创建一个模拟实现就很容易了。 当然,你 可能不需要全班的方法 进入父接口。事实上,你 可能不需要一个单独的父接口 . 分析该类的使用情况,并且(尤其是像您这样的大类)可能会发现两个或更多不同的方法组,由不同的客户机使用(例如,一组客户机只查询对象状态,而另一组客户机则更新对象状态)。这使得创建两个或多个不同的接口成为可能,每个接口都更简单、更清晰。 这种分析甚至可能得出这样的结论:你的班级正在尝试做太多的事情(而不是 single responsibility ,您最好将它的一些内容提取到单独的类中!换句话说,一旦你开始考虑接口和编程,你就开始在不同的层次上看到设计,这可能会导致更好的设计解决方案。 所有这些都说明了,如果在上面所有的分析之后,您仍然发现模型类的接口没有任何用处,那么就记下它。比如说,半年后再看一次。然后, 如果你仍然觉得它没有自己付钱,就把它扔掉吧。 . 接口——就像程序的任何其他元素一样——应该总是 有明确的目标和存在的理由 (比“我的同事让我创造它”更好的一个)。它们不是万能药。如果你聪明地使用它们,你就可以使你的代码更好。如果你愚蠢地使用它们,你的代码会变得更糟。你在这里发布这个问题的事实意味着你想学习如何巧妙地使用它们,这是很好的:—) |
2
4
首先,接口没有任何性能优势。如果有的话,使用多态代码和动态调度(如C++虚拟函数)会带来成本。 不要把界面看作是增加表达能力的东西,而要把它看作是限制你更好地写作的东西。接口很重要,imho,有三个原因: 1) 可以 帮助您编写具有更好封装、数据隐藏、稳定性等功能的代码。 2) 可以 通过思考您试图表示的内容而不是如何实现,帮助您分离行为和实现。不能添加状态对于防止意外添加状态有很大作用。 3)它们允许您在将来扩展内容,并将代码分成独立的单元。每个组件只知道它需要知道的关于其他服务的信息。 您可以使用没有状态的抽象类来完成其中的一些操作,但是接口是专门为此设计的,并且具有多个子类型的好处。在C++中,这样的抽象类经常被用来模拟接口。 现在,如果您可以用类直接编写具有完美封装级别的大型系统,那就太好了。但对于阶级来说,常常有一种诱惑,即过早地引入国家并建立联系。 你应该总是写接口吗?当然不是。总是害怕“总是”的规则:)它总是在浪费的工作和无用的复杂性和好处之间取得平衡。有了时间和经验,你就有了直觉。 此外,头文件本质上是接口文件。它们通常定义允许的行为,但没有状态。如果你学习C,然后学习Java(一些学校这样做),你将学习C中的ADTs,然后使用接口来了解Java中的ADTS。 |
3
4
简要
|
4
3
事实上,使用接口而不是类可以实现以下三点:
|
5
2
使用接口的这个原因对我来说也很奇怪。我不知道怎么会有任何性能优势,如果有,可能完全不重要。 也就是说,即使目前有一个实现,也有一些理由使用接口。稍后扩展或提供替代实现可能更容易。(尽管在任何一个合适的IDE中都有一个提取接口重构。)测试可能要容易得多:如果您想测试一个只通过接口使用其他类的类,那么您可以很容易地为其他类提供模拟对象。 |
6
2
下面有两个链接可以解释您为什么要这样做: http://www.artima.com/lejava/articles/designprinciples.html http://pragmaticjava.blogspot.com/2008/08/program-to-interface-not-implementation.html 它与执行性能无关(更多的是与程序员(您)的性能有关),因为您正在将类的用户从其实现中剥离出来,以及其他一些减轻可测试性和可维护性的事情。
也许今年不会,但明年可能会。 |
7
1
接口在Java中被过度使用,部分原因是语言设计,部分原因是人们认为大量接口是好的设计。 如果Java允许多重继承,抽象类将优于接口。scala是一种新的JVM编程语言,它有一个特性概念,本质上是具有mi功能的抽象类。 抽象类的优点是,您可以向抽象类添加行为,而不必破坏扩展它的现有类。因此,抽象类作为扩展机制(插件)比接口更好。 不幸的是,jmock和它的兄弟们鼓励为BDD测试提供许多接口,但这并不一定是真的,因为至少有两个库来模拟具体的对象。 |
8
0
This question targeted C# 但我认为这也适用。最高投票的答案是为每个类定义一个接口 只是代码噪音 . |
9
0
有一个相对常见的开发原则,即几乎所有东西都应该有一个接口。据我所知,这要么基于一种对“程序到接口,而不是实现”的“货物崇拜”思想(这绝对不要求你到处乱扔接口代码),要么基于使用旧的模拟框架进行测试驱动的开发,而旧的模拟框架不能模拟具体的类。 不要理会这种胡说八道。 |
10
0
还有另一种滥用接口的方法? 使用接口没有明显的性能提升。 相反,它 可以 由于rtti(基于编译器的特性),会对性能产生负面影响。 |
Gabe Tucker · 无法在golang中分配接口对象指针 2 年前 |
randomDud · C#从另一个接口重写接口方法 2 年前 |
evilsushi · C#接口不允许成员类满足要求 6 年前 |