##前書き
ドメイン駆動開発について勉強したので自分用にメモ
##ドメインとは
・単語の意味:ドメイン=領域
・ここでいう領域→プログラムを適用する対象となる領域
・例:物流システムのドメイン=荷物、輸送手段、輸送者、顧客、倉庫、経路などなどなど
→業務知識って言い換えてもいいのかも
##ドメイン駆動設計とは
顧客と開発者が直面している課題の解決のためにドメインの知識を正しく用いて(取捨選択して)設計すること。
つまりシステム作るとき業務知識ちゃんと理解して設計しろよってことかな
当たり前じゃんって思ったけど、しっかり抜け漏れなく設計するのは意外と細かいとこまで注意してドメインモデルを作成する必要がありそうです。
##ドメインモデル
大枠はオブジェクト指向のクラスみたいなイメージかな
ただこの時にドメインの知識をいれる必要がある。
必要なメンバだけでなく、それが動的に変化していい値なのか、不変にしなきゃいけない値だとか、そのドメイン特有のルールだとかをサービスロジック側で意識しなくても不整合が生じないようにする。
いろんな人がそのクラスを扱うこととなってもドメインルールを強制できるような設計を心がけるのがドメインモデル。
例:クラスを用意する。nameプロパティを持つ。nameはインスタンス作成後は変更不可。というドメイン
×メンバ全てにgetter setterをつける。setterがあるのでサービスロジックから自由にnameの変更が可能となり、ドメインルールを守れていない。新たにプロジェクトに加わった人が間違えてしまう可能性が生じる。
〇nameはsetterを用意せず、コンストラクタやファクトリなどでのインスタンス生成時のみ設定できるようにする。新規にプロジェクトに参加した人もnameは上書きできないというルールを守ることになる。
##まとめ
業務知識を取捨選択して設計に落とし込むこと
それを誰もがルールを守らざるを得ないようにドメインモデルを作成すること
##参考にさせて頂いたサイト
https://codezine.jp/article/detail/11968
https://little-hands.hatenablog.com/entry/2017/10/04/201201