1
1

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.

一度は聞いたことがある「ドメイン駆動設計」の紹介と実践談

Last updated at Posted at 2022-04-12

紹介

システムが扱う領域を、ドメインといいます。
銀行システムなら、銀行業務のドメインです。

このドメインを中心に据えた、
「設計の進め方」と「デザインパターン」が、
がドメイン駆動設計として、提唱されています。

英語では「domain-driven design」と表記され、略称は「DDD」です。

設計の進め方

大まかな流れを紹介します。

ドメインモデル

ドメインの専門家と協力して、設計を進めていきます。
銀行システムなら、銀行員です。

専門家から引き出した知識を、ドメインモデルに整理していきます。

ユビキタス言語

ドメインには専門用語があります。
銀行システムなら、当座などです。

それらをユビキタス言語に整理することで、「認識齟齬」や「表記ゆれ」を防ぎます。

デザインパターン

代表的なものを紹介します。

Layered Architecture

プログラムを、4つのレイヤーに分割します。
分割することで、読みやすくて変更しやすいプログラムになります。

レイヤー 説明
プレゼンテーション ユーザに対して情報を表示し、ユーザの命令を解釈する。
アプリケーション アプリケーションの活動を調整する薄いレイヤ。
ビジネスロジックを含まない。
ドメイン ドメインについての情報を含むレイヤ。業務ソフトウエアの心臓部。
インフラストラクチャ 他のすべてのレイヤを補助するライブラリとして働く。

Value Object

つぎの例のように、値をオブジェクトにします。

Value Objectを使わない例

メインロジック
  private void sendMessage(String to, String message) {
    validate(message);
    send(to, message);
  }

  private void validate(String message) {
    // 禁則文字が含まれていないかチェックする。
  }

  private void send(String to, String message) {
    // 送信する。
  }

Value Objectを使った例

メインロジック
  private void sendMessage(Account to, Message message) { // GOOD: 引数が分かりやすい。
    message.validate();
    send(to, message); // GOOD: 引数の順番を間違えてsend(message, to)にしたら、コンパイルエラーになる。
  }

  private void send(Account to, Message message) {
    // 送信する。
  }
値:Message
/**
 * メッセージ。
 */
public class Message {

  private final String value;

  public Message(String value) {
    this.value = value;
  }

  public String getValue() {
    return value;
  }

  // POINT: メインロジックから切り出す。
  // GOOD: 再利用しやすい。
  // GOOD: メインロジックの肥大化を防げる。
  public void validate() {
    // 禁則文字が含まれていないかチェックする。
  }
}
値:Account
/**
 * アカウント。
 * 例:A1234
 */
public class Account {

  private final String value;

  public Account(String value) {
    this.value = value;
    // POINT: 5桁の英数字という決まりがあるなら、ここでアサーションをしてもよい。
  }

  public String getValue() {
    return value;
  }

  // POINT: アカウントに関する処理をつくってもよい。
  public boolean isTemporary() {
    return value.startWith("T"); // T1234など、Tで始まるときに仮登録中とみなす。
  }
} // POINT: toString, equals, hashCodeをオーバーライドしてもよい。

実践談

人気なだけに、いい設計手法だと感じました。

しかし、銀の弾丸ではないです。

「ドメイン駆動設計」で失敗したプロジェクトも見てきましたし、
「ドメイン駆動設計」で成功したプロジェクトも見てきました。

プロジェクトに合わせて、どこまで取り入れるかが大事です。
デザインパターンだけを取り入れてもいいと思います。
(Layered ArchitectureとValue Objectだけでも)

実践するときは、どのように落とし込むか、迷うものです。
周囲に相談しましょう!

会社のテーマ活動でも、実践してみたいなと思っています!

もっと知りたい

もっと知りたいときは、書籍を読んでください。
わたしは要約版を読みました。(原点はキツかった)

今なら、もっといい書籍がありそうです。
自分に合った書籍を選んでください。

1
1
3

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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?