http://martinfowler.com/bliki/CurrencyAsValue.html

バリューオブジェクト(パターン)の例はたくさんありますが、私が良く使うのはMoney(クラス)です。そしてMoneyにつきものなのは通貨です。

多くのシステムにとって通貨は値(value object)として扱うと上手くいきます。 そこで必要とされるポイントは国際的に認識される通貨コード(例えば米ドルに対するUSD)です。

ところが、私がかつて関わったシステムでちょっと面白いものがありました。 私の記憶が正しければ、そのシステムでは通貨に’pip value’1というものが求められました。 システムのUIでボタンをちょこっと押すと通貨の値が上下するのです。 各通貨は固有のpip valueをもっており、このpip valueは変化することができます。頻繁ではありませんが、確かに変化するのです。 このことはimmutable(インスタンスが変化しない)、という値オブジェクトにとっての有用なルールに違反しています。

我々が取った解決策は二つの通貨クラスを作ることでした。一つは値オブジェクトで、通貨コードや他に2個ぐらいの不変な値を保持します。 二つ目は参照オブジェクトです(確かCurrencyValueだかCurrencyReferenceと呼んでいたと思います)。 大抵の場合(前者の)値オブジェクトが流通しますが、その中のいくつかのメソッド、例えばpip valueは大抵はstatic(なフィールド)になっている参照オブジェクトに委譲されます。 参照オブジェクトは通貨コードのインデックスが付いた索引表に格納されていました。(それが唯一の方法というわけではありませんが)

この二義的な振る舞い2は一般的ではありません—私もそれが唯一目にしたものです。 まず大抵のシステムでは、シンプルな値オブジェクトで通貨を表現することができます。

  1. 訳注:pip=小さな種、ピッという電子音

  2. 訳注:値オブジェクトと参照オブジェクトを混ぜて使う手法を指す