はじめに
「ドメイン駆動設計入門」を読んで軽量DDDまではなんとなく分かったつもりになったけど、いざ1から自分でやってみようと思うとどうしていいかわからない...
いいお手本がないかとGitHubの海を潜ってみたら、なんと質が高そうなものがいっぱい公開されているではありませんか!
ということで、その一部をここで紹介させていただきます。
ドメイン駆動設計を勉強し始めて1年も満たない設計初心者が精一杯背伸びして書いた記事です。間違ったことを書いていたらなんなりと指摘してくださると幸いです。
以下、githubのstarsやforksの数は 2022/12/24 時点での数値です。
dotnet-architecture / eShopOnWeb
MicroSoftがASP.NETのドキュメントの参照アプリケーションとして提供してくれているものです。そのドキュメントではアーキテクチャの原則から無料で丁寧に教えてくれています。
サンプルコードにしてはかなり肉厚です。
起動させるのはめちゃくちゃ簡単でビビりました。src
以下でdocker-compose build
からのdocker-compose up
するだけです。
項目 | 特徴 |
---|---|
言語 | C# |
フレームワーク | ASP.NET |
stars | 8.3k |
forks | 4.2k |
ドメインオブジェクトの特徴
ドメインモデル | クラス名 |
---|---|
エンティティ | Basket, BasketItem, Buyer, PaymentMethod, Order, OrderItem, CatalogItem, CatalogType, CatalogBrand |
値オブジェクト | Address, CatalogItemOrdered |
- 値オブジェクトは2つだけで、エンティティのインスタンス変数は単純にプリミティブ型を持たせている部分が多い。
- エンティティはすべて抽象クラス
BaseEntity
を継承することで、IDを持たせている。 - BasketAggregate の中にBasketとBasketItemというエンティティがまとめられているなど、しっかり集約を意識したディレクトリ構成になっている印象
citerus / dddsample-core
DDDの生みの親であるEric Evansの会社Domain Language とスウェーデンのCiterusという会社の共同作業で進められているプロジェクトです。
エヴァンス本で例として挙げられていた貨物輸送システムそのもの ...ではなさそうですが、それに近い何かがここにあります。
ただし、至る所にTODOアノテーションコメントが多く見受けられることから、まだまだ開発途中だと思われます。
項目 | 特徴 |
---|---|
言語 | Java |
フレームワーク | Spring Boot |
Stars | 4.2k |
forks | 1.3k |
ドメインオブジェクトの特徴
ドメインモデル | クラス名 |
---|---|
エンティティ | Cargo, Voyage, Location |
値オブジェクト | Itinerary, Delivery, Leg, RoutingStatus, TrackingId, VoyageNumber, TransportStatus, CarrierMovement, UnLocode, CarrierMovement |
- 値オブジェクトはすべて
ValueObject
というインターフェースを実装しており、等価性の判断を持つメソッドsameValueAs
という持つことを強制されている。 - エンティティもすべて
Entity
というインターフェースを実装している。
ddd-by-examples / library
こちらは実際の公共図書館のビジネス要件に基づいてモデリングされているとのことです。
特筆すべきこととしてはイベントストーミングや実例マッピング言うモデル化の手法が採用されており、その様子が詳細に書かれているということです。
イベントストーミング、実例マッピングの説明は以下のサイトが分かりやすかったです。
イベントストーミング:https://qiita.com/tsukmr/items/91f5be9ba1004c19ec26
実例マッピング:https://nihonbuson.hatenadiary.jp/entry/ExampleMapping
項目 | 特徴 |
---|---|
言語 | Java |
フレームワーク | Spring Boot |
stars | 3.4k |
forks | 558 |
ドメインオブジェクトの特徴
ドメインモデル | クラス名 |
---|---|
エンティティ | Book, Patron, LibraryBranch |
値オブジェクト | BookId, Title, Author, PatronId, などその他多数 |
- Catalogue と Lending という2つの境界付けられたコンテキストがあることがわかるような構成になっている
- ドメインオブジェクトでの値はほとんど値オブジェクト化されて扱われている。
Sairyss / domain-driven-hexagon
C#やJavaが多い中、TypeScriptでもよさそうなものが見つかりました。
ドメインや実装に関してREADMEで結構詳しく解説してくれています。
項目 | 特徴 |
---|---|
言語 | TypeScript |
フレームワーク | NestJS |
Stars | 8k |
forks | 749 |
ドメインオブジェクトの特徴
モデル | クラス |
---|---|
エンティティ | user, wallet |
値オブジェクト | Address, Email |
-
*.value-object.ts
や*.entity.ts
のようにファイル名からそれが何を表すファイルなのかがわかるようになっている。 - findUserなどではcontoroller にSQLが書かれているが、createUser ではしっかりと層分けされているといったように、典型的なCQRSが採用されている。
その他
ほかにも色々と気になったものがありましたが、ここでは紹介しきれなさそうなのでリンクだけ張っておきます。
(C#) https://github.com/ardalis/CleanArchitecture
(C#) https://github.com/system-sekkei/isolating-the-domain ← 日本語での解説あり
(Go) https://github.com/ThreeDotsLabs/wild-workouts-go-ddd-example
(PHP) https://github.com/jorge07/symfony-5-es-cqrs-boilerplate
(Kotlin) https://github.com/Creditas/kotlin-ddd-sample