DIを使わないプログラムの例
では、DIっていうのが一体どういう働きをするのか、実際に簡単なサンプルを作って確かめてみることにしましょう。まずは、「DIを使わない方法」からです。ここでは、ごく単純な計算をするクラスを定義して、それをプログラムから利用してみることにします。
※計算クラス――MyCalc.java
package jp.tuyano;
public class MyCalc {
private int[] data = null;
public int[] getData() {
return this.data;
}
public void setData(int[] data) {
this.data = data;
}
public int getAnswer() {
int total = 0;
for(int n : data)
total += n;
return total;
}
public String getResult() {
int n = this.getAnswer();
return "total is '" + n + "'. ok?";
}
}
※アプリケーションクラス――Main.java
package jp.tuyano;
public class Main {
public static void main(String[] args) {
int[] data = new int[args.length];
for(int i = 0;i < data.length;i++){
try {
data[i] = Integer.parseInt(args[i]);
} catch (NumberFormatException e) {
data[i] = 0;
}
}
MyCalc calc = new MyCalc();
calc.setData(data);
System.out.println(calc.getResult());
}
}
プログラムを実行する。あらかじめ引数でいくつかの整数を渡して実行すると、その合計が計算され表示される。 |
プログラム実行時に引数として整数をいくつか渡しておくと、それらを合計します。実行の際の引数として、<実行><構成および実行>メニューを選び、Javaアプリケーションの構成を新たに作成して、「引数」タブの「プログラムの引数」にいくつかの整数を追加してから実行してください。
構成の作成、管理、および実行ウインドウで、実行時の引数を指定しておく。 |
わかりやすいように、MyCalcでは1つ1つの処理を分けてあります。計算の元になるデータ(int配列)を設定するもの、取り出すもの、計算結果の値を得るもの、結果のテキストを得るもの、といったものを用意しておきました。これをMainクラスから呼び出し、引数に送られた値をデータに設定して計算させ、結果を表示しています。
Mainからは、new MyCalcでインスタンスを作成し、それにsetDataでデータを設定して、getResultで結果を得ています。どこといっておかしなところもない、ごくごく普通の書き方でしょう。これに、何か問題があるとは思えませんね。
このプログラムが完成し、実際に運用されているとしましょう。そして、「このMaCalcを更に強力にした新しいMyCalc2を作って入れ替える」ということになったとします。このとき、どうすればいいのでしょうか。MyCalc2のクラスを作成し、MyCalcと入れ替える――わけにはいきません。そう、Mainクラスを書き換えてMyCalc2を使う形に修正し、再コンパイルして初めて使えるようになるわけです。
こういう小さなクラスが1つあるだけならば、これはたいしたことではありません。では、クラスが数十、数百あったら? それをプログラムの数百箇所で呼び出して使っていたら? これを修正するのは容易ではないことがわかるはずです。
要するに、一般的なプログラミングでは、「あるクラス内から別のクラスのインスタンスを直接呼出し、利用する」という形になっているため、あるクラスを改良して別のクラスに入れ替えると、それだけであちこちのソースコードを修正し、プログラム全体を再コンパイルして入れ替える羽目になってしまうのです。
修正を行うクラスを入れ替えるとき、それ以外のプログラムは一切変更せず、もちろん再コンパイルもしないで済む方法はないか? その答えが、「DI」にあります。