自从几年以来,常识似乎决定了针对接口而不是针对实现进行编程更好。对于高级代码,这确实是合乎逻辑的,例如,如果我有我的应用程序复杂的解算器,它似乎最好能有这样的事情:模块化:是否使用接口?
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
所以,哪些元素在决定是否应将某些内容放在界面后面以及何时不应将其放在界面之后非常重要?
原因1:编写可测试的代码,你应该能够使用mockobject创建单元测试,模拟对象只是实现了你的实际模块的一些接口。 原因2:你应该能够让你的代码尽可能抽象。有时候,除了功能之外,对于这个类什么都不了解,可以说你有一个客户端,你不知道客户端是一个网络/ TCP客户端,还是一个http进程客户端,它通过管道或其他你刚才知道的其他东西进行交互主要界面,连接方式,断开连接,sendData ... – AlexTheo 2012-02-01 13:36:24
它不依赖于语言,只要看看战略,访客模式为例。 – AlexTheo 2012-02-01 13:39:18
@Alex你仍然可以从抽象类创建模拟对象,不必是一个接口 – Mark 2012-12-13 11:35:04