オブジェクト指向プログラミング、スタイルルール、およびその他すべてについてよくある基本的な問題。非常に一般的ですが、実際には、あまりに多くの抽象化を実行し、あまりにも多くの間接化を追加し、一般に優れた手法を過度に、間違った場所に適用する可能性があります。
適用するすべてのパターンまたはその他の構成は複雑になります。抽象化と間接化は情報を分散させ、時には無関係な詳細を邪魔にならないようにしますが、同じように時々何が起こっているのか正確に理解することを難しくします。適用するすべてのルールは柔軟性に欠け、最適なアプローチである可能性があるオプションを除外します。
ポイントは、その仕事を行い、堅牢で、読みやすく、保守可能なコードを書くことです。あなたはソフトウェア開発者であり、象牙の塔ビルダーではありません。
関連リンク
http://thedailywtf.com/Articles/The_Inner-Platform_Effect.aspx
http://www.joelonsoftware.com/articles/fog0000000018.html
おそらく、最も単純な依存性注入の形式(笑わないでください)がパラメーターです。依存コードはデータに依存しており、そのデータはパラメーターを渡すことによって注入されます。
はい、それはばかげているし、依存性注入のオブジェクト指向のポイントに対処していませんが、関数型プログラマーは(ファーストクラスの関数がある場合)これが必要な唯一の種類の依存性注入であることを教えてくれます。ここでのポイントは、些細な例を取り、潜在的な問題を示すことです。
この単純な従来の関数を見てみましょう-C ++構文はここでは重要ではありませんが、なんとかして綴る必要があります...
void Say_Hello_World ()
{
std::cout << "Hello World" << std::endl;
}
「Hello World」というテキストを抽出して挿入したい依存関係があります。簡単です...
void Say_Something (const char *p_text)
{
std::cout << p_text << std::endl;
}
それはオリジナルよりもどのように柔軟性がないのですか?さて、もし出力がユニコードであるべきだと決めたらどうなるでしょう。おそらくstd :: coutからstd :: wcoutに切り替えたいと思います。しかし、それは私の文字列がcharではなくwchar_tでなければならないことを意味します。すべての呼び出し元を変更する必要があるか、または(より合理的に)古い実装が文字列を変換して新しい実装を呼び出すアダプターに置き換えられます。
それは、私たちがオリジナルを維持していれば必要のない、その場でのメンテナンス作業です。
そして、それが取るに足りないと思われる場合は、Win32 APIからこの実際の関数を見てください...
http://msdn.microsoft.com/en-us/library/ms632680%28v=vs.85%29.aspx
これは、対処する12の「依存関係」です。たとえば、画面解像度が非常に大きくなる場合は、64ビットの座標値と、CreateWindowExの別のバージョンが必要になる可能性があります。そしてはい、古いバージョンがまだぶら下がっていて、おそらく裏側で新しいバージョンにマッピングされています...
http://msdn.microsoft.com/en-us/library/ms632679%28v=vs.85%29.aspx
これらの「依存関係」は、元の開発者にとって単なる問題ではありません。そのインターフェースを使用するすべての人は、依存関係の内容、指定方法、意味を調べ、アプリケーションに対して何をすべきかを考えなければなりません。これは、「賢明なデフォルト」という言葉が人生をより単純にすることができる場所です。
オブジェクト指向の依存性注入は、原則として同じです。クラスの作成はソースコードテキストと開発者時間の両方でオーバーヘッドであり、そのクラスが依存オブジェクトの仕様に従って依存関係を提供するように作成されている場合、依存オブジェクトは、必要がある場合でもそのインターフェイスをサポートするようにロックされます。そのオブジェクトの実装を置き換える。
これは、依存性注入が悪いと主張していると読むべきではありません。しかし、どんな良いテクニックでも、過度に間違った場所に適用される可能性があります。すべての文字列を抽出してパラメータに変換する必要があるわけではないのと同様に、すべての低レベルの動作を高レベルのオブジェクトから抽出して注入可能な依存関係に変換する必要があるわけではありません。