CurrencyAsValue
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は一般的ではありません—私もそれが唯一目にしたものです。 まず大抵のシステムでは、シンプルな値オブジェクトで通貨を表現することができます。