前回、物理量の観測値(以下、物理量値)を管理するインターフェースを定義しました。 今回はそれを使用するクラスを考えます。
前回ちらっと書きましたが、物理量値を使うのは次の2つの場合です:
- 物理量値を出力するとき
- 反復条件*1の評価に物理量値を用いるとき
物理量値を取得するためには、そのシミュレーションで使っている DataTable オブジェクトにアクセスする必要があるので、それに対する setter メソッドを定義しなければなりません。 「物理量値を使用する」というマーキング*2の意味を込めて、次の DataAccessor インターフェースを定義しておきましょう:
public interface DataAccessor{ /** DataTable オブジェクトをセットします。 */ void setDataTable(DataTable dt); }
このインターフェースは、データ出力を行う DataOutputter オブジェクトと、反復条件を評価する IterationCondition オブジェクトが実装します。 DataOutputter に関しては次回以降考えます。
ここでは、反復条件の評価に物理量値を用いる場合を考えましょう。 前に定義した IterationCondition が DataAccessor を拡張するようにすると、反復条件の評価に物理量値を用いない場合に無意味なメソッド(DataAccessor#setDataTable())を実装しなくてはならなくなります。 したがって、新しいインターフェース DataControlledIterationCondition を定義します:
public interface DataControlledIterationCondition extends IterationCondition, DataAccessor{ }
今のところ、特に新しく定義するメソッドはありません。
これは OPS フレームワーク*3開発者に対しての注意ですが、Simulator オブジェクトを構築する(組み立てる)際、これらの DataAccessor オブジェクトに DataTable オブジェクトをセットしなければなりません。 DataOutputter オブジェクトは必ず DataAccessor オブジェクトを実装しますが(次回以降やります)、IterationCondition オブジェクトは、オブジェクトごとに実装しているかどうかをチェックしなければなりません。 ちょっと不自然な処理なので、将来うまい方法が見つかれば、モデルを変更するかもしれません。