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

回答編集履歴

4

追記

2021/07/26 11:50

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -48,6 +48,8 @@
48
48
 
49
49
  しかし、このコードの問題点は、`Player`クラスが`SilverBullet`など別の弾丸を持ちたいときに問題があります。
50
50
 
51
+ この場合は`Player`のコンストラクタを作成し、`IBullet`型のインスタンスを引数に含め、`Bullet`プロパティを初期化することで`LeadBullet`に依存しなくなります。
52
+
51
53
  ### 適応例
52
54
 
53
55
  下記は`IHIT`を削除し、インタフェースに定義するものを整理し、依存性の注入を使ったコードです。

3

コード修正

2021/07/26 11:50

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -41,7 +41,7 @@
41
41
 
42
42
  public void ShootBullet(IEnemy target)
43
43
  {
44
- target.GetShotBy(bullet);
44
+ target.GetShotBy(Bullet);
45
45
  }
46
46
  }
47
47
  ```
@@ -78,7 +78,7 @@
78
78
 
79
79
  public void ShootBullet(IEnemy target)
80
80
  {
81
- target.GetShotBy(bullet);
81
+ target.GetShotBy(Bullet);
82
82
  }
83
83
  }
84
84
 

2

文章の修正

2021/07/26 11:47

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -2,9 +2,10 @@
2
2
 
3
3
  インターフェースを使って依存性逆転の法則を守ったり依存性の注入をしたりすることと、内部クラスを持つことは切り離して考えましょう。(そもそも内部クラスが必要になる場面は多くありません)
4
4
 
5
- そもそも、インターフェースを使ったり、依存性逆転の法則、依存性の注入をしたりすることの目的は整理できているでしょうか。
5
+ そもそも、インターフェースを使ったり、依存性逆転の法則、依存性の注入をしたりすることの目的は整理できているでしょうか。1つは、機能追加・修正をしやすいコードを書くためです。
6
6
 
7
- 1つは、機能追加・修正しやいコードを書くためです。
7
+ ### 命名見直
8
+
8
9
  機能追加・修正をしやすいコードを書くためには、まずはクラスやプロパティ・メソッドに適切な名前をつけることです。
9
10
 
10
11
  `IEnemies`,`IBullets`という名前は、単数形ではなく複数形です。ですが、それ等が持つプロパティは明らかに単数形です。この時点で名前が名前の役割を果たしていないので、機能追加・修正をしにくいコードになっています。
@@ -25,6 +26,8 @@
25
26
  Hitとは、受動態であってもなくとも英語のスペルはHitのままなので、私ならその動詞は使わないと思います。
26
27
  もしHitが「プレイヤーが敵にダメージを与えること」を指しているのであれば、プレイヤーにHit相当のメソッドをもたせると思います。もしくは`IShootable`のようなインタフェースを作り、`Player`クラスに実装するかもしれません。
27
28
 
29
+ ### 依存性の注入
30
+
28
31
  依存性の注入を使うメリットは外部で作成したインスタンスを取得し、利用できることです。
29
32
  `Player`クラスが`IBullet`型のプロパティを持つことにより、特定の`Bullet`クラスに依存しないコードを書けます。
30
33
 
@@ -45,6 +48,8 @@
45
48
 
46
49
  しかし、このコードの問題点は、`Player`クラスが`SilverBullet`など別の弾丸を持ちたいときに問題があります。
47
50
 
51
+ ### 適応例
52
+
48
53
  下記は`IHIT`を削除し、インタフェースに定義するものを整理し、依存性の注入を使ったコードです。
49
54
 
50
55
  ```C#

1

文章の修正

2021/07/26 11:43

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  すでに解決済みですが、回答を途中まで書いていたので残します。
2
2
 
3
- インターフェースを使って依存性逆転の法則を守ったり依存性の注入をしたりすることと、内部クラスを持つことは関係はありません
3
+ インターフェースを使って依存性逆転の法則を守ったり依存性の注入をしたりすることと、内部クラスを持つことは切り離して考えましょう。(そもそも内部クラスが必要になる場面多くありません
4
4
 
5
5
  そもそも、インターフェースを使ったり、依存性逆転の法則、依存性の注入をしたりすることの目的は整理できているでしょうか。
6
6
 
@@ -18,12 +18,12 @@
18
18
  }
19
19
  ```
20
20
 
21
- `IHIT`もインタフェースで使う名前としては不適切です。なぜならHitとは物を指すものではなく振る舞いを示すものだからです。
21
+ `IHIT`もインタフェースで使う名前としては不適切です。なぜならHitとは物ではなく振る舞いを示すものだからです。
22
22
 
23
23
  そしてHitとは、プレイヤーが敵にダメージを与えることを指しているのか、プレイヤーが敵からのダメージを受けることを指しているのかが名前からわかりません。
24
24
 
25
25
  Hitとは、受動態であってもなくとも英語のスペルはHitのままなので、私ならその動詞は使わないと思います。
26
- もしHitが「プレイヤーが敵にダメージを与えること」を指しているのであれば、プレイヤーにHit相当のメソッドをもたせると思います。
26
+ もしHitが「プレイヤーが敵にダメージを与えること」を指しているのであれば、プレイヤーにHit相当のメソッドをもたせると思います。もしくは`IShootable`のようなインタフェースを作り、`Player`クラスに実装するかもしれません。
27
27
 
28
28
  依存性の注入を使うメリットは外部で作成したインスタンスを取得し、利用できることです。
29
29
  `Player`クラスが`IBullet`型のプロパティを持つことにより、特定の`Bullet`クラスに依存しないコードを書けます。