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

回答編集履歴

3

文章の表現変更

2018/05/16 19:10

投稿

Hiroshi-Aoki
Hiroshi-Aoki

スコア804

answer CHANGED
@@ -10,6 +10,6 @@
10
10
  DIの場合、DIコンテナに本来のBを登録するか、モックのBを登録するかで、Aのソースを編集することなくAが使用するBを切り替えることが可能になります。Aは本来のAのまま、テスト後に編集されることもありません。DIを活用することで、AはBの完成を待つ必要から解放されます。
11
11
 
12
12
  **DIを使うことのメリットについて**
13
- DIは、その仕組み上、インターフェイスとデフォルトコンストラクタを求めます。これによってクラスのカプセル化はより高度化されること結果となりました。これにより、想定外のパラメータの発生リスクが最小化され、AもBもより堅牢なプログラムとなり。アノテーションによる定義、設定ファイルの定義からの解放を促し、人の作業によるバグの発生の可能性の低減に寄与しています。
13
+ DIは、その仕組み上、インターフェイスとデフォルトコンストラクタを求めます。これによってクラスのカプセル化はより高度化されること結果となりました。想定外のパラメータの発生リスクが最小化され、よりシンルにジックの実装のみ記載可能となり、バグ発生の確率低減にも寄与ますさらにアノテーションによる定義により、設定ファイルの定義からの解放を促し、こちらもまたバグの発生確率の低減に繋がっています。
14
14
 
