几年以来,常识似乎表明最好针对接口进行编程而不是针对实现进行编程。对于高级代码,这确实看起来合乎逻辑,例如,如果我的应用程序中有一个复杂的求解器,最好有这样的东西:
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
那么,哪些元素在决定是否应该将某些东西放在接口后面以及什么时候不应该放在接口后面时很重要?