33
小さなオブジェクトで ドメインモデルを組み立てる Qcon Tokyo 2013 2013年4月23日 有限会社 システム設計 増田 ドメイン駆動設計 実践ガイド

小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

小さなオブジェクトで ドメインモデルを組み立てる

Qcon Tokyo 2013

2013年4月23日

有限会社 システム設計 増田

ドメイン駆動設計 実践ガイド

Page 2: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

Domain-Driven Design (DDD)

ドメイン駆動設計

Page 3: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

ドメイン駆動設計への道

エクササイズ 9つのルール 小さく作る

・メソッドの構成 ・オブジェクト間の特性移動 ・データの再編成 ・条件記述の単純化 ・メソッド呼び出しの単純化

実装の原則

ドメインの理解 言葉の力 モデル駆動

設計のスタイル

For Thoughtful Developer Leading Designer

オブジェクト指向

基礎訓練

・クラス ・振る舞いとメソッド ・状態とコレクション

設計の改善

責任割当の原則 GRASP

責任駆動設計 役割ステレオタイプ

契約による設計

Page 4: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

コンセプト編

1. 業務アプリケーション 2. 開発の難しさ 3. ドメイン駆動設計のアプローチ

Page 5: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

業務アプリケーション

• データの種類と量

• ユーザの役割と権限

• 履歴データ:記録、参照、突合

• 通知・連絡・報告とルーティング

• 予定(未来)の管理

• 状態遷移

• 状態+権限に依存した制約ルール

• 人間の判断待ち

Page 6: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

開発の難しさ • 複雑さ

– 権限、状態、各種区分、… 組み合わせ – 例外規定、救済ルール

• あいまいまさ – ビジネス=人と人との相互作用 – 決め事・調整ごとの積み重ね

• 不確実性 – ビジネス環境の変化 – 事業方針の変化 – 人の異動、組織の変更

Page 7: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

ドメイン駆動設計

• 複雑さに立ち向かう

• あいまいさに光をあてる

• 不確実性を受け入れる

Page 8: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

ドメイン駆動設計のアプローチ

• 「概念モデル」をそのまま実装する – パッケージ名、クラス名、メソッド名を業務用語に

– 業務ルール、サービスポリシー、会計ルール、…

• ドメイン層の独立 – 関心事の分離 (UI, データベース、通信)

– 依存関係の逆転 (他の層がドメイン層に依存)

• ドメイン層の継続的な改良 – モデルの深化 ドメイン理解度の反映

– モデルの変化 ビジネスの変化の反映

Page 9: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

実践編

4. アプリケーション・アーキテクチャ 5. ドメイン層の設計パターン 6. リッチなドメインモデル 設計スタイル

お断り:Java/Spring フレームワークでの実践例です。

Page 10: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

アプリケーション

アーキテクチャ

Page 11: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

構築モデル

アプリケーションサーバー

アプリケーション フレームワーク

アプリケーション ロジック

アプリケーションコンテナ ディスパッチャ イベントリスナー

Web MVC バリデーション O-Rマッピング テンプレートエンジン

独自に開発

再利用

再利用

@Autowired

Page 12: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

ドメインモデル

ドメインイベント駆動の実行モデル

ブラウザ, Web API

HTTP リクエスト

メール

受信メール自動処理

非同期 メッセージ

サービス間連携

アプリケーションサーバー Tomcat

メッセージング サーバー

Active MQ

サービス コンテナ

Mule ESB

メールサーバーJames

Mailet コンテナ Servlet

コンテナ

ドメインサービス

ドメインイベント

ユースケースの実装

業務知識 データとロジック ビジネスルール

手続き型の記述 (トランザクションスクリプト)

問題領域の オブジェクトモデル

Page 13: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

リッチな ドメインモデル

シンプルな ドメインモデル

シンプルな トランザクション

スクリプト

リッチな トランザクション

スクリプト

ドメイン層:2つの実装スタイル

手続き型の 記述

オブジェクト モデル

Page 14: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

設計パターン リッチなドメインモデル

日付

期間

予定日

有効期限

場所

地域

商品種類

形状

単価

数量

税率 型式

翌月 拠点

キャンペーン

Event (出来事)

シンプルなトランザクションスクリプト

Reference (参照)

Repository (記録)

Transfer (通知)

Policy (判断) (制約)

部門

役割

担当者

ファンダメンタルなオブジェクト

端数

超重要

ここが 育つほど 楽になる

ユースケースの実装

基本 オブジェクト

Page 15: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

ドメインオブジェクト:基本パターン

Event (出来事)

トランザクションスクリプト Service 層のクラス

Reference (参照)

Repository (記録)

Transfer (通知)

Policy (判断/制約)

サービスのエントリーポイント ファサード(仕事はドメインオブジェクトに任せる)

問題領域の出来事を表すオブジェクト イベント種別、いつ、だれ、何

記録と参照の業務ニーズの表現 インタフェース宣言(実装依存部分は、データソース層で)

通知の業務ニーズの表現 インタフェース宣言(実装依存部分は、データソース層で)

参照の対象(識別番号) 値オブジェクトの集約のルート

ルールの集約オブジェクト (プライシング、キャンセル、オーバーブッキング、…)

Page 16: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

ファンダメンタルなオブジェクト リッチなドメインモデルの中核

日付

期間

予定日

有効期限

場所

地域

商品種類

形状

単価

数量

税率 型式

翌月 拠点

キャンペーン

部門

役割

担当者

• 業務モデルを表現する基本語彙集 • ビジネスルールの基本ロジック 日付計算、形式チェック、… • プログラミング言語のプリミティブな型のラッパー

端数

Page 17: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

役に立つ

ドメインオブジェクト

良い名前

小さく

