https://zenn.dev/hisamitsu/articles/2937fc4dd9bd4c
DDDで開発しようと思って、入門書を勉強して理解した気になっても、いざコードを書こうとすると、なかなか実装のイメージがつかなくて手が止まる、といったケースはあるかと思います。少なくとも、私はそうでした。 この記事では、一旦、DDDのモデリングの部分は置いておいて、コードを実装する上で知っておいた方が良さそうなことをいくつかピックアップして紹介していきたいと思います。いずれも基本的な内容のため、DDDを習得している方にはあまり新しい発見はないかもしれません。 なお、例として用いる言語はTypeScriptです。
本題に入る前に、まずはDDDで実装するモチベーションを上げていただくために、実際にDDDで実装してみてよかった点をいくつかあげます。
一応、よくなかった?点も書いておきます。
ドメインオブジェクトは、基本的にエンティティを使って表現します。エンティティと聞くと、ORMのエンティティが思い浮かぶかもしれませんが、全く別物です。ORMのエンティティは、TypeORMなどの特定のライブラリに依存するものですが、ドメイン層のエンティティはプレーンなオブジェクトで、何にも依存してはいけません。ORMのエンティティにロジックを書く、といった横着はせず、諦めてドメイン層に別のエンティティを用意しましょう。 以下、シンプルな例です。
ドメイン層のエンティティ
export default class User {
id: number;
familyName: string;
givenName: string;
constructor(id: number, familyName: string, givenName: string) {
this.id = id;
this.familyName = familyName;
this.givenName = givenName;
}
}
ORMのエンティティ
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity()
export default class User {
@PrimaryGeneratedColumn()
id: number;
@Column({ type: "varchar", default: "" })
familyName: string;
@Column({ type: "varchar", default: "" })
givenName: string;
constructor(id: number, familyName: string, givenName: string) {
this.id = id;
this.familyName = familyName;
this.givenName = givenName;
}
}
リポジトリの取得系のメソッド(findなど)は、DBから取得した値をそのまま返すのではなく、ドメインオブジェクトに詰め替えてから返します。これにより、リポジトリから値を受け取ったユースケースは、すぐにドメインオブジェクトのメソッドを呼び出すことが可能になります。以下、例です。