前回の最後、ドメイン分析っぽいことをしてクラス(候補)を抜き出すと書きましたが、あまり込み入ったシステムでもないので、抽象度や開発プロセスなどをあまり気にせず、ある程度実装も意識しながら仕様を考えていくことにします。
また、前回「系の状態を指定する変数をまとめて状態と呼ぶ」と言いましたが、どうもしっくりこないので、これを変えて「物理系」と呼ぶことにします。
簡単なシミュレーションから考えてみましょう。
まず、何も観測せず、何も出力しない場合。このときの基本フローはすごく簡単。
- 物理系の状態を初期化する。
- (反復条件が満たされている間)物理系の状態を更新する。
ここから、物理系(PhysicalSystem)が実装すべきインターフェースが以下のようになります*1:
public interface PhysicalSystem{ void initialize(Properties initParams); void evolveState(); }
物理系の初期化に必要なパラメータは java.util.Properties オブジェクトとして渡すことにします。
反復条件(IterationCondition)は、通常の for 文で行えることが出来るようにしましょう:
public interface IterationCondition{ void initialize(); boolean continueIteration(); void continued(); void stopped(); }
使い方(各メソッドの呼び出され方)は、以下の IterativeSimulator#simulate() メソッドの実装例参照。1つ注意しなければならないのは、シミュレーションによっては反復条件の評価に物理量が必要な場合があることです。これはまたいずれ考えましょう。
反復シミュレーション(IterativeSimulator)の実装例は次のようになります:
public class IterativeSimulator implements Simulator{ private PhysicalSystem system; private Properties initParams; private IterationCondition ic; // ... フィールドのsetterメソッドなど public void simulate(){ system.initialize(initParams); for(ic.initialize(); ic.continueIteration(); ic.continued()) system.evolveState(); ic.stopped(); } }
物理量を観測して出力する場合は、次回考えましょう。