[5]エンティティの振る舞い(メソッド)を検討
続いて、エンティティが持つ振る舞いについて検討していきます。ソフトウェア要件に登場する動詞に注目することで、メソッドの候補を洗い出していきます。
ここでは、テナントに対して「アクティブ状態を示す属性」を追加するのではなく、「アクティベートする」「ディアクティベートする」といったビジネス用語をそのまま振る舞いとして追加しています。これはDDDの設計パターンの1つである「意図の明確なインターフェイス」の考え方に従っています。
意図の明確なインターフェイスとは、クラス名やメソッド名に、その効果と目的に関する名前をつけて意図が正確に伝わるようにすることです。利用者がインターフェイスの中身を意識しないで済むように、実装方法や手段を名前に含めないようにします。また、振る舞いを実装する前にテストを書くことにより、利用者の視点で設計を行うようにします。
エンティティでは同一性を識別する本質に絞り込むことが重要であるため、それ以外は別のオブジェクトとしてモデリングしています。ここでは「ユーザー」から「個人」というエンティティを切り出し、「個人情報」という値オブジェクトを追加しています(なお、ユーザーのデータ構造を管理する方法について、ヴァーン・ヴァーノン氏は自分自身のブログにて「Fundamental Identityパターン」として整理しています)。
モデルの発展に合わせて、出てきた用語は随時、用語集に格納していきます。
[6]エンティティの作成方法を検討
それでは、これまで検討してきたモデルをコードとして実装します。
コンストラクタ
これまで説明してきたように、エンティティは一意である必要があります。そのため、エンティティのコンストラクタでは「識別子の生成に必要な情報」や「問い合わせを行うために必要な情報」を引数として渡します。これにより、エンティティ生成時からオブジェクトを一意に特定できるようになります。
ファクトリの検討
もし、エンティティの生成が複雑な場合はコンストラクタを直接呼び出すのではなく、ファクトリ(11章)を使用します。例えば、ユーザーエンティティの場合、テナントの「ユーザー登録する」メソッドがファクトリとなります。テナント経由でユーザーの作成を行うことで、オブジェクトの状態を正しく管理できます。
コンストラクタから「自己カプセル化」での呼び出し
コンストラクタの引数に渡された値が、不正でないことを保証するため、適切にバリデーションチェックを行う必要があります。この時、コンストラクタから直接フィールドにアクセスするのではなく、セッターを呼び出すことで、不正な値を防ぐことができます。
このような、クラス内部からのアクセスもアクセサメソッド経由で行うことを「自己カプセル化」とマーティン・ファウラー氏は呼んでいます(この後の「属性のバリデーション」にてコード例を紹介しています)。
この記事は参考になりましたか?
- IDDD本から理解するドメイン駆動設計連載記事一覧
- この記事の著者
-
WINGSプロジェクト 青木 淳夫(アオキ アツオ)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
