2
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

アナリシスパターンで基本型にすべきと提案されている「量」の概念

量とは?

現実世界では、長さを 160cm、金額を 500円 など、量を「数値+概念」で表します。
ところが、システム上ではこれらを単に 160, 500 といった数値で表すことも多いかと思います。

アナリシスパターン では、このような「量」という概念について、単に数値ではなく「量」、つまり 160cm, 500円 として、そのままモデリングすることが提案されています。

量の定義

量は次のように定められた型です。

スクリーンショット 2020-05-15 18.45.54.png

これを使うと、次のような表現が可能です。

スクリーンショット 2020-05-15 18.50.56.png

金額、長さなどは世の中では「数値+単位」で扱われるため、この概念をそのまま型として定義しようとするものです。
単なる数値ではなく、「量」という型に基づいて設計することで、システム内で扱われる値をより正確な概念で扱うことができます。

直感的な感想

最初これをみたとき、 数値だけで保存したほうがデータ小さくなるし、単位が重視される場面はそこまで多くないのでは? と思いました。しかし、後に

  1. そもそも型のモデリング段階で、データの大きさなどの実装を考慮することは無意味
  2. 量という概念は、直感的な解釈よりも広い

という事に気づきました。

1. モデリング段階で実装を考慮すること

これは様々なところで言われていることですが、モデリングの段階で実装を考慮すると、特定の実装に依存したモデリングをしてしまう要因となります。レイヤードアーキテクチャに代表されるように、特定の実装に依存することはあまり推奨されることではないと認識しています。

2. 量という概念は、直感的な解釈よりも広い

これについては、そもそも「単位」が何かを理解する必要がありました。
Wikipedia(単位)によると、単位とは

単位(たんい、英: unit)とは、量を数値で表すための基準となる、約束された一定量のことである。

とあります。
つまり、単位というのは「cm, kg, 円」のように単に後ろにつける符号に限らず、例えば

  • 容積を表すための「東京ドーム ○個分」
  • 体重を表すための「りんご ○個分」

なども量の単位として扱うことができます。

例: 商品代金の支払い

買い物をする場合、商品代金お金 を使って支払います。
しかし、値引クーポンポイント などを使うことで支払う金額をディスカウントできることがあります。

一般的な解釈としては、次のような式が成立します。

商品代金 - (値引クーポンの値引き額 + ポイントの値引き額) = 支払うお金

ここで、上の式に現れた概念はすべて「量」です。
商品代金は基本的にお金で払う という前知識が邪魔をしていましたが、上の式は下と同じです。

商品代金 = 支払うお金 + 値引クーポンの値引き額 + ポイントの値引き額

つまり、お金を特別視する必要は無い ということになります。
したがって、この関係性は次のような図で表せます。1

スクリーンショット 2020-05-15 19.32.32.png

システムでこのように定義することができれば、今後「支払い方法を増やす仕様変更」などが入った場合にも容易に改修することができます。
「量」という現実世界に即した概念でモデリングを行うことで、より本質的な洞察をシステムに組み込むことが可能となります。

まとめ

「量」という概念を使うことで、本質的な概念を抽出できる例を示しました。
アナリシスパターンでは、量についてより詳しい記述2もありますので、ぜひ読んでほしいです。

参考文献:アナリシスパターン

システムでよく遭遇する「型の構造」の詳細な分析が記された本です。
読むのが少し難しいですが、理解すると非常に納得感が得られます。

Google ブックスリンク

  • 書籍名: アナリシスパターン: 再利用可能なオブジェクトモデル
  • 著者: マーチンファウラー
  • 翻訳: 堀内一, 児玉公信, 友野晶夫, 大脇文雄
  • 出版社: アジソンウェスレイパブリッシャーズジャパン, 1998

  1. 量同士の演算操作を定義する方法は、アナリシスパターンにて詳しく記述されています。ここでは簡単に数量の合計値で例示しています。 

  2. 例えば、換算率を定義することで「100ポイントを1円分と扱う」といったことも可能です。これを使うと、上の例で「円分ポイント」とした単位を単に「ポイント」として、ポイントの概念をそのまま入れ込むこともできます。 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
2
Help us understand the problem. What are the problem?