SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

IDDD本から理解するドメイン駆動設計

実践DDD本 第6章「値オブジェクト」~振る舞いを持つ不変オブジェクト~

IDDD本から理解するドメイン駆動設計 第6回

  • X ポスト
  • このエントリーをはてなブックマークに追加

複数コンテキストの結合を緩やかにする値オブジェクト

 引き続き、SaaSOvationを例に値オブジェクトの実装について見ていきましょう。複数のコンテキストを扱う場合、値オブジェクトを使うことでコンテキスト間の結合を緩くできます。

コンテキスト間の結合を緩める値オブジェクト
コンテキスト間の結合を緩める値オブジェクト

 5章では、認証・アクセスコンテキストの「ユーザ」と「ロール」のエンティティ(正確には10章で紹介する集約)について検討しました。コラボレーションコンテキストでもユーザやロールと似た情報を取り扱いますが、コンテキスト間の結合を緩やかにするために「ユーザ」と「ロール」をそのまま使用せずに自分のコンテキストで必要な情報を扱う「値オブジェクト」を用意しています。具体的には「モデレーター」「オーサー」「クリエーター」「オーナー」「参加者」を値オブジェクトとして作成しています。

 このような他コンテキストの「エンティティ」「値オブジェクト」「標準型」といったオブジェクトを、自コンテキストではミニマムに保とうといった考え方は、コンテキスト間の結合を緩めるために有効といえます。

区分や種類を示す標準型(タイプコード)

 タイプコードとはオブジェクトの種類を示すコードで、多くのアプリケーションで利用されている概念です。ヴァーノン氏は、このタイプコード(日本語だと「区分値」が近いかもしれません)にあたるものを「標準型」と呼んでいます。

 具体的なタイプコードの例を見てみましょう。ある電話番号のタイプを「自宅」「携帯」「職場」に分類するシナリオがあるとします。

標準型(タイプコード)の実装ト
標準型(タイプコード)の実装

 上図のプログラムは難しくないと思いますが、左側のタイプコードの場合、電話番号の区分(タイプ)が数値型(int)のため、0~2以外の範囲外である値が設定されてしまう恐れがあります。そこで、ファウラー氏の書籍「リファクタリング」では「クラス(もしくはサブクラス、もしくはState/Strategy)によるタイプコードの置き換え」といった手法で、タイプコードをなくすことを提示しています。しかし、これらの手法は作成するクラス数が多いため実装が複雑になりがちです。そこでヴァーノン氏は、このような区分において、列挙型(enum)の使用を強く推奨しています。上図の右側がenumを用いて標準型を実装した例となります。

列挙型(enum)で標準型を実装

 列挙型は少ないコードで区分値を取り扱える機能を備えています。Javaでは列挙型にメソッドを書くことができるため、コードに応じた描画文字への取得や、状態に応じた処理の振り分けも列挙型の1カ所で実装できます(C#では拡張メソッドを用いて列挙型に処理を追加できます)。このように列挙型を用いることで、境界づけられたコンテキストごとに異なる標準型機能をシンプルに管理できます。

値オブジェクトで標準型を実装

 別のパターンとして通貨のケースを考えてみましょう。通貨単位には円、米ドル、ユーロなどさまざまな通貨種別があることが想像できます。これはマスタデータとして、システム全体で共有される不変の値となります。この場合、列挙型でコーディングする以外に、永続化層(DB)からデータを取得して値オブジェクトに展開する手法も存在します。

値オブジェクトのインスンタンスで標準型を表現
値オブジェクトのインスタンスで標準型を表現

 上図では標準型を列挙型ではなく、対応する値オブジェクトとしてコーディングし、それぞれの通貨型の概念を複数のインスタンスとして表現しています。

 ここまでを簡単にまとめると、コンテキストの中に存在するオブジェクトとしては、エンティティ、値オブジェクト、標準型(列挙型もしくは値オブジェクトで実装)といったパターンがあることを確認できました。標準型や値オブジェクトを活用し、コンテキスト同士の結合が最小になるミニマリズムな設計を意識するといいでしょう。

次のページ
値オブジェクトの実装コード

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
IDDD本から理解するドメイン駆動設計連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 青木 淳夫(アオキ アツオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 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本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/10184 2017/06/02 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング