倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

反復条件をシミュレーション設計図で指定する

今回は反復条件をシミュレーション設計図から指定することを考えましょう。 前回と同じく、何も観測せず、何も出力しないシミュレーションを考えます。

ちなみに、前回IterationCondition インターフェースを実装したクラスを作成して、シミュレーション設計図ではそのクラスを指定したんでした:

...
<iteration-condition class="CountIterationCondition"/>
...
public class CountIterationCondition implements IterationCondition{
...
}

さて、本題に入りましょう。 

type 属性


設定を簡単にするには、典型的な反復条件を実装したクラスをフレームワーク側で提供しておき、シミュレーション設計図で簡単にそれらを指定できるようにしておくってのが、まぁ妥当なとこでしょう。 ってことで、シミュレーション設計図内の iteration-condition 要素に type 属性 を付加して、そこで反復条件のタイプを指定できるようにしましょう:

...
<iteration-condition type="count"/>
...

一定回数繰り返す反復条件は、キーワード「count」で指定します。 ここまではいいでしょう。 

タイプごとのパラメータをセットする


しかしこれだけだとあまり便利には感じません。 もうちょっと使いやすくするためには、パラメータを設計図上で指定できるといいでしょう。 「count」反復条件の場合を考えてみると、パラメータは反復回数です。 この場合には新たに total 属性ってのを作って、

...
<iteration-condition type="count" total="10"/>
...

と指定できるようにします。 ただし、type, class 属性は別の意味で使っているので、type 属性と class 属性はパラメータと認識されないようにしておきます。

自作の反復条件オブジェクトにパラメータをセット出来るようにする


IterationCondition の実装を全てフレームワーク側で提供するなら、設計図上だけの設定方法だけでいいんですが、自作の IterationCondition クラスを使用するときにもパラメータを設定したい場合もあるでしょう。

こういう場合は、IterationCondition の実装側で設計図上の設定を受け取れるようにしておかなければいけません。 このためには、今(少し前?)はやりの DI*1 コンテナのように、フレームワーク側がXML 要素の属性から IterationCondition の実装クラスの setter メソッドを探し出してパラメータをセットするようにしておきます*2。 

上の例の場合では(class 属性を使って)、

...
<iteration-condition class="CountIterationCondition" total="10"/>
...
public class CountIterationCondition implements IterationCondition{

    private int total;

    public int getTotal(){
        return this.total;
    }

    public void setTotal(final int total){
        this.total = total;
    }
    
    ...
}

のように、getTotal(), setTotal() メソッドを定義しておくと、フレームワーク側が setTotal() を呼び出して、パラメータをセットしてくれるようにします。 getter / setter メソッド名は(DI コンテナなどでも使われている) JavaBean 関連で使われる命名法を使うということしましょう。

次回は、フレームワーク側で提供する、典型的な反復条件を考えます。

*1:Dependency Injection 依存性の注入

*2:実際、以前は Simulator のファクトリ・クラスを DI コンテナで実装しようとしてました