Value Object の学習メモ

私の Value Object の学習メモ

おれ、アナパタから入ったかも。

DDD

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

私が、 Value Object について、再考するきっかけになったのは,やっぱりこの本。Entity と Value Object の違いといえば、アイデンティティを持つか持たないか、Value Objectはイミュータブルなど。サンプルだと、「顧客」の中に埋もれていた概念「住所」を Value Object として切り出し、よりドメインを明瞭にするという、ごくごく一般的な例が出てくる。


興味を引きつけたのは、8章のブレークスルーの物語。物語を要約すると、ドメインエキスパートと話が噛み合わない日々が続く。が、やがて、対話を通じて「シェアパイ」という重要概念を探り当てる。「そうそう、それ!」 シェアパイの概念を使った実装に代えるため、(現行スケジュールが遅れているにもかかわらず)マネージャーと交渉し了解を得て、実装する。後日談で、やがて、シェアパイの概念が 営業の人たちにも使われていく話(要約すると味気ないなw)。 実世界 -> ドメインモデルの1方向写像ではなく、ドメインモデル->実世界の逆方向写像の話になっていて、読んでいて、ドキドキする。(著者は渦巻き好きなので、ドメインモデルと実世界は循環して捉えていると推測される。)

この物語の重要概念のシェアパイを探りあてる補助線にあるのが、 Value Object。Supple Design も読んでおくと、Value Object とその周辺で役立つパターン(閉じた操作、副作用のない関数)を理解でき、8章がより楽しく読める。

DDDを読んでいると、Value Objectを使って、重要概念を明瞭にすることに、強いこだわりを感じる。

GOOS

実践テスト駆動開発 (Object Oriented SELECTION)

実践テスト駆動開発 (Object Oriented SELECTION)

p16 に 値とオブジェクトの話が出てくる。また、p63から、値型を導入するテクニックとして、分解、発芽、包括が出てくる。
私の場合だと、 「String型、int型の基本データ型に執着していないか?重要概念を見落としていなか?」は時々考えるようになった。多分「発芽」に相当するもの。 DDDのシェアパイの話は、分解か包括か区別はわからなかった。

3部のサンプルの中では、最初ベタ書きだったコードを Value Objectを導入してコードをスッキリさせるシーンが何度か出てくる。

好きな文章は p16にある。

これはつまり、私たちはシステムをふたつの「世界」に分けたいということだ。
ひとつは関数的に扱われる値、もうひとつはシステムのステートフルな振る舞いを実装したオブジェクトだ

実践テスト駆動開発は、アランケイが構想した、オブジェクト同士のメッセージのやりとり重要を強調していることから、後者のオブジェクトがメインの語り口であるものの、前者の「値(Value Object)」についてもキチンと取り扱っており、時折出てくる。(関数型言語は、前者の世界を強調するだろう。Value Objectよりももっとうまく世界を表現できるはず。)

TDDの素振り
  • ローマ数字の足し算や引き算を素振りする。
  • ライフゲームを3回ぐらい解いてみる。4回目は immutable only の縛りで実装してみる。

あたりは、Value Object を再考するきっかけ例題としては良いんじゃなかろうか。


追記

Ruby で実装する場合
class Money < Struct.new(:amount, :currency)

と Structを使う手があることを知った。

別の Moneyの もりもりした実装例を覗いてみるのも手。