最近関わっているプロジェクトでソースコードを自動生成するツールがあってそのツールでGeneration Gapパターンという聞いたことのないデザインパターンを使っていた。

はじめて聞いたデザインパターンだったので調べてみた。

Generation Patternとは、ソースコードを自動生成ツールがあることを前提としており、ソースコードを自動生成した後、そのコードに手を加えると再度自動生成した際に手を加えた部分が消えてしまうので、サブクラスを作ってそこに手を加えるというもの。

Javaのクラスを自動生成するツールをPythonで作ってみた。

このツールを実行すると名前、年齢、体重をフィールドとSetter、Getter、toStringメソッドを持つHumanクラスを自動生成する。

実行すると以下のようなクラスが生成される。

public class Human{

    protected String name;
    protected int age;
    protected double weight;

    public Human(String name, int age, double weight){
        this.name = name;
        this.age = age;
        this.weight = weight;
    }
    public String toString(){
        return "name=" + this.name + ", " + "age=" + this.age + ", " + "weight=" + this.weight;
    }
}

このHumanクラスには手を加えず、Humanクラスを継承したMyHumanクラスを自分で作り、10代かどうかを判定するメソッドを追加する。

public class MyHuman extends Human{
    public boolean isTeen(){
    	return super.age >= 10 && super.age <= 19;
    }
}

MyHumanを利用するTestHumanクラスを作り実行してみる。

public class TestHuman {
	public static void main(String[] args) {
		MyHuman human1 = new MyHuman();
		human1.setName("山田太郎");
		human1.setAge(35);
		human1.setWeight(80.0);

		MyHuman human2 = new MyHuman();
		human2.setName("田中花子");
		human2.setAge(19);
		human2.setWeight(48.6);

		System.out.println(human1);
		System.out.println(human1.isTeen() ? "10代です。" : "10代ではありません。");
		System.out.println(human2);
		System.out.println(human2.isTeen() ? "10代です。" : "10代ではありません。");
	}
}

実行結果は以下のとおり。

name=山田太郎, age=35, weight=80.0
10代ではありません。
name=田中花子, age=19, weight=48.6
10代です。

ここで、仕様変更となり、Humanクラスにhobbyフィールドが追加されたとする。
自動生成ツールのfield_listにhobbyを追加し、再実行する。
(本来ならfield_listはxmlなど外部ファイルにし、自動生成ツールは変更しない方がいいと思う)

field_list = {
    "name":"String",
    "age":"int",
    "weight":"double",
    "hobby":"String", # 追加
}

再実行すると、hobbyフィールド追加版のHumanクラスが生成されるのでHumanクラスをコンパイルする。

MyHumanはコンパイルする必要はない。

再度、TestHumanを実行する。

name=山田太郎, age=35, weight=80.0, hobby=null
10代ではありません。
name=田中花子, age=19, weight=48.6, hobby=null
10代です。

hobbyをセットしていないので、nullとなっている。

サンプルとしてはよくないが、こんな感じで自動生成ツールを再実行しても自分で手を加えた部分は消えてしまうことはない。

参考サイト

Generation Gapパターン