DDDに関わるアーキテクチャ
ドメイン駆動設計で実装を始めるのに一番とっつきやすいアーキテクチャは何か - Qiita
DDDにまつわるほげほげアーキテクチャの用語を整理する
結論:Onion architectureがおすすめ
(Eric Evansの)layered architecture
エリック・エヴァンスのドメイン駆動設計で紹介されたアーキテクチャ
https://gyazo.com/a440b26cce7fb5d7890067fc2be9c58c
👎infra層の都合にDomain層が依存している
ドメイン駆動 + オニオンアーキテクチャ概略 - little hands' lab
この点はOnion Architectureで解決される(DDDに関わるアーキテクチャ#5b73be113f442500002c1225)
今積極的にlayered architectureを選択する理由はない?kadoyau.icon
各レイヤーの説明
UI
input/output
例
view
レスポンス整形とか
Application
混乱しがちなサービスという概念について - かとじゅんの技術日誌
P of EAAでいうサービスと、DDDいうサービスは、目的が異なります
Domain
ドメイン
Infrastructure
ドメインのインタフェースの実装
何が何でもドメイン層のロジックを実現する
実際のシステム構成に依存/考慮した実装になるため、必然的に泥臭くなる
インフラ関連の接続に必要なクラス(RedisとかMySQLの接続クラス)は別ディレクトリのほうがいいかも
https://gyazo.com/4d066ea1b22b2730ac3020954a2c944e
https://www.safaribooksonline.com/library/view/software-architecture-patterns/9781491971437/ch01.html#idp782544
各レイヤは疎結合
リクエストは各レイヤを必ず上から順番どおりに通る
Onion Architecture
https://gyazo.com/e1256daefb0eef68eb5ffdd9c57908a8
https://gyazo.com/4df38ec2d5f7e302e56f7c87ee4052c9
新卒にも伝わるドメイン駆動設計のアーキテクチャ説明【DDD】 - little hands' lab
/icons/重要.icon ドメインは何にも依存していない
layered architectureはドメイン層がインフラ層に依存している。一方、これらはドメイン層は何にも依存していない(依存性逆転の原則)
ドメイン層は実装の都合なんか考えない理想の世界を描く。よって処理が効率的ではないコードになることがある
実装はインフラ層で頑張る。たとえばデータを永続化することを想像しよう。MySQL向けのドライバーを使った実装をしたり、チューニングしたりするだろう
ドメインは永続化されるストアが何かには興味がない。インタフェースの通りに動けば(与えた引数によって正しい型の値が帰ってくれば)なんでも良い
このレイヤリングによって、インフラ層を変えれば、実装を差し替えられることができる。未来にすごいインフラができたらそっちをつかってめっちゃ効率化できるかもしれない。そのときにドメインのコードは修正の必要がない。
これが飲めない場合、「どれぐらいDDDするか」みたいな会議が始まる
Hexisagonal architectureやClean architectureもやっていることは概ねこれと同じらしい
ApplicationServiceはClean architectureでいうUseCase
ドメイン駆動 + オニオンアーキテクチャ概略 - little hands' lab
ドメイン層に具体的な名前をつけると破綻する
例
getHogeByApi() -> APIでとらなくなったら破綻
getPoyoRecords() -> DBからとらなくなったら?
Domain層のオブジェクトとUse Case層のオブジェクトは別物
ここ理解と上の図があっていないkadoyau.icon
Use Case層のオブジェクトは、Domain層のEntityのうち、そのUse Caseで興味のあるEntityを返す
code:_
Domain: () => GenericEntity
UseCase: (who, what, for) => GenericEntity
Presantation: (GenericEntity) => SpecificEntity
ここは現実的にはDomainのEntityを返してもいいと判断することがあるkadoyau.icon
Presantationは、Use Caseが返したEntityから、必要な情報だけを取り出した別のEntity(SpecificEntity)に詰め替える。ControllerはそのEntityを使う
なにをDomainにして何をUseCaseにするのか?
オニオンアーキテクチャにておいて、ドメイン層とアプリケーション層の責務はどう違うのか - little hands' lab
この記事の説明では、データ整合性の担保だけをするのがドメインで、それを利用したロジックはすべてApplication(UseCase)になっている
コードの寿命の違い:UseCaseは頻繁に変わる可能性があるが、ドメインは相当不変
ぼくのかんがえた最強のUsecaseの作り方~あるいはビジネスロジックとはなにかという1つの回答~ - Speaker Deck
#ソフトウェア設計