GitHubで公開されてる色んなDDDのサンプルをのぞいてみた

# はじめに
「[ドメイン駆動設計入門](https://www.amazon.co.jp/dp/B082WXZVPC)」を読んで軽量DDDまではなんとなく分かったつもりになったけど、いざ１から自分でやってみようと思うとどうしていいかわからない...
いいお手本がないかとGitHubの海を潜ってみたら、なんと質が高そうなものがいっぱい公開されているではありませんか！
ということで、その一部をここで紹介させていただきます。

ドメイン駆動設計を勉強し始めて1年も満たない設計初心者が精一杯背伸びして書いた記事です。間違ったことを書いていたらなんなりと指摘してくださると幸いです。

:::note info
以下、githubのstarsやforksの数は 2022/12/24 時点での数値です。
:::

## dotnet-architecture / eShopOnWeb

https://github.com/dotnet-architecture/eShopOnWeb

MicroSoftが[ASP.NETのドキュメント](https://learn.microsoft.com/ja-jp/dotnet/architecture/modern-web-apps-azure/)の参照アプリケーションとして提供してくれているものです。そのドキュメントでは**アーキテクチャの原則から無料で**丁寧に教えてくれています。
サンプルコードにしてはかなり肉厚です。
起動させるのはめちゃくちゃ簡単でビビりました。`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|

- 値オブジェクトは２つだけで、エンティティのインスタンス変数は単純にプリミティブ型を持たせている部分が多い。
- エンティティはすべて抽象クラス`BaseEntity`を継承することで、IDを持たせている。
- BasketAggregate の中にBasketとBasketItemというエンティティがまとめられているなど、しっかり集約を意識したディレクトリ構成になっている印象

# citerus / dddsample-core
https://github.com/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://github.com/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 という２つの境界付けられたコンテキストがあることがわかるような構成になっている
- ドメインオブジェクトでの値はほとんど値オブジェクト化されて扱われている。


# Sairyss / domain-driven-hexagon
https://github.com/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