Seit ein paar Jahren scheint der gesunde Menschenverstand zu diktieren, dass es besser ist, gegen Schnittstellen zu programmieren als gegen Implementierungen. Für High-Level-Code scheint dies in der Tat logisch zu sein. Wenn ich z.B. einen komplexen Solver in meiner Anwendung habe, scheint es besser zu sein, so etwas wie das hier zu haben:
ISolver *solver = solverFactory.getSolver();
solver->solve(inputdata);
Anstatt
Solver solver;
solver.solve(inputdata);
Im ersten Code ist es auch einfacher, den Solver zu mocken und somit einen Unit-Test durchzuführen.
Aber meine Frage ist: auf welcher Ebene macht es keinen Sinn mehr, Schnittstelle zu verwenden. Wenn ich z.B. eine ComplexNumber Klasse (oder String Klasse, oder was auch immer) in meiner Anwendung habe, dann schreibe ich dies:
IComplexNumber *complexNumber = complexNumberFactory.create(1,2); // 1+2i
Es scheint viel komplexer zu sein (vor allem hinsichtlich der Leistung) als das Schreiben:
ComplexNumber complexNumber(1,2); // 1+2i
Welche Elemente sind also wichtig, um zu entscheiden, ob etwas hinter eine Schnittstelle gestellt werden sollte und wann es nicht hinter eine Schnittstelle gestellt werden sollte?