技術とか戦略とか

IT技術者が技術や戦略について書くブログです。

java:並行開発を行うためのテクニック

何も考えずにクラス分割を行いクラス毎に開発者を割り当てると、未完成のクラスを取り込むことができず、他のクラスが完成するのを待つ必要が出てきてしまいます。
今回は、他のクラスが完成するのを待たずに並行開発するテクニックを、javaの例を用いて説明します。
 
----------------------------
 
下記は何も考えずにクラス分割した場合の例です。
HelloProductクラスを取り込みたいのですが、HelloProductクラスが完成していないため、コンパイルができず、HelloProductクラスが完成するまで実行確認を行うことができません。
 
【サンプルコード】
・HelloMain.java(新規)
public class HelloMain {

    public static void main(String[ ] args) {
        HelloProduct helloProduct = new HelloProduct();
        helloProduct.print();
    }

}
 
【実行結果】
HelloProductクラスが作成されていないためにコンパイルエラー。
 
----------------------------
 
そこで、Interfaceを用いる手があります。
Interfaceの下に、最終的に取り込みたいクラス(HelloProductクラス)と、実行確認時に暫定的に取り込むクラス(HelloTestクラス)を定義することで、最終的に取り込みたいクラスの完成を待たずに、実行確認時に暫定的に取り込むクラスを用いてテストが可能になります。
下記は、暫定的にクラスを取りこんで実行確認を行う例です。
 
【サンプルコード】
・HelloMain.java(修正)
public class HelloMain {

    public static void main(String[ ] args) {
        HelloInterface hello = new HelloTest();
        hello.print();
    }

}
 
・HelloInterface.java(新規)
public interface HelloInterface {

    public abstract void print();

}
 
・HelloTest.java(新規)
public class HelloTest implements HelloInterface {

    public void print() {
        System.out.println("Hello World! Test!");
    }

}
 
【実行結果】
Hello World! Test!
 
----------------------------
 
そして、最終的に取り込みたいクラスが完成したら、newの箇所を変更することでそのクラスの取り込みが可能になります。
 
【サンプルコード】
・HelloMain.java(修正)
public class HelloMain {

    public static void main(String[ ] args) {
        HelloInterface hello = new HelloProduct();
        hello.print();
    }

}
 
・HelloProduct.java(新規)
public class HelloProduct implements HelloInterface {

    public void print() {
        System.out.println("Hello World! Product!");
    }

}
 
【実行結果】
Hello World! Product!
 
----------------------------
 
以上のようにInterfaceの機能を用いて並行開発を行うのは、実際の開発でもよく使われる手段です。
 
補足すると、この手段は若干古典的な手段となります。
より発展的な手段としては、DI(Dependecy Injection)という手段があり、SpringFramework等のフレームワークの機能を用いることで容易に実現することが可能になります。
DIは、newの箇所(上記のサンプルコードで「 = new HelloTest();」や「 = new HelloProduct();」としていた箇所)の定義を何かしらの方法で不要とすることで、ソースコードを変更することなく取り込むクラスを変更できるようにする、という手段です。
SpringFrameworkでは、特定のアノテーションソースコードに付与することで、取り込むクラスをxmlファイルで指定することが可能になります。上記のサンプルコードの例で言うと、HelloTestクラスを取り込むかHelloProductクラスを取り込むのかをxmlファイルに定義することが可能になります。
 
DIについてはこの記事では詳しく触れませんが、現在の開発ではDIが使われることも多く、書籍やWebの文献も豊富です。
実際に使おうと思った時に実装方法がわからずに困る、ということは少ないでしょう。