前回までに考えたのは、まず「何も観測せず、何も出力しないシミュレーション」、次に物理量を観測(計算)するためのインターフェースでした。
次に考えるのは、物理量の観測値(以下、物理量値)を出力するためのインターフェースです。 このインターフェース名は DataOutputter とします。 このインターフェースを実装するオブジェクトが行うことは
- 物理量値を取得する。
- 取得した物理量値を(ストリームや GUI などに)出力する。
となります。
ステップ中に「物理量値を取得する」というものを入れてありますが、これは物理量を計算するという意味ではありません。 今開発している OPS フレームワーク*1は、オブジェクト指向言語の Java を用いているので、フレームワーク自体もオブジェクト指向にしようってことで、物理量値を管理するためのインターフェースを別途用意して、物理量の計算や取得はそのインターフェースを介して行うようにします。
こう書くと盲目的にオブジェクト指向を使っているように見えるので、キチンとしたメリットを書いておきましょう。 それは一言で言えば「物理量値のキャッシュ」です。 物理量の出力を何ヶ所かへ行う場合(例えばコンソールとファイルに同時に出力するなど)や、反復条件を物理量値で決定するといった場合、同じ物理量値を何度も使う必要があります。 しかし、物理量値を計算するのは大抵の場合、コストが掛かります。 そこで、新たにインターフェースを作って、物理量値を取得するメソッドを定義し・・・ あとは、通常のキャッシュを行う実装と同じです。
てな訳で、物理量値を管理するインターフェースを考えます。 ここで、前回「物理量の観測」のところで出てきた DataRegistry を思い出しましょう。 このインターフェースを直接使っても良さそうですが、DataRegistry はあくまで物理量を取得するためのインターフェースということで、別のインターフェース DataTable を定義します。 これは DataOutputter の実装クラス内などで、物理量値を新たにセットできないようにするためです。
import java.util.List; public interface DataTable{ boolean contains(String name); List<String> getDataEntries(); Class<?> getDatatype(String name); /**引数で指定される観測量の値を返します。*/ Object getData(String name); /** * 全ての観測量が観測されていない状態にするメソッドです。 * 物理系の状態が更新される(PhysicalSystem#evolveState()が呼び出される) * 直前に呼び出されます。 */ void resetData(); }
幾つかメソッドを定義していますが、基本は getData(String) メソッドです。 また、setData() メソッドがないことにも注意。 一方、DataRegistry インターフェースも物理量を観測するためのインターフェースなので
public interface DataRegistry extends DataTable{ void setData(String name, Object value); }
と書き換えておきましょう。
物理量値を管理するインターフェースが出来たので、次回はこのクラスを使用するクラス、言い換えれば、物理量値を使用するクラスを考えます。 DataOutputter インターフェースの詳細も次回以降に。
*1:Object-oriented Physics Simulation framework