15
15
  DIの内部構造を知ることも理解が深まると思います。[こちら](http://d.hatena.ne.jp/nowokay/20160406)でDIの仕組みについて実装体験をするのも良いかもしれません。仕組みを知ることでSpringBootの理解の援けにもなろうかと思います。

2

段落修正

2018/05/16 19:10

投稿

Hiroshi-Aoki
Hiroshi-Aoki

スコア804

answer CHANGED
@@ -5,8 +5,7 @@
5
5
  DIの場合、Bのプロパティはそれ自体がDIによって注入される(することができる)ようになるので、引数付きのコンストラクタは必要なくなり、引数なしのデフォルトコンストラクタのみになります。これと同時に、Aはx, y, zを知る必要がなくなり、AはBとの依存関係から解放されます。
6
6
 
7
7
  **「BができるまでAのテストができない」について**
8
- Aをテストするにあたり、Bをモックにするとします。
9
- BはモックであってBではなく、BはBで作成している最中なので同じクラス名を使うことができません。この時BのモックはBMockのような名前だったり、パッケージを変える形でテストをすることになります。結果、Aはテスト用のソースコードになります。
8
+ Aをテストするにあたり、Bをモックにするとします。BはモックであってBではなく、BはBで作成している最中なので同じクラス名を使うことができません。この時BのモックはBMockのような名前だったり、パッケージを変える形でテストをすることになります。結果、Aはテスト用のソースコードになります。
10
9
  一見問題なさそうに思いますが、Aは本来のAのソースコードではなくテスト用の別物と言えます。テスト用のAはAであってAでないわけです。テスト後、テスト用のAは本来のA形に編集されることになります。この時の編集でミスがあればテストの意義は著しく低下します。こうしたことを避けるためAを編集しない形でテストすることにすれば、すなわちBの完成を待つことになるのです。
11
10
  DIの場合、DIコンテナに本来のBを登録するか、モックのBを登録するかで、Aのソースを編集することなくAが使用するBを切り替えることが可能になります。Aは本来のAのまま、テスト後に編集されることもありません。DIを活用することで、AはBの完成を待つ必要から解放されます。
12
11
 

1

上手く登録されなかったので修正

2018/05/16 19:06

投稿

Hiroshi-Aoki
Hiroshi-Aoki

スコア804

answer CHANGED
@@ -1,11 +1,16 @@
1
- DIを使うとnewから解放されます。
1
+ DIを使うでソースコードの記述がクラスの依存関係から解放されます。
2
2
 
3
3
  **「Aクラスの中でBクラスをnewするとAはBに依存している」について**
4
- AクラスがBクラスを使う時、「Aクラスは、Bクラスをnewできなければならない」ですよね。Bクラスにはプロパティがあり、インスタンスが発生すると同時に初期化される必要があるとすると、初期化するのに必要な値は、コンストラクタで new B(x, y, z) なりすることになりますね。Aクラスはこの時の x, y, zの値をBに渡してあげなければならないわけです。
5
- つまり、AはBを使うためにBを使えるようにしなければならないという依存関係があるわけです。DIの場合、Bのプロパティはそれ自体がDIによって注入される(することができる)ようになるので、引数付きのコンストラクタは必要なくなり、引数なしのデフォルトコンストラクタのみになります。これと同時に、Aはx, y, zを知る必要がなくなり、AはBとの依存関係から解放されます。
4
+ AクラスがBクラスを使う時、「Aクラスは、Bクラスをnewできなければならない」ですよね。Bクラスにはプロパティがあり、インスタンスが発生すると同時に初期化される必要があるとすると、初期化するのに必要な値は、コンストラクタで new B(x, y, z) なりすることになりますね。Aクラスはこの時の x, y, zの値をBに渡してあげなければならないわけです。つまり、AはBを使うためにBを使えるようにしなければならないという依存関係があるわけです。
5
+ DIの場合、Bのプロパティはそれ自体がDIによって注入される(することができる)ようになるので、引数付きのコンストラクタは必要なくなり、引数なしのデフォルトコンストラクタのみになります。これと同時に、Aはx, y, zを知る必要がなくなり、AはBとの依存関係から解放されます。
6
6
 
7
- **「BができるまでAのテストができない」に**
7
+ **「BができるまでAのテストができない」について**
8
8
  Aをテストするにあたり、Bをモックにするとします。
9
9
  BはモックであってBではなく、BはBで作成している最中なので同じクラス名を使うことができません。この時BのモックはBMockのような名前だったり、パッケージを変える形でテストをすることになります。結果、Aはテスト用のソースコードになります。
10
- 一見問題なさそうに思いますが、Aは本来のAのソースコードではなくテスト用の別物と言えます。テスト用のAはAであってAでないわけです。テスト後、テスト用のAは本来のAに編集されることになります。この時の編集でミスがあればテストの意義は著しく低下します。こうしたことを避けるため十分な条件満たそうとすれば、すなわちBの完成を待つことになるのです。
10
+ 一見問題なさそうに思いますが、Aは本来のAのソースコードではなくテスト用の別物と言えます。テスト用のAはAであってAでないわけです。テスト後、テスト用のAは本来のAに編集されることになります。この時の編集でミスがあればテストの意義は著しく低下します。こうしたことを避けるためA編集しない形でテストするこすれば、すなわちBの完成を待つことになるのです。
11
- DIの場合、DIコンテナに本来のBを登録するか、モックのBを登録するかで、Aのソースを編集することなくAが使用するBを切り替えることが可能になります。Aは本来のAのまま、テスト後に編集されることもありません。DIを活用することで、AはBの完成を待つ必要から解放されます。
11
+ DIの場合、DIコンテナに本来のBを登録するか、モックのBを登録するかで、Aのソースを編集することなくAが使用するBを切り替えることが可能になります。Aは本来のAのまま、テスト後に編集されることもありません。DIを活用することで、AはBの完成を待つ必要から解放されます。
12
+
13
+ **DIを使うことのメリットについて**
14
+ DIは、その仕組み上、インターフェイスとデフォルトコンストラクタを求めます。これによってクラスのカプセル化はより高度化されること結果となりました。これにより、想定外のパラメータの発生リスクが最小化され、AもBもより堅牢なプログラムとなりました。アノテーションによる定義は、設定ファイルの定義からの解放を促し、人の作業によるバグの発生の可能性の低減に寄与しています。
15
+
16
+ DIの内部構造を知ることも理解が深まると思います。[こちら](http://d.hatena.ne.jp/nowokay/20160406)でDIの仕組みについて実装体験をするのも良いかもしれません。仕組みを知ることでSpringBootの理解の援けにもなろうかと思います。