データ構造と手続きとモジュール分け
アプリケーション全体に渡って使われる基本的なデータ構造については、データ構造と手続きを別モジュールにした方がよい場合もあるんじゃなかろうか。具体的に言うと、四本値とか足の種類とか通貨ペアとか。
type candle = { (* ローソク足のデータ構造 *) utime : float; (* 時刻 *) first : float; (* 始値 *) low : float; (* 安値 *) high : float; (* 高値 *) close : float; (* 終値 *) }
直感的にはなんとなくCandleモジュールを作って、その中に四本値に関連する関数を突っ込みたくなる訳だけども、アプリケーションを作り進むにつれ、どうもいまいちに感じてくる。
例えば二つの四本値をマージする関数やprinter関数。直感的にはCandleモジュールに入れて然るべきなんだけど、実はマージ関数には時刻に関する優先順位という(普遍的でない?)危うい仕様が入り込んでくる。printer関数に至っては通貨ペアに依存して出力桁数が変わるので、他のモジュールとの依存関係まで入ってきてさらに気持ち悪い。要するに、アプリケーションを「Candle」という面から切り取ると、多様な視点が入り込んできて統一感がなくなる訳だ。
やっぱりこういうデータ構造については、データ構造だけ最下層で定義して、それを扱う手続きは別の視点でモジュール化する方がよろしいんじゃなかろうか。