ドメイン駆動設計入門という本を読んだので、
備忘録として知識をアウトプットして自分の考えを整理したい。
読者としてはドメイン駆動設計に興味のある人、ドメイン駆動設計入門を読んでみたい人です。
ドメイン駆動設計入門について
個人的にはとにかくわかりやすいと思った。
本書に載っているソースはC#で書かれていたが
わたしはJavaをやっているので問題なく読めた。
オブジェクト指向言語をやっている人ならなんなく読めるはずなのでぜひ読んでほしい。
ドメイン駆動設計とは
なんやかんや言っているが乱暴に要約すると
リファクタリングがしやすい設計手法だと言える気がする。
特徴としては、ドメイン(独立したルールを持つオブジェクト)をソースコード化して、
ルールを一つのドメインオブジェクトにまとめることによって、
ソースコードからルールを読み取ることができるようになるし、
修正箇所を一か所にまとめやすくできるため保守や改善がしやすい設計になるということだと私は解釈した。
キーワード
- ドメイン
- 値オブジェクト
ドメインとは
プログラムを適用する対象となる領域。
例えば会計システムなら金銭や帳票。
物流なら貨物や倉庫、輸送手段の概念。
なにに目を当てなければいけないかを明確化するための概念としてのドメイン。
値オブジェクト
値オブジェクトの性質
- 不変である
- 交換が可能である
- 等価性によって比較される
「不変である」について
例えばシステムでの処理の中でUserオブジェクトが作成されたとします。
そうするとUserオブジェクトの中にはuserId、firstName、lastNameのフィールドが作られます。
このときuserIdやfirstName、lastNameのどれか一つでも処理中に変更されるとすると
プログラマはデータのライフサイクルとデータの変更タイミング、変更内容について意識しながら
プログラムを書く必要があります。
しかし、不変である値オブジェクトとして生成すれば、
データの変更タイミング、変更内容については意識せずプログラムを書くことができます。
そして不変であることはオブジェクトの正しさを強制します。
不変なオブジェクトとして生成するためにはオブジェクトがルールを持ち、
不正な値ではオブジェクトが生成できないことを表現する必要があります。
「交換が可能である」について
上記のような不変なオブジェクトを生成すれば、
オブジェクト内の値は変更できないため代入操作による交換以外の方法をできないように強制されます。
「等価性によって比較される」について
値オブジェクトは値を表現するため、オブジェクト同士の比較が行われます。
つまり、値オブジェクトを比較するためのequal()関数が必要になります。
このequal()関数を書くことが強制されるため、
システムに新たなルールが追加され、値オブジェクトに新たなフィールドが追加されても、
equal()関数の中身を変えるだけで改修を終えることができます。
最後に
上記までがドメイン駆動設計入門の第2章までの内容になります。
値オブジェクトの表現だけでもかなり実践できそうな内容ではないでしょうか?
わたしが今まで作ったものは少ないですが私でさえもこれをやっていたら
無駄な調査を回避できたのになという内容でした。
次にドメイン駆動設計を実践できる場所があったらぜひやってみたいと思います。
第三章は別の記事で。。。
ご拝読ありがとうございました。