Gang of Fourに依存性注入パターンが含まれていなかったのはなぜですか?


37

なぜ依存関係の注入パターンが4人ギャングに含まれていなかったのですか?GOFは広範囲に及ぶ自動テストに先行していたのですか?依存性注入は現在、コアパターンと見なされていますか?


18
..「依存性注入」はパターンで
ディパンメタ


14
繰り返されるすべてのものが繰り返しのパターンを形成します。 すべてのデザイン要素(ユニークでおかしなアイデアではありません)は「パターン」です。
S.Lott

3
これらの長い応答は、おそらく質問を検証するため、誤解を招く可能性があります。前述のように、依存性注入は設計パターンではありません。通常、フレームワークによって処理される、オブジェクトのインスタンス化の「メカニズム」です。
ナザールメルザ

1
依存性注入はパターンです。Service Locatorパターンに反対します。この用語を生み出したファウラーを読んでください。こんなにナンセンスなことをどれほど多くの人が支持していたか、私にはまったくわからない。
ジェームズ

回答:


101

Gang of Fourの本が出版されたとき、私はSoftware Development誌の編集者でしたが、Design Patternsが最初に発行された1994年には、ユニットテストは広く行われていなかったと確信できます。

1994年、C ++は最も一般的に使用されるオブジェクト指向言語であり、C ++をプログラミングするほとんどの人はCのバックグラウンドから来ていました。人々が単に持っていなかった「オブジェクトを考える」ことの1つは、プログラムへの数百または数千のエントリポイントのアイデアです。あなたはについて考えましたmain()。大規模なプロジェクトに取り組んでいる場合は、モジュールベースのプログラムを作成するための(通常はかなり複雑な)メイクファイルが必要になる場合があります。しかし、「単体テスト」ですか?メソッドごとにプロセスを開始し、必要なメモリコンテキストを構築し、実行し、破棄しますか?それは非常に急進的でした。

Javaは、複数エントリポイントプログラミングをより明確にしました。元のDot-Comブームの頃には、ユニットテストはよく知られた手法でしたが、実際にJUnit(2001年頃?)に火がつき、普遍的なプラクティスになりました。

戦略およびインタフェースにプログラミングの一般的な概念は、GoFのの一部であったと90年代半ばには時代精神のアイデア注入はパーティーにかなり遅れて来ました('03 -'05年頃?)。正直なところ、私の白髪はまだDIのその側面についてかなり疑わしいです(「芝生を下ろしてください、構成ファイルを見てください!」)。


17
このような洞察に満ちた答えを与えるための賛成票が1つだけであることを後悔しています。

@Larry OBrien:コンベンションベースの登録をスキャンすると、構成コードが大幅に簡素化され、IOCコンテナーのxml構成が実質的に排除されます。
クエンティン・スターリン

4
依存関係の注入をコアに追加し、構成ファイルにまったく依存しないようにします。すべて手作業で行うことができるため、非常に使いやすく、非常に柔軟なアプローチです。
marco-fiset

31

彼らはそれを戦略と呼んだ。

彼らの戦略には、複雑に聞こえる名前のない依存性注入のすべての機能があるようです。


16
-1。ごめんなさい!戦略パターンは、依存性注入とは関係ありません。
ディパンメタ


14
@Dipan:これに賛成票を投じる前に、5分間の答えを考えましょう。
ドックブラウン

6
依存性注入は戦略パターンに非常に似ていると考えることができるのは事実ですが、人々が依存性注入と言うときは通常、制御の反転を意味します。
MattDavey

8
DIは創造的なパターンです。戦略を作成して注入します。戦略だと言うのは真実の半分にすぎません。DIは、よりマイクロカーネルパターンです!人々がこれを支持しているとは信じられません。戦略は、必要ではなく、良いDIの特性に似ています。
ファルコン

0

階層で実装を分離する場合、依存性注入がより適切であると思います。依存性注入について考えるもう1つの領域は、単体テストです。そして、あなたの以前の提案は正しいようです。ギャングが2012年にパターンを収集して分離した場合、間違いなく依存性注入が行われます。

戦略は議論の中で登場する可能性がありますが、戦略は依存性注入については話しません。しかし、単一のプロジェクトまたはdll(すべてのクラスとインターフェースが1つのプロジェクトに残る)で戦略パターンを使用すると、依存性注入を行っているように見えます。実際、私たちはそうではありません。

現在、戦略パターンで言及されているクラスとインターフェースが異なるプロジェクトまたは層で分離されている場合、WEは依存性注入技術を使用する必要があります。単一の構成ファイルを使用できます(ただし、ランタイムの変更はできません)。しかし、戦略パターンは、依存関係を注入する方法を示していません。

依存性注入によく似たパターンがある場合、それは抽象ファクトリメソッドパターンです。このパターンは、依存関係を注入するために戦略パターン内で使用できます。


2
これは質問に答えません。他の回答に返信するのではなく、元の質問を読んでください:)
Andres F.

-4

答えの戦略は100%正しいです。私は賛成票を投じましたが、コメントすることができます。

「戦略により、アルゴリズムはそれを使用するクライアントとは独立して変化します。

設計パターンは、その使用に依存しません。依存性注入は、戦略パターンを使用して実装されます。ユースケースに基づいて各パターンに名前を付ける場合、多くのパターンの名前を変更する必要があります。

リポジトリパターンは新しいパターンではなく、テンプレートパターンです。

「この設計パターンのテンプレートメソッドでは、1つまたは複数のアルゴリズムステップをサブクラスでオーバーライドして、異なる動作を許可しながら、包括的なアルゴリズムが引き続き実行されるようにすることができます。」

多くの場合、パターンは、MVCパターンなどの複数のパターンを組み合わせて名前を付けたものです。

GOFには、使用されているPure Abstractクラスのインターフェースがなく、複数のクラスから継承するC ++の機能も利用していました。


1
パターンの目的は、区別する上で絶対に重要です。GoFパターンの中では、アダプタとプロキシが良い例です。それらは同じ形式ですが、目的が異なります。DIはStrategyを使用して実装されているというあなたの主張にも同意しません。ストラテジーは、目的と構成されたオブジェクトの使用方法がより具体的であるため、ストラテジーはDIで実装されていると言う方が合理的です。
ジュール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.