数年以来、常識は、実装に対してではなく、インターフェースに対してプログラムする方が良いと指示しているようです。高レベルのコードの場合、これは確かに論理的であるように見えます。たとえば、アプリケーションに複雑なソルバーがある場合は、次のようなものを使用する方がよいようです。
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
では、インターフェイスの背後に何かを配置する必要があるかどうか、およびインターフェイスの背後に配置するべきでない場合を決定する上で重要な要素はどれですか。