95
74

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

はじめに

ドメイン駆動設計入門」を読んで軽量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

95
74
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
95
74

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?