回答編集履歴
2
update
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
> パターン2とパターン3はDI(依存性の注入)と呼ばれるパターンなのだと思います。
|
2
2
|
|
3
|
-
「コンストラクタ・インジェクション」と呼ばれるDIパターン
|
3
|
+
構造的には「コンストラクタ・インジェクション」と呼ばれるDIパターンにみえますね。(ただし、後述する理由によりこれらをDIとは呼べない気がしますが)
|
4
4
|
|
5
5
|
> (1)以下のようなコードの場合はどのパターンがより適しているでしょうか?
|
6
6
|
|
1
refine
answer
CHANGED
@@ -6,8 +6,10 @@
|
|
6
6
|
|
7
7
|
個人的にはパターン1で十分だと思います。というより、質問中のサンプルコード/クラス設計ではDIを導入する意味が無いと考えます。
|
8
8
|
|
9
|
-
円(`Circle`)オブジェクトにとって中心位置や半径という属性は、そのオブジェクトの本質をなす直接的な構成要素です。それらを外部から注入するという設計には違和感があります。また位置(`Point`,`Cordinate`)や長さ(`Length`)を表す型を導入していますが、これらは型安全性のために導入されるものであり、DIで用いるインターフェイス継承とは役割が異なっています。
|
9
|
+
円(`Circle`)オブジェクトにとって中心位置や半径という属性は、そのオブジェクトの本質をなす直接的な構成要素です。それらを外部から注入するという設計には違和感があります。また位置(`Point`,`Cordinate`)や長さ(`Length`)を表す型を導入していますが、これらは型安全性(単位系の区別)のために導入されるものであり、DIで用いるインターフェイス継承とは役割が異なっています。
|
10
10
|
|
11
11
|
> (2)どういうオブジェクトを、またはどういうシチュエーションではDIをすべきなのでしょうか?
|
12
12
|
|
13
|
-
関連するソフトウェア・コンポーネント(クラス)にて、あるクラスの内部実装では
|
13
|
+
関連するソフトウェア・コンポーネント(クラス)にて、あるクラスの内部実装では他方の **インターフェイスにのみ依存** するよう実装し、そのインターフェイスを継承/実装した **具象クラスを外部から注入する** パターンがDIだと思います。
|
14
|
+
|
15
|
+
こういった「**インターフェイスと実装の分離**」が不可能なクラスにはDIを適用できません(質問中の例が該当)。また、DIによりソフトウェア・コンポーネント実装同士をより疎結合にできますが、過度な疎結合アーキテクチャはメンテナンスコストが増大します。どこまでをDI適用により疎結合にするかは、対象アプリケーションが解決すべき課題次第かと思います。
|