ドメイン駆動設計
#クリーンアーキテクチャ
#アーキテクチャ
「コアドメイン」と「サブドメイン」
サブドメイン
差し替え可能
例として認証・アクセス管理用
コアドメインほど重要でないドメイン
アジャイルプロジェクト管理用
サブドメイン
汎用サブドメイン
支援サブドメイン
エンティティが属性として値オブジェクトを持ったりする。
値オブジェクトを入れ替えてエンティティの属性を変更する
エンティティが人間
10円玉が値オブジェクトとか
エンティティ
もし、エンティティの生成が複雑な場合はコンストラクタを直接呼び出すのではなく、ファクトリ(11章)を使用します。
値オブジェクト
副作用がない
不変
交換可能
値の等価性
型が等しく、属性が等しければ同じものとみなす
ドメインサービス
状態を持ってはいけない
ユーザーとロールの切り離し
列車事故とかではなく、問題なのはモデルの混乱
コンテキストマップ
解決空間の全貌を俯瞰する
コンテキスト間
パートナーシップ
共有カーネル
コード共有
腐敗防止層
変換層
別々の道
巨大な泥団子
コンテキスト内では、きれいにモデリングしようとしないこと
システム変更の影響が他のコンテキストに及ばないようにすること
腐敗防止層
コラボレーションコンテキストが認証コンテキストに対して権限を持つユーザーのリソースを問い合わせることなど
リクエストしたリソースをXMLやJSONなどで受け取ったりするかもしれない
アーキテクチャ
使わなければ、リスクが増大する可能性があるときに使う
イベント駆動アーキテクチャ
重複を削除するため
実行者が状態追跡用オブジェクトをチェックして、同じイベントの完了記録が登録済みでないか確認する
または状態追跡用オブジェクトが冪等になるように設計
CQRS
クエリプロセッサ
コマンドプロセッサ
クエリモデル
バリデーション
エンティティ自身に何をバリデーションするか決めさせて、クライアントからは考えないようにする
細かいバリデーションをする手も有る。エンティティ知らない。
複雑なエンティティの作成はファクトリを使う
同一モジュールに有るクラスしかそのエンティティのインスタンスを作成できない
依存性注入は避けるべきなのか
ガベージコレクションを考えて
アプリケーション
コアモデルとやり取りしたり、
参考
Dart/Flutterでドメイン駆動設計(DDD)してみた - 実装編 - のんびり精進
https://docs.microsoft.com/ja-jp/azure/architecture/microservices/model/microservice-boundaries
https://www.infoq.com/articles/ddd-contextmapping/
コンテキストの統合
参考書籍
実践ドメイン駆動設計
https://www.amazon.co.jp/実践ドメイン駆動設計-Object-Oriented-SELECTION-ヴァーン・ヴァーノン/dp/479813161X/ref=pd_bxgy_img_1/356-2469698-2788735?pd_rd_w=eYmun&pf_rd_p=d8f6e0ab-48ef-4eca-99d5-60d97e927468&pf_rd_r=GN64YKBB2V6ENPW5W5D0&pd_rd_r=67995eb9-5cc5-49aa-993e-0524b7ce0565&pd_rd_wg=xdyAb&pd_rd_i=479813161X&psc=1
-------------
マイクロサービス
SOA
サービス指向アーキテクチャー
マイクロサービス境界
https://docs.microsoft.com/ja-jp/azure/architecture/microservices/model/microservice-boundaries
コンテキストマップ作成ツール
https://github.com/ContextMapper
ドメイン駆動事例
ドメイン駆動設計で保守性をあげたリニューアル事例 〜 ショッピングクーポンの設計紹介
レガシーなコードにドメイン駆動設計で立ち向かった5年間の軌跡
https://dev.classmethod.jp/articles/legacy-code-with-ddd/
ドメインエキスパートの知見
ソフトウェアの拡張性を正しい方向で意識できる
手を抜くべき場所や重要な箇所が明確になる
ドメインエキスパートの案より良い解決手段を提示できる。
ユビキタス言語の策定
コミュニケーションずれ解消
説明コスト削減