紹介
システムが扱う領域を、ドメインといいます。
銀行システムなら、銀行業務のドメインです。
このドメインを中心に据えた、
「設計の進め方」と「デザインパターン」が、
がドメイン駆動設計として、提唱されています。
英語では「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) {
// 送信する。
}
/**
* メッセージ。
*/
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() {
// 禁則文字が含まれていないかチェックする。
}
}
/**
* アカウント。
* 例: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だけでも)
実践するときは、どのように落とし込むか、迷うものです。
周囲に相談しましょう!
会社のテーマ活動でも、実践してみたいなと思っています!
もっと知りたい
もっと知りたいときは、書籍を読んでください。
わたしは要約版を読みました。(原点はキツかった)
-
エリック・エヴァンスのドメイン駆動設計
- 原点
- 読みにくい(557ページ)
-
Domain Driven Design(ドメイン駆動設計) Quickly
- 要約版
- 読みやすい(81ページ)
今なら、もっといい書籍がありそうです。
自分に合った書籍を選んでください。