倭マン's BLOG

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

実装 -- IterationCondition

反復条件を表すインターフェース IterationCondition には、ただ1つのメソッド evaluate() のみが定義されています。 これは boolean 値を返し、「true」の場合は反復を続け、「false」の場合は反復を終了するというメソッドです。

処理の流れは while 文をイメージするとピッタリです(前回の AbstractIteration の実装を参照):

private IterationCondition ic;

public void iterate(final PhysicalSystem system)
        throws SimulationException{
        
    while(this.ic.evaluate())
        evolve(system);
}

@Prepare, @Dispose アノテーション


実際には、evaluate() メソッドだけではいろいろな反復条件が実現できません。 そこで、SimulationComponent に定義してある @Prepare, @Dispose アノテーションを使って、初期化等々の処理を定義します。

処理の流れは以下のようになります(以前の記事も参照):

private IterationCondition ic;

public void iterate(final PhysicalSystem system)
        throws SimulationException{
        
    // @Prepare(JoinPoint.ITERATE) の処理

    while(this.ic.evaluate()){
        // @Prepare(JoinPoint.EVOLVE) の処理
        evolve(system);
        // @Dispose(JoinPoint.EVOLVE) の処理
    }

    // @Dispose(JoinPoint.ITERATE) の処理
}

for 文を使って書くと以下のようになります(チョット分かり難くなりますが):

private IterationCondition ic;

public void iterate(final PhysicalSystem system)
        throws SimulationException{
        
    for(/* @Prepare(JoinPoint.ITERATE) の処理 */;
             this.ic.evaluate();
             /* @Dispose(JoinPoint.EVOLVE) の処理 */){

        // @Prepare(JoinPoint.EVOLVE) の処理
        evolve(system);
    }

    // @Dispose(JoinPoint.ITERATE) の処理
}

サンプル


例えば、決められた回数だけ反復を繰り返す「CountIterationCondition」は以下のようになります:

public class CountIC implements IterationCondition{
    
    private int rest;
    private int total;

    // 属性 total に対するアクセッサ・メソッド
    
    @Prepare(JoinPoint.ITERATE)
    public void initialize(){
        this.rest = this.total;
    }
    
    public boolean evaluate() {
        return this.rest > 0 ? true : false; 
    }

    @Dispose(JoinPoint.EVOLVE)
    public void countDown() {
        this.rest--;
    }
}