倭マン's BLOG

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

データの管理関連のインターフェース -- DataManager, DataAccessor など

観測量の値は DataManager オブジェクトによって管理します。 基本的に、1つの IterativeSimulator オブジェクトが1つの DataManager オブジェクトを持っているようなイメージです。 DataManager オブジェクトは ObservableSet オブジェクトも管理していて、物理量の値を取得しようとした場合、必要ならそれらのオブジェクトを用いて観測を実行します。

DataManager の実装として DefaultDataManager を作成します。 この実装は特にどうと言うこともないので、ここでは省略。

次に、DataManager を使用するインターフェース、クラスを見ていきましょう。 ObservableSet は省略して、DataAccessor インターフェースを拡張または実装しているものだけを取り上げます。 今回取り上げるのは、その中でも以下の4つです:

  • DataOutputter
  • IterationCondition (DataControlledIterationCondition)
  • IterativeSimulator
  • LeafIteration*1

残りのものについては次回以降に。

DataOutputter


全ての DataOutputter は観測量を使用するので、DataManager を属性として定義しておきましょう。 加えて、それに対するアクセッサ・メソッドも定義しておきます(setter メソッドは DataAccessor に定義してあるメソッド)。 DataOutputter はインターフェースなので、AspectJ のインタータイプ宣言を用いて DataManager 属性を付加します:

public aspect DataOutputterDataManager {

    private DataManager DataOutputter.data;
    
    public void DataOutputter.setDataManager(DataManager data){
        this.data = data;
    }
    
    public DataManager DataOutputter.getDataManager(){
        return this.data;
    }
}

IterationCondition


反復条件 (IterationCondition) に、観測量の値によって反復を続けるか終了するかを評価するものがあると便利です。 これにも DataOutputter のようにインタータイプ宣言で DataManager 属性を付加できると便利なので、IterationCondition を実装する新たなクラス DataControlledIterationCondition を定義します:

public aspect DataControlledIterationConditionDataManager {
    
    private DataManager DataControlledIterationCondition.data;
    
    public void DataControlledIterationCondition.setDataManager(
            DataManager data){
        this.data = data;
    }
    
    public DataManager DataControlledIterationCondition.getDataManager(){
        return this.data;
    }
}

反復条件の評価に観測量を使用するクラスは、DataControlledIterationCondition を拡張して作成することにしましょう。

IterativeSimulator


1つの IterativeSimulator オブジェクトに対して1つの DataManager オブジェクトを保持するために、IterativeSimulator にも DataManager 属性を付加しておきましょう:

public aspect IterativeSimulatorDataManager {

    private DataManager IterativeSimulator.data = new DefaultDataManager();
    
    public DataManager IterativeSimulator.getDataManager(){
        return this.data;
    }
    
    public void IterativeSimulator.setDataManager(final DataManager data){
        this.data = data;
        this.getIteration().setDataManager(data);
    }
}

LeafIteration


物理系の状態が更新されると、DataManager に保持されているデータも全て観測し直さなければなりません。 そのために、LeafIteration にも DataManager 属性を付加して、状態の更新前にデータをリセットするようにしましょう:

public aspect IterationDataManager {
    
    private DataManager LeafIteration.data;
    
    public void LeafIteration.setDataManager(DataManager data){
        this.data = data;
        this.getIterationCondition().setDataManager(data);
        this.getDataOutputterContainer().setDataManager(data);
    }
    
    @Prepare(JoinPoint.EVOLVE)
    public void LeafIteration.resetDataManager(){
        this.data.resetData();
    }
}

入門XML

入門XML

*1:以前の記事参照。