Уже через несколько лет здравый смысл подсказывает, что лучше программировать против интерфейсов, чем против реализаций. Для кода высокого уровня это действительно кажется логичным, например, если у меня есть комплексный решатель в моем приложении, кажется, лучше иметь что-то вроде этого:
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
Итак, какие элементы важны при принятии решения, следует ли что-то размещать за интерфейсом, а когда - за интерфейсом?