倭マン's BLOG

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

SimulationComponent の論理構造

前回、観測量を扱うクラスが実装すべきインターフェース DataAccessor を実装するインターフェースを見ました。 それらは観測量を管理する DataManager をセットするメソッド DataAccessor#setDataManager() を実装しなければなりませんでした。

しかし、通常は1つ1つのオブジェクトに対して DataManager オブジェクトをセットするのではなく、IterativeSimulator オブジェクトにそれをセットすれば、それが所持する DataAccessor オブジェクトにその DataManager オブジェクトがセットされるのが自然です。

もちろん、DataAccessor を実装している各クラスに、それぞれ適切な DataAccessor#setDataManager() メソッドの実装を施してやればいいんですが、ここでは少々違う(といっても基本的には同じ)アプローチを採ってみましょう。

SimulationComponent オブジェクト間に論理構造を入れる


SimulationComponent を拡張するインターフェース(IterativeSimulator, PhysicalSystem など)は、暗黙のうちに以前の記事に示したような論理構造を構成しています:
f:id:waman:20071222082020p:image

この構造はシミュレーション設計図の(XML 文書としての)ネスト構造とほぼ同じです(DataManager オブジェクトが ObservableSet オブジェクトを包含している点だけが違います。 また、Iteration オブジェクトは他の Iteration オブジェクトを包含することが出来ます。)。

ただし、SimulationComponent インターフェースには一括して子要素を取得するようなメソッドは定義していないので、またまた AspectJ の「インタータイプ宣言」を用いて子要素のリストを取得するメソッド SimulationComponent#getChildComponents() を付加しましょう:

aspect LogicalStructure {

    public List<SimulationComponent> 
    SimulationComponent.getChildComponents(){
        return Collections.emptyList();
    }
}

デフォルトでは空のリストを返すようにしておきます。 加えて、子要素を持つ SimulationComponent はそれらのリストを返すように実装を上書きします(オーバーライドと言っていいのか分かりませんが):

aspect LogicalStructure {

    public List<SimulationComponent> 
    SimulationComponent.getChildComponents(){
        return Collections.emptyList();
    }

    public List<SimulationComponent> 
    IterativeSimulator.getChildComponents(){
        // 所持している PhysicalSystem, DataManager, Iteration
        // オブジェクトを含んだリストを返す
    }
    
    public List<SimulationComponent> 
    Iteration.getChildComponents(){
        // 所持している IterationCondition, DataOutputterContainer
        // オブジェクトのリストを返す
    }
    
    public List<SimulationComponent> 
    CompositeIteration.getChildComponents(){
        // 所持している Iteration と
        // IterationCondition, DataOutputterContainer
        // オブジェクトのリストを返す
    }
    
    public List<SimulationComponent> 
    CompositeIterationCondition.getChildComponents(){
        // 所持している IterationCondition のリストを返す
    }
    
    public List<SimulationComponent> 
    DataManager.getChildComponents(){
        // 所持している ObservableSet のリストを返す
    }
    
    public List<SimulationComponent> 
    DataOutputterContainer.getChildComponents(){
        // 所持している DataOutputter のリストを返す
    }

子要素となるオブジェクトは、それぞれのインターフェースに getter メソッドが定義されているので簡単に実装できます。 SimulationComponent#getChildComponents() メソッドは、それらの子要素を簡単にリストアップするためのユーティリティ・メソッドをオブジェクト自体に「織り込んだ」ものと見なせば良いかと思います。