倭マン's BLOG

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

データの出力

今回はデータを出力するためのインターフェースを考えます。 インターフェース名は DataOutputter とします。

DataOutputter が行うべきことは以前簡単に書きました(id:waman:20070615):

  1. 物理量値を取得する。
  2. 取得した物理量値を出力する。

これらに加えて、DataOutputter が考慮すべき事項は

  • 事前処理、事後処理
  • 出力する観測量のエントリ
  • 出力するタイミング

です。以下、1つずつ見ていきましょう。

物理量値の取得


これは前回やった、「理量の観測値を使用するクラス」の性質なので、DataAccessor インターフェースを拡張すれば OK。

物理量値の出力


これは、観測量を出力するためのメソッド output() を定義しておけば OK。

事前処理・事後処理


まず、これが何に必要かを書いておきましょう。 例えばデータをファイルに書き出すためには、java.io.FileWriter クラスを使いますが*1、これを使用する際には、ファイルにデータを書き出す処理以外にも、ファイルへのストリームの生成、廃棄(close)をする必要があります。 ネットワーク越しにデータを送ったり、データベースへデータを格納したりする場合も同様です。 事前処理・事後処理はこれらの処理を行います。

インターフェースに宣言するメソッドは、事前処理 prepare()、事後処理 dispose() を宣言しておきます*2

ちなみに、PhysicalSystemIterationCondition には、似たようなメソッド initialize() を定義していましたが、

  • 初期化(事前処理)のみが必要な場合 → initialize
  • 事前処理・事後処理が必要な場合 → prepare, dispose

としています。

これはあまり必要ないことかもしませんが、事前処理、事後処理というのは結構一般的な処理に思えるので、別途インターフェースを作って(実質的にはマーカーインターフェースと言っていいかもしれません)、これらのメソッドを宣言しておきます:

public interface Device{
    void prepare();
    void dispose();
}

DataOutputter はこれを拡張させます。

出力する観測量のエントリ


出力する観測量の値を DataTable オブジェクトから取得するには観測量の名前*3が必要になるので、これらを管理するアクセッサ・メソッドのようなものが必要です。 しかし、このエントリは java.lang.String のコレクション(java.util.List)がデータ型として適当なので、通常の getter/setter メソッドではなく、getter/adder/remover メソッド*4を使います。

出力するタイミング


出力するタイミングとは、初期状態や終状態、状態を更新した後の状態など、どの状態を出力するのかということです。 詳細は次回移行することにして、ここでは DataOutputter オブジェクトが複数の OutputTiming オブジェクトを所有する(順序は問わない)必要があるとだけ言及しておきます。 ここでもやはりコレクションとして所有する必要があるので、getter/adder/remover メソッドを宣言することにします。

加えて、setOutputTiming(java.lang.String) というメソッドも定義しておきます。 これは、タイミングを指定する文字列を空白で区切った文字列を引数にして、タイミングをセットするメソッドです。 詳細はまた後日。

DataOutputter インターフェース


結局、DataOutputter インターフェースの宣言は以下のようになります:

import java.util.List;
import java.util.Set;

public interface DataOutputter 
        extends Device, DataAccessor{

    void output();

    List<String> getEntries();
    void addEntry(String entry);
    void removeEntry(String entry);

    Set<OutputTiming> getOutputTimings();
    void addOutputTimings(OutputTiming timing);
    void remove(OutputTiming timing);
    void setOutputTiming(String s);
}

*1:実装には Java を用います。

*2:prepare:準備する、dispose:廃棄する。

*3:この名前はObservableSet#getDataEntries() メソッドで返される文字列のセットに含まれている必要がある

*4:これらの言葉は一般的に使われているわけではありませんが、メソッド名としてはよく出てきます。