倭マン's BLOG

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

物理量の観測

今回は物理量を観測するクラスを考えましょう。

必要なのは、物理量の名前(java.lang.String)、物理量の型(java.lang.Class<?>)、物理量を計算するメソッドです。 あと、観測対象となる物理系をフィールドとして保持するために、物理系に対するアクセッサ・メソッド*1も定義しておきましょう:

public interface Observable{

    PhysicalSystem getPhysicalSystem();
    void setPhysicalSystem(PhysicalSystem system);

    /** 物理量の名前 */
    String getName();

    /** 物理量の型 */
    Class<?> getDatatype();

    /** 物理量を観測するメソッド */
    Object observe();
}

まぁ、上のような定義でもダメなわけではないんですが、

  • 1つの観測量に対して1つのクラスを定義するのは結構手間
  • 似たような量を計算する場合、1つのメソッド内で複数の物理量を計算できた方がパフォーマンス的にいい

ってことで、複数の観測量を1つのメソッド内で計算する ObservableSet と、観測データを保持しておく DataRegistry を以下のように定義します:

import java.util.List;

public interface ObservableSet{

    PhysicalSystem getPhysicalSystem();
    void setPhysicalSystem(PhysicalSystem system);

    /** 物理量の名前の Set */
    List<String> getDataEntries();

    /** 引数の名前で指定される物理量の型 */
    Class<?> getDatatype(String name);

    /** 物理量を観測するメソッド */
    void observe(DataRegistry registry);
}
public interface DataRegistry{

    /** 引数で指定される観測量の値を返します。*/
    Object getData(String name);

    /** 第1引数で指定される観測量の値を第2引数にセットします。 */
    void setData(String name, Object value);
    
    /** セットされている観測データをリセットします。 */
    void resetData();
}

ObservableSet の実装方法は、

  1. observe() メソッド内で物理量を計算する。
  2. メソッドの引数になっている DataRegistry オブジェクトに値をセットする。

という手順です。具体的な実装例はもう少し待ってくださいm(_ _)m

上記の Observable は、ObservableSet を実装する抽象クラスとして定義し直します(コードはここでは割愛)。

*1:getter/setter メソッド。