倭マン's BLOG

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

実装 -- Iteration

今回は反復を実行する Iteration インターフェースです。

Iteration インターフェースにはネスト構造に出来るサブクラス CompositeIteration があります。 通常の、物理系の状態を発展させる Iteration の実装クラスを LeafIteration、CompositeIteration の実装クラスを BranchIteration、それらを抽象化した親クラスを AbstractIteration として実装を行います。

AbstractIteration


AbstractIteration は IterationCondition (反復条件)を属性として持ち、反復を実行するクラスです。 Iteration#iterate() メソッドを呼び出すことで反復を開始することが出来ます。 反復の仕方は

セットされている反復条件を評価した結果*1が真である限り、Iteration#evolve() メソッドを呼び出し続ける

というものです(下記の実装を参照)。 Iteration#evolve() メソッドは基本的に外部から呼び出しません*2。 また、反復条件 (IterationCondition) が設定されていない場合は、1度だけ Iteration.evolve() を呼び出して終了します*3

public abstract class AbstractIteration implements Iteration{
    
    private IterationCondition ic;
    
    // IterationCondition へのアクセッサ・メソッド
    
    @Prepare
    public void setupIterationCondition(){
        if(this.ic == null){
            // OnceIC オブジェクトは「1度だけ反復を実行する」
            // IterationCondition クラス。
            this.ic = new OnceIC();
        }
    }

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

LeafIteration


LeafIteration は、PhysicalSystem#evolveState() を呼び出して物理系の状態を発展させます。

public class LeafIteration extends AbstractIteration{
    
    public void evolve(final PhysicalSystem system)
            throws SimulationException{
        system.evolveState();
    }
}

BranchIteration


BranchIteration は所持している Iteration オブジェクトを用いて順々に反復を行っていきます。

public class BranchIteration 
        extends AbstractIteration implements CompositeIteration{
    
    private final List<Iteration> children = new ArrayList<Iteration>();

    // org.waman.ops.simulation.util.Composite インターフェースに
    // 定義されている各メソッドの実装

    public void evolve(final PhysicalSystem system)
            throws SimulationException{
        
        for(final Iteration child: this.children)
            child.iterate(system);
    }
}

*1:IterationCondition#evaluate() の返り値

*2:通常 "protected" なメソッドにしておく方が良いのですが、JoinPoint の定義上 "public" にしています。

*3:これは実装によります。 この場合は「do 〜 while 文」と同じになります。