ObjectSquare [2000 年 9 月号]

[アナリシスパターン]


多国通貨 - Multiple Currency -

平澤 章
Ver 0.1 - 2000/8/ 2
Ver 0.2 - 2000/8/23

今日、多くの企業において日常的に海外取引が行われている。このため、それをサポートするシステムでも必然的に複数種類の通貨のサポートが要求される。

このような状況において、たんに数値だけを使って金額をモデル化すると、その金額の持つ価値を適切に表現できない。
Martin Fowler によるアナリシスパターン[参考文献1]では、このような状況のために、数と単位を組み合わせて表現する「量(Quantity)パターン」が紹介されている。そこでは、多国通貨モデルへの適用についても簡単に触れられているが、突っ込んだ議論まではされていない。

ここでは、ビジネスシステムでは一般的な、多国通貨を表現するいくつかの概念モデルを紹介する。


1.量(Quantity)パターン

Martin Fowler のアナリシスパターンでは、数値と単位を組み合わせて量を表現する「量(Quantity)パターン」が紹介されている。
このパターンの典型的なクラス図は次の通りである。

このパターンを使うことで、多国通貨も次のように表現できる。

このモデルは、長さや重さのように換算率が不変な場合にはうまく適合する。

しかし通貨は、時間の経過によって換算率(=レート)が変動するため、この表現だけは必ずしも十分とは言えない。(ただし、最新のレートだけに関心がある場合は、このモデルで十分であろう。)


2. 時間の経過によるレート変動

時間の経過によるレートの変動を考慮すると、レートは、通貨と通貨の組み合わせに加えて、適用期間も特定することではじめて一意となる。これをクラス図で表現すると次のようになる。

上記において、レートの適用期間をアプリケーション要求に合わせて適切な単位にすれば、さまざまな状況をうまく表現できる。すなわち、一定期間で固定の取引レートを定めて運用する特定企業向けのシステムならば、「月」(2000年7月)あるいは「期」(2000年度上期)などで、期間を表現すればよいであろう。また市場の状況に時々刻々対応する必要がある金融システムならば、「分」あるいは「秒」単位でレート変動を管理する必要があるだろう。

さて、ここで適用期間の表現について少し詳しく検討してみたい。
適用期間の管理単位が月、日、分などのように固定されておらず、任意の開始時点と終了時点で表現されるようなケース、すなわちあるレートの適用期間が「2000/7/7 から 2000/8/19」までといった状況も考えられる。
このような状況は、開始と終了の2つの時点を使うことで表現できる。(ここでも、日、時、分、秒など時点の単位をどこまで詳しく表現すべきかはアプリケーション要求に依存する。)

このモデルの問題点は、最新のレートに対しても、有効期限(=期間の終了時点)を決めておかなければならないことであろう。
すなわち、最新のレートについて有効期限は定めず、次にレート値が変動するまで有効であるような状況をうまく表現できない。(例:消費税が5%なのは1997年4月からだが、終了期限は次に7%(10%?)にアップされた時点となる。)

終了期限の問題は、関連の多重度をオプショナル(0..1)にすることで表現できる。しかし、 レートの適用期間が連続していることが前提ならば、次のように「適用開始時点」だけを定義するのが実用的である。こうすることで、最新のレートについては、次に変更が起こるまで無期限に有効であることを表現できる。


3. 基準通貨

さて、ここまでのモデルでは「通貨同士の相対価値であるレートは、通貨の組み合わせごとに決まるもの」と表現した。しかし、実際の通貨市場を考えると、取引通貨のすべての組み合わせに対してレートが決められているわけではない。実際には、東京市場では「円」、ニューヨーク市場では「ドル」といったように、「基準通貨」を1つ定め、残りの通貨は基準通貨に対するレートを定めることで運用されている。

この基準通貨に基づく多国通貨モデルは次のようになる。

これにより、レートを定義する対象が、[全通貨の組み合わせの数] から、[すべての通貨種類−1] に大幅に削減され、かつ重複が排除されるため、レート情報の維持管理は非常に容易になる。

モデル表現についての補足

上記では、モデルの表現方法として、基準通貨を通貨のサブタイプとした。これは、通貨の中である特殊な1つだけが基準通貨であることを、クラス図上で明示することを意図した、やや便宜的なものである。

この他にも、通貨のサブタイプとして基準通貨と一般通貨の2種類を定義する次のような表現方法も考えられる。

このモデルでは、レートは基準通貨には定義されず、外国通貨にだけ定義されることが強調されている。

概念レベルのモデルとしては、このモデルと前述のモデルに本質的な違いはなく、どちらを選択するかは多分に好みの問題である。このように同じ状況に対して複数の表現ができることは一般的であり、その場合に必ずしも唯一の正解があるわけではない。概念モデルは、「問題を理解すること」が大きな目的であるため、なるべく厳密かつ簡潔に定義することだけでなく、直感的なわかりやすさも非常に重要となる。

また、基準通貨のインスタンスが唯一であることを、ステレオタイプに<<Singleton>>と表記する方法も考えたが、これによりGoF[参考文献2]のSingletonデザインパターンの適用と誤解されることを避けるため、ノートとして記述することにした。


4.基準単位による「量パターン」の表現

さて、前述の基準通貨の考え方をFowlerの「量パターン」に戻って適用すると次のようになる。

