osiire’s blog

ふしぎなそふとやさん

データ構造と手続きとモジュール分け

アプリケーション全体に渡って使われる基本的なデータ構造については、データ構造と手続きを別モジュールにした方がよい場合もあるんじゃなかろうか。具体的に言うと、四本値とか足の種類とか通貨ペアとか。

type candle = { (* ローソク足のデータ構造 *)
  utime : float; (* 時刻 *)
  first : float; (* 始値 *)
  low : float;   (* 安値 *)
  high : float;  (* 高値 *)
  close : float; (* 終値 *)
}

直感的にはなんとなくCandleモジュールを作って、その中に四本値に関連する関数を突っ込みたくなる訳だけども、アプリケーションを作り進むにつれ、どうもいまいちに感じてくる。
例えば二つの四本値をマージする関数やprinter関数。直感的にはCandleモジュールに入れて然るべきなんだけど、実はマージ関数には時刻に関する優先順位という(普遍的でない?)危うい仕様が入り込んでくる。printer関数に至っては通貨ペアに依存して出力桁数が変わるので、他のモジュールとの依存関係まで入ってきてさらに気持ち悪い。要するに、アプリケーションを「Candle」という面から切り取ると、多様な視点が入り込んできて統一感がなくなる訳だ。
やっぱりこういうデータ構造については、データ構造だけ最下層で定義して、それを扱う手続きは別の視点でモジュール化する方がよろしいんじゃなかろうか。