2010-09-27 27 views
4

自从几年以来,常识似乎决定了针对接口而不是针对实现进行编程更好。对于高级代码,这确实是合乎逻辑的,例如,如果我有我的应用程序复杂的解算器,它似乎最好能有这样的事情:模块化:是否使用接口?

ISolver *solver = solverFactory.getSolver(); 
solver->solve(inputdata); 

不是

Solver solver; 
solver.solve(inputdata); 

在第一个代码,也更容易嘲笑求解,从而,进行单元测试。

但我的问题是:在哪个级别使用接口不再有意义。例如。如果我有新建一个ComplexNumber类(或String类,或者别的什么)在我的应用程序,然后写这样的:

IComplexNumber *complexNumber = complexNumberFactory.create(1,2); // 1+2i 

似乎更复杂(特别是关于性能)比写作:

ComplexNumber complexNumber(1,2); // 1+2i 

所以,哪些元素在决定是否应将某些内容放在界面后面以及何时不应将其放在界面之后非常重要?

回答

3

移动到界面的原因是它使事情变得更简单或减少了耦合。 (这是一个接口是什么)。

离开界面的理由是如果它让事情变得更加复杂或者杀死性能(但是确定的配置文件)。我认为你的IComplexNumber类实际上使得类的层次更加复杂,除非你引入了MockComplexNumber,但是我怀疑这样的类会是有用的......它可能会让事情变慢,但是我会测量。

但是,不要以为你需要以单向方式做所有事情,或者你的决定是固定的。使用接口转换/转换非常容易。

-2

使用C++它并不重要,因为C++具有多重继承,因此接口是可以添加实现的抽象类。我发现最常用的接口是Java和C#,它们具有单一继承,如果你想要一个类来实现几件事情,那么只有一个可以是抽象类,其他接口必须是接口

+0

原因1:编写可测试的代码,你应该能够使用mockobject创建单元测试,模拟对象只是实现了你的实际模块的一些接口。 原因2:你应该能够让你的代码尽可能抽象。有时候,除了功能之外,对于这个类什么都不了解,可以说你有一个客户端,你不知道客户端是一个网络/ TCP客户端,还是一个http进程客户端,它通过管道或其他你刚才知道的其他东西进行交互主要界面,连接方式,断开连接,sendData ... – AlexTheo 2012-02-01 13:36:24

+0

它不依赖于语言,只要看看战略,访客模式为例。 – AlexTheo 2012-02-01 13:39:18

+0

@Alex你仍然可以从抽象类创建模拟对象,不必是一个接口 – Mark 2012-12-13 11:35:04

1

如果你将类分成“服务”和“价值”类,这取决于他们扮演的角色,那么答案很简单。仅在服务类中使用接口。在你的问题中,“解决者”是一种服务,“复数”是一种价值。

值类应该很容易使用new()创建,因为它们只接受构造函数中的基本类型和其他值类。价值类对模拟没有用处,因为你可以使用真实的东西。

模拟服务类可能很有用,并且您可能需要多个实现。你的solverFactory可以返回一个天真的解析器,查找解析器,遗传解析器,模拟解析器等等。这里的接口是有用的。