依存性注入とは何かChatGPTに聞いてみた
依存性注入(Dependency Injection)は、ソフトウェアエンジニアリングにおける設計原則の一つであり、特定のコンポーネントが他のコンポーネントに依存しないようにするための手法。具体的には、あるオブジェクトが他のオブジェクトを直接生成せずに、外部から提供されることでそのオブジェクトの依存関係を明示的にすること。
目的
1. 結合度の低減
クラス間の依存関係を減らし、各クラスを独立して変更やテストができるようにする。
2. 柔軟性の向上
依存性注入を使用することで、異なる実装のオブジェクトを簡単に交換することができ、システム全体の柔軟性が向上する。
3. テスト容易性の向上
外部から依存オブジェクトを注入することで、ユニットテストやモックテストが容易になる。
ChatGPTの回答を見て
結局コードで書くとどうなるのかが分からなく、言葉の意味も理解することが難しい
主に保守やテストで作りやすくなるといった目的はなんとなく把握することはできた
実装してみよう
CarクラスとEngineクラスを用意
車はエンジンがないと動かないので、CarクラスはEngineクラスに依存しているという想定で実装
依存性注入を使った実装
public class Engine() {
public void start() {
System.out.println("Engine started");
}
}
public class Car() {
private Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
public void start() {
engine.start();
System.out.println("Car started");
}
}
public static void main(String[] args) {
Engine engine = new Engine();
Car car = new Car(engine);
car.start();
}
依存性注入を使わない実装
public class Engine() {
public void start() {
System.out.println("Engine started");
}
}
public class Car() {
// 違うポイントはコンストラクタ
public Car() {
this.engine = new Engine();
}
public void start() {
engine.start();
System.out.println("Car started");
}
}
public static void main(String[] args) {
Car car = new Car(engine);
car.start();
}
依存性注入(DI)の実装とそうでない実装の差分
依存性注入(DI)の実装はCarクラスのコンストラクタの引数にEngineクラスを定義して、Carクラスを呼び出す際には、Engineクラスを設定する必要がある
依存性注入を使わない実装はCarクラスのコンストラクタでEnginクラスを生成している
これがChatGPTが言っていた
あるオブジェクトが他のオブジェクトを直接生成せずに、外部から提供されることでそのオブジェクトの依存関係を明示的にすること。
ということだと思う
思ったこと
依存性注入は外部からコンストラクタでの引数や他メソッドでの引数での設定でも良さそう
外部から提供されるというのは、使うクラス側でインスタンス生成されているかどうかということ
今後の課題
依存性注入(DI)を使ってテストコードの実装し、使うメリットとかを試してみる