前述の通貨モデルでは、単位(=通貨)と換算率(=レート)の関連は、時間の経過による換算率の変動を考慮して1対多としていたが、ここでは1対1として表現した。これは、時間の経過により換算率が変動する例を、通貨の他に思いつかなかったためである。

これにより、通貨の場合と同様に、「換算率」は「単位」同士の組み合わせの数分だけ用意する必要はなくなり、冗長性も排除されるため、換算率の整合性の維持管理は容易になる。

なお、モデルの表現としては、以下のように基準単位と一般単位を区別する方法もある。

ところで「長さ」や「重さ」を表現する場合に、基準単位には何を使えばよいのだろうか?直感的には国際標準である「メートル」や「グラム」を採用することが思いつくが、必ずしもそうする必要はない。長さの基準単位を「ヤード」や「インチ」あるいは「尺」としてもモデル上は問題なく、その状況でもっとも一般的な単位を選択すればよいのである。


5.基準通貨の変更

さて、また多国通貨モデルに戻ろう。
それほど一般的なことではないが、時間の経過により、レート値だけでなく基準通貨も変更されることがあり得る。これは1999年に欧州で起きた通貨統合が記憶に新しい。

これをモデルで表現すると次のようになる。

ここでは、基準通貨はもはや不変でない。
したがって、それに合わせて制約の表現も「基準通貨はある時点で唯一である」に変更されている。また通貨と基準通貨の継承関係も動的分類(<<dynamic>>)に変更された。(東アジアで通貨の大統合が実施され、日本の基準通貨が人民元に変更された場合には、通貨クラスに帰属していた人民元オブジェクトは、基準通貨クラスに変化する。)

動的分類を使うことの是非

動的分類は、時間の経過により状態が大きく変化するオブジェクトに対して、状態のスナップショットを異なるクラスとして表現するものである。これはさほど一般的ではないテクニックだが、適切な場面で利用すれば、より表現力豊かなモデルにできる。

一方、動的分類は通常のオブジェクト指向言語ではそのまま実装できない。このため不適切に使った場合にはトリッキーで、かつ誤解を招きやすいモデルになる危険がある。

前述の「基準通貨の変更」モデルはどうだろうか?
ここで議論している多国通貨モデルでは、一貫して時間の経過によるレートの変動が考慮されている。このようなモデルに動的分類を使うことは、読む側に対して、レートが変動する時間経過と、ある時点のスナップショットという2つの視点を強制することになる。これによる混乱を避けるため、動的分類を使わない表現をすると、次のようになる。


6.複数市場の考慮

通貨レートの性質について、もう少し検討してみよう。
ニュースで報道される通貨レートを考えてみればわかるが、実際にはある一時点を取ったとしても、通貨レートは世界中で一意にはならない。すなわち、実際には通貨の取引市場は、ロンドン、ニューヨーク、東京を初めとして世界各地にあり、それらの取引市場によって、同じ時点、同じ通貨であっても異なるレートが定義されているのである。

このような状況を表現するためには、レートが定義される場所、すなわち「市場」を導出する必要がある。レートや基準通貨は、この「市場」と「適用期間」の組み合わせに対して定められ運用されている。この「市場」と「適用期間」の組み合わせがレート運用の単位となるため、ここでは「レート運用単位」と名づけた。

ここでの「市場」は、東京市場、ニューヨーク市場といった正式な通貨市場である必要はない。通貨レートを定義している場所や機関一般を指すものと考えれば、社内レートを定義し運用している特定の企業や部署なども含めることができる。

複数市場モデルの一般単位への適用

最後に、この複数市場を考慮した通貨モデルを一般の単位にも適用してみたい。その場合のクラス図は次のようになると考えられる。

ここでは、単位間の相対価値(=換算率)や基準単位は、ある特定の場所(=多国通貨モデルにおける市場)で、特定の期間を定めて、定義され運用されることが表現されている。
しかし通貨以外に、このような性質を持つ単位はどうやらなさそうである。


7.まとめ

通貨という単位は、相対価値が時間と場所により変動する性質を持っている。
これは相対価値が不変なものとして表現される長さや重さとは根本的に異なるものである。したがって、それを表現するモデルも単純な「量パターン」に比べて複雑になる。

しかし実際のモデリングの場面では、このような通貨の性質を必ずしもすべて表現する必要はない。ここに紹介したモデルはどれも、通貨のある側面を表現しており、どれもが正解になる可能性があるものである。

適切なモデルは、アプリケーション要求に照らして「関心がある範囲まで」を適切に表現したものである。そして、関心がある範囲以上を表現することは、不必要な冗長さと複雑さを招くだけである。


8. 謝辞

矢崎博英さんに感謝します。
「基準通貨の変更」において動的分類を使った表現をすることで、スナップショットと履歴の視点が混在する問題点を指摘していただきました。
また「複数市場の考慮」において概念レベルのクラスとして導出した「レート運用単位」の元となるアイデアを提案していただきました。
その他にも、クラス図の誤りや説明内容の不足箇所などについて、多くの有益な指摘をしていただきました。


9.参考文献

[1] 「アナリシスパターン−再利用可能なオブジェクトモデル」マーチン・ファウラー著、堀内一監訳、児玉公信、友野晶夫訳、アジソン・ウェスレイ・パブリッシャーズ・ジャパン、1998

[2] 「デザインパターン」Gamma, Helm, Johnson & Vlissides著、本位田真一、吉田和樹監訳 ソフトバンク、1995


© 2001 OGIS-RI Co., Ltd.
Index Next
Index Next