#fukabori をきいて Value Object と Value Object パターンについて頭の中を整理

連休の余韻も楽しんだので今日から散歩を再開した。ちょっと前までは「陽の光を浴びなきゃ!」と思って3時過ぎにウロウロしてたけど、これからはもうちょっと涼しい時間帯がいいなと思って、夕暮れ時に散歩しながら fukabori.fm を聴いてた。Value Object のお話。面白いなぁ

kumagi さんの記事はこちら

お絵描き

PoEAA や DDD はだいぶ前に読んだことがあるけど、Value Object を雰囲気で捉えてるからちゃんと見直しておこうと思って、調べたりしながら絵を描いた。こういうことなのかな?

(絵をかくほどでもなかった・・・

Value Object とは?

kumagi さんも書いてる通り

https://martinfowler.com/bliki/ValueObject.html より

Objects that are equal due to the value of their properties, in this case their x and y coordinates, are called value objects.

「プロパティの値で等価比較されるオブジェクト」

Value Object の定義。だから、言語依存の実装のイミュータブルにするみたいな話や、型を持たせたりロジックを持たせると便利って話は、その外側の「Value Object をどう使うか」という話であって 、Value Object 自体ではない

合成物でなければならないか?

ところで、ポッドキャストや kumagi さんのブログの中で

Value Objectの出発点はそもそもcompound(合成物)であって単一の値を包めとは一言も言ってない

ってあるけど、単一の値でも「プロパティの値で等価比較される」という定義を満たすのであれば Value Object として良いと僕は思っている

例えば Vaughn Vernon は「実践ドメイン駆動」の中で、String 型をラッピングした Value Object を使用してユビキタス言語を表現している

"6.1 値の特徴" より

このname をString 型からThingName 型に変更した。

たしかに出発点は合成物だったけど、定義から考えると単一の値でも問題なさそう

Value Object パターン

さて、Eric Evans のドメイン駆動設計

に「値オブジェクト(VALUE OBJECTS)」という節がある。そこには「Value Object を使用したモデリング」について書かれていて

  • 値による同一性

という Value Object の定義以外にも

  • 不変なものとして扱うこと(必須ではない)

というテクニックが書かれている(「実践ドメイン駆動」にはさらに、型安全の利用についてや、副作用のない振る舞いなどについても書かれている)

そして、この書籍はパターン集であり「値オブジェクト(VALUE OBJECTS)」はパターンの名前になっている

だから「Value Object を利用したモデリング」=「値オブジェクト(VALUE OBJECTS)」と呼ぶことができる

なんか違うパターン名にしてほしかった!

話の元

記事でもポッドキャストでも触れてないけど、まぁ、たぶんこの話の発端は、この書籍かな

gihyo.jp

"3.4.2 値オブジェクト" に、こう書いてある:

値オブジェクト(Value Object)とは、値をクラス(型)として表現する設計パターンです。

それと、こちらもかな?

gihyo.jp

Chapter 1 の "「値」を扱うための専用のクラスを作る" に、こう書いてある:

値の種類ごとに専用の型を用意するとコードが安定し、コードの意図が明確になります。このように、値を扱うための専用クラスを作るやり方を値オブジェクト(Value Object)と呼びます。

見て分かる通り、この2冊の書籍では「DDD の Value Object パターン」のことを指している。これを「Value Object 自体」のことを言ってるつもりで聞くと「広すぎっ!」ってなる

だから、書籍の記載は間違ってないんだけど、ただ、個人的には、あんまり勘違いがないように、↓これくらいの表現をするのが好きかなぁ

「値オブジェクトパターンとは、値オブジェクト(Value Object)を使用して、値をクラス(型)として表現する設計パターンです」

ちなみに「実践ドメイン駆動」の中では「値オブジェクトを"使って"モデリングする」とは言ってるけど「このような実装パターンのことを値オブジェクトと呼ぶ」とはたぶん言ってなくて、好きな感じ

まとめ

Value Object って言葉が出てきたらそれが構成要素としての Value Objectのことを言ってるのか、それともパターンとしての Value Object のことを言ってるのか、気をつけて聞こうと思った

あと、自分がしゃべるときは、周りの人が混乱しないように構成要素として扱っておいて、パターンのことを言うときには「Value Object パターン」って言っておこうかなと思った

それともうひとつ。Value Object の定義の違いの話と、Value Object を多用した設計パターンの好き嫌いの話は、別の話だから、区別して聞こうと思うのだった

面白かった。勉強になったー