ばらばらに

Page 18: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

良い名前の見つけ方

正しく使う(言葉を使って相手の反応をみる)

言葉を組み合わせてみて反応をみる

似た言葉を使い分けて反応をみる

名前の宝庫(初日に見つける) ・その分野のガイドブック ・類似サービスのヘルプ画面 ・類似パッケージソフトのカタログ (英語版ならクラス名の宝庫)

頻度、重要度、関心度、…

語彙を増やす 読む/調べる 聴く/尋ねる

Page 19: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

小さく作る クラス 50行以内 メソッド 3行以内 パッケージ 10ファイル以内

これを超えたら、 分割を考える習慣をつける。

Page 20: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

3行メソッド

register( order ) { verify( order ); record( order ); notifyTo(shippingSection); }

こういうのが良い感じ

Page 21: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

小さく作る狙い

作りやすい わかりやすい 使いやすい 捨てやすい

Page 22: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

業務の言葉をオブジェクトで

プログラミング言語の基本データ型 (Date,String, BigDecimal, Long, …)

をラップした 業務の基本用語ごとのオブジェクトに、

その用語に関するデータとロジックをまとめる。

日付 (時分秒を持たない) 時分(秒を持たない) 翌営業日, 休前日 月末,月初, 四半期, 半期, 年度 期間 有効期限 予定日 期限切れ一週間前のアラート 前日のリマインダ …

金額 単価 数量,数量単位,換算 消費税,税率,端数処理 合計,小計,総合計 数量割引 キャンペーン価格 季節料金 キャンセルポリシー …

管理番号,登録番号 取引先コード 取引区分 契約番号 商品番号 型式コード 製造番号 シリアルナンバー …

用語の粒度=オブジェクトの粒度

Page 23: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

委譲メソッド 面倒でも隣人とだけ話す × person.contactInfo().phones().mobile() ◎ person.primaryContact()

ばらばらにする

実装継承 控え目に。もっと控えめに。

パッケージ階層 フラットに。もっとフラットに。

• 構造を安易にコードに埋め込まない。 • 初期の構造はまちがっていることが多い。 • 構造の変更を簡単にする準備をしておく。

構造の変更に備える習慣

Page 24: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

制御の記述 • if 文/ switch 文を使わない条件分岐

– enum

• EventType, StateType, Category, Group, …

• タイプごとの振る舞いを if 文なしに記述

– Strategy/State パターン

• たとえば、MissingObject パターン (未記入、不明の表現)

• for 文を閉じ込める/使わない

– ファーストクラスコレクション

• コレクションは単独でラッピング List<Order> → Orders

– for 文を使ったロジックの集約

– for 文を使わない

• コレクション API の活用

• Comparableの実装

• equals()/hashCode() のオーバーライド

Page 25: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

組み立て方

• サービスクラスでマクロな手順(数行)を記述

– 判断・分岐・ループは、ドメインオブジェクトに委譲

• フレームワーク(Inversion of Control)の活用

– 基本の制御構造は組み込み済

• Web MVC、 バインド&バリデーション

• O-R マッピング、 O-X マッピング

• 例外ハンドラー

– パターンマッチング、命名規約、アノテーションで、自動で組み立ててくれる。

Page 26: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

参考情報

7. 設計と実装のスキルアップ 8. ドメインモデルの開発スタイル 9. 問題領域の把握手法 10. 開発プロセス

Page 27: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

設計と実装のスキルアップ

エクササイズ 9つのルール 小さく作る

・メソッドの構成 ・オブジェクト間の特性移動 ・データの再編成 ・条件記述の単純化 ・メソッド呼び出しの単純化

実装の原則

ドメインの理解 言葉の力 モデル駆動

設計のスタイル

For Thoughtful Developer Leading Designer

オブジェクト指向

基礎訓練

・クラス ・振る舞いとメソッド ・状態とコレクション

設計の改善

責任割当の原則 GRASP

責任駆動設計 役割ステレオタイプ

契約による設計

Page 28: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

リファクタリング

モデリング プログラミング

イテレーティブで発見的な活動

ドメインモデルの開発

三位一体

Page 29: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

リレーションシップ駆動 要件定義(RDRA)

・コンテキストモデル ・業務フローモデル ・イベント/状態モデル

ICONIX

・ドメインオブジェクトの発見 ・ドメインモデルの育て方 ・ロバストネス分析

ビジネスルールの発見と定義

業務フロー図から ドメインモデルから イベント/状態モデルから

問題領域を把握する

初期のラフモデルを 2時間以内で描く

モデル間を関連づけ 整合性と網羅性を確保

ユースケースと 実装のギャップを埋める

それぞれのモデルから ビジネスルールを抽出する ヒントとテクニック

Page 30: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

ドメイン駆動の開発プロセス

業務フロー

モデルの改良

要約、骨格

画面・帳表 ユースケース

属性の追加 モデルの洗練

イベント 状態遷移

データモデル

初期のラフモデル

コンテキスト

手がかかり

ドメインモデルの設計と実装

ロバストネス分析

必要ならシーケンス図

操作追加

Java ソースコー

基盤クラス追加

DDL/SQLソースコー

ドメインの把握

構造化用語集

Page 31: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

Domain-Driven Design (DDD)

ドメイン駆動設計

まとめ

Page 32: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

アプローチ

• 「概念モデル」をそのまま実装

• ドメイン層の独立

• ドメインモデルの継続的な改良

Page 33: 小さなオブジェクトで ドメインモデルを組み立てるqcontokyo.com/tokyo-2013/data_2013/ToruMasuda_QCon... · ドメイン駆動設計への道 エクササイズ

役に立つ

ドメインオブジェクト

良い名前

小さく

ばらばらに