質問するログイン新規登録

回答編集履歴

2

update

2016/08/15 03:01

投稿

yohhoy
yohhoy

スコア6191

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

2016/08/15 03:01

投稿

yohhoy
yohhoy

スコア6191

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
- 関連するソフトウェア・コンポーネント(クラス)にて、あるクラスの内部実装では 他方の **インターフェイスにのみ依存** するよう実装し、そのインターフェイスを継承/実装した **具象クラスを外部から注入する** パターンがDIだと思います。こういったインターフェイスと実装の分離が不可能なクラスにはDIを適用できません。また、DIによりソフトウェア・コンポーネント実装同士より疎結合にできますが、過度な疎結合アーキテクチャはメンテナンスコストが増大します。どこまでをDI適用により疎結合にするかは、対象アプリケーションが解決する課題次第かと思います。
13
+ 関連するソフトウェア・コンポーネント(クラス)にて、あるクラスの内部実装では他方の **インターフェイスにのみ依存** するよう実装し、そのインターフェイスを継承/実装した **具象クラスを外部から注入する** パターンがDIだと思います。
14
+
15
+ こういった「**インターフェイスと実装の分離**」が不可能なクラスにはDIを適用できません(質問中の例が該当)。また、DIによりソフトウェア・コンポーネント実装同士をより疎結合にできますが、過度な疎結合アーキテクチャはメンテナンスコストが増大します。どこまでをDI適用により疎結合にするかは、対象アプリケーションが解決すべき課題次第かと思います。