はじめに
本記事は以下の書籍を読んで学んだことをまとめることを目的としています。
ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本 | 成瀬 允宣 |本 | 通販 | Amazon
DDDで出てくる概念
DDDで出てくる概念を整理します。
ドメイン
プログラムを適用する対象の領域のことを指します。
通販サービスを例にすると、商品、買いかご、顧客、、など様々な通販サービスの概念があります。こういうものがドメインに含まれます。
ただ、ドメインが何かというより、何がドメインに含まれるかが重要です。
なぜなら、ドメイン次第で作成するシステムの規模やどこまで支援するサービスなのかが決まってくるからです。
ドメインモデル
ドメインの概念をモデリングして得られたモデルがドメインモデルです。
そもそも、書籍にはモデルとは、
現実の事象あるいは概念を抽象化した概念
とありました。
通販サービスにおける顧客と、飲食店の予約サービスにおける顧客では必要な情報が違ってくるように、同じ顧客でも、ドメインの中でどのような役割があるのかによって表現する概念が異なってきます。
そのドメインの中で必要となる情報を抽出して象った(かたどった)ものをドメインモデルと呼ぶと理解しています。
ドメインオブジェクト
上記で述べたようにドメインモデルの段階ではまだ、概念を抽象化した知識です。
ドメインモデルをソフトウェア上で動作するようにしたものがドメインオブジェクトです。
ここで重要なのが、利用者が何に課題を感じていて、何を解決したいのかを考えることです。
この2つを理解してソフトウェアに反映していく必要があります。
値オブジェクト
システムならではの値を表現したいときに使われるものと理解しています。
例えばstringでは表せない文字数制限や入力できる文字種の制限など、そのシステム固有のルールを表現をしたい、かつ値の性質を適用したいときに使われます。値の性質とは以下が挙げられます。
- 不変
- 交換可能
- 等価性による比較
この性質を持った値を使用したいとき、値オブジェクトが使われます。
実装上の注意
- 不変であるため、Changeメソッドなどは値オブジェクトに作成しません。
- stringやint型のような値型と同様に値の代入(交換)によってのみ値オブジェクトを変更します。
- 値型と同じように、値オブジェクト同士が比較できるようにEqualsメソッドをオーバーライドします。
値オブジェクトを使うメリット
- 値の意味や仕様がコードを読むだけでわかる
- ロジックの散在を防ぐ
- 不正な値を防ぐ
- 誤った代入を防ぐ
特に上2つのメリットが値オブジェクトを使う意味であると考えています。
- 値の意味や仕様がコードを読むだけでわかる
上記を言い換えると、コードがドキュメントになるということです。わざわざ仕様書や設計書を読まなくてもコードを見て理解できるなら、そんな楽なことはないと思います。値型を使っているだけではそうはなりません。
- ロジックの散在を防ぐ
これもとても大きな意味があると思います。単純に変更箇所が一か所になるからです。
さいごに
ここまでお読みいただき、ありがとうございました。
長くなるので、#2に続きます。