ドメイン駆動設計
再入門
グロースエクスパートナーズ(株)
ITアーキテクト 和智 右桂
Developers Summit 2015
和智 右桂
JavaEE勉強会 所属
グロースエクスパートナーズ株式会社 勤務
Yukei Wachi
@digitalsoul0124
Digital Romanticism
http://d.hatena.ne.jp/digitalsoul
ネコ好き
Photo by @digitalsoul0124 All rights reserved.
IT アーキテクト
時々翻訳をしています
Coming
Soon !
• DDD nutshell
• DDDの魅力
• システムの中のDDD
• まとめ
アジェンダ
Photo by @digitalsoul0124 All rights reserved.
スライド中で使用されている画像について、
その著作権の全部または一部は、 クレジットに示した著者によって保留されています。
DDD nutshell
基礎
https://www.flickr.com/photos/pgoyette/2280685630/
モデルとは?
モデルとは、
知識の表象である
- Trygve Reenskaug
1979
http://www.flickr.com/photos/knilram/64366434/
メンタルモデルを写し取るもの
出典:http://heim.ifi.uio.no/~trygver/themes/mvc/mvc-index.html by Trygve M. H. Reenskaug
Mental Model
MVCからDCIへ
DCIアーキテクチャ
モデル・ビュー・コントローラ
http://d.hatena.ne.jp/digitalsoul/20100913/1284330448
http://d.hatena.ne.jp/digitalsoul/20100131/1264925022
Domain-Driven Design http://www.flickr.com/photos/hlegius/3072942016/in/photostream/ by Hélio Costa
https://www.flickr.com/photos/kakutani/608079788/
本に書かれていること
第1部
ドメインモデルを
機能させる
モデルの基本的な用法
1. モデルと設計の核心の相互作用
• モデルと設計/実装を結びつける
• →モデル駆動設計
2. コミュニケーションの基盤
• モデルの言葉を会話でも使う
• →ユビキタス言語
3. 蒸留された知識
• ドメインエキスパートの知識の表現
http://www.flickr.com/photos/biker_jun/4450890981/
モデルはソフトウェアの中核となる
モデルはビジネスパーソンと開発者をつなぐ
https://www.flickr.com/photos/adriansnood/14252302357/
第2部
モデル駆動設計の
構成要素
モデルの実装のために
1. モデルのためのレイヤを作る
• UIおよび永続化層との分離
• →レイヤ化アーキテクチャ
2. ドメインレイヤ内でモデルを実装する
• パラダイムとしてのオブジェクト指向
オブジェクト
オブジェクト
Search
Small Pop-Up
Pop-Up Menu
Small Combo
Combo Box
Bits
BobsThings
Stuff
OKCancel
Label
Ends
Odds
Help
Tag
Explanotext
A Very Nice Window Indeed
SIDEBAR
Search
Odds
Ends
UI
データベース
リポジトリクライアント
オブジェクト
ドメイン層
ドメイン層とは、モデルが息づく場所
第3部
より深い洞察へ向かう
リファクタリング
モデルの深化
• 時間をかけてモデルは深まっていく
• モデリングは発見のプロセス
• ブレイクスルー
• 深いモデルを作るためのテクニック
• 暗黙的な概念の明示化
• しなやかな設計
• 先達からの学習
• デザインパターン
第4部
戦略的設計
モデリングのスケールアップ
• モデルの整合性
• モデルの境界設計
• 蒸留
• 本質の抽出
• 大規模な構造
• 巨大なシステムの俯瞰
https://www.flickr.com/photos/gulfu/15704325507/
後に続く本
モデルを核としたシステム観
• GOOS (2009)
• Steve Freeman、Nat Pryce
• テストをガイドとして、オブジェク
ト指向のシステムを育てる
• DSL (2010)
• Martin Fowler
• DSLは、モデルの表層を取り巻く
ベニヤのようなものである
DDDの魅力
https://www.flickr.com/photos/ideacreamanuelapps/3541399009/
ある抽象度でのモデリングは絶対に必要
ソフトウェアとしての本筋
https://www.flickr.com/photos/shoobydooby/389551020
SIの現場への福音
https://www.flickr.com/photos/ideacreamanuelapps/3541399009/
現場の閉塞感とは?
サイロ
https://www.flickr.com/photos/jesusbelzunce/7235172294
滝
https://www.flickr.com/photos/spyker3292/5562267244/
規律
https://www.flickr.com/photos/mythoto/2441449507
http://www.flickr.com/photos/symphoney/76513801/
トランザクションスクリプト
• 顧客と会話しながら
• イテレーティブかつインクリメンタルに
• 変化に柔軟に対応しながら
• 技術的に難易度の高いものを作る
https://www.flickr.com/photos/dariobn/15460074140
Agile
ただし
バランスが大切
https://www.flickr.com/photos/cs-fotografie/15448459660/
システムの中の
DDD
広告 注文 請求
広告を
作る
広告を
参照する
注文する
請求書を
作る
請求書を
送る
Alister Cockburn Writing Effective Use Cases Addison-Wesley 2001 p.62
モデルをどこまで保つべきか?
作るのは
ドメインモデルだけでいいのか?
ドメインレイヤの外側
• ユーザーインターフェイス
• 永続化層
• 他システムとの統合層
オブジェクト
オブジェクト
Search
Small Pop-Up
Pop-Up Menu
Small Combo
Combo Box
Bits
BobsThings
Stuff
OKCancel
Label
Ends
Odds
Help
Tag
Explanotext
A Very Nice Window Indeed
SIDEBAR
Search
Odds
Ends
UI
データベース
リポジトリクライアント
オブジェクト
ドメイン層
すべてを統合する
https://www.flickr.com/photos/ofernandezberrios/2719742541
すべての機能は複雑なのか?
・トランザクションスクリプト
 ・ユーザーの要求を満たす手続き
・ドメインモデル
  ・複雑なロジックを
   オブジェクト指向で解決する
機能追加の
コスト
ロジックの複雑度
トランザクションスクリプト
ドメインモデル
損益分岐点を見極める
複雑さは囲い込む
https://www.flickr.com/photos/24354425@N03/15735373141
慣れた人に任せるしかないよね
-- Martin Fowler(PofEAA)
http://www.flickr.com/photos/52086903@N07/5611639409/
何を対象とするのか?
デザインするのは
メンタルモデルだけでいいのか?
ドメイン
ドメイン
ドメイン
ユーザー
ドメイン
システムの外側で
起きることへの配慮
https://www.flickr.com/photos/mtsofan/14303159072/
顧客と同じものを見る
成長するのは
モデルだけなのか?
システムを取り巻く流れ
• 企業のビジネス
• システムを使う人の動き
• 社会の状況
https://www.flickr.com/photos/pablolfc/8508796272/
https://www.flickr.com/photos/pablolfc/8508796272/
システム全体のフィードバックループを設計する
https://www.flickr.com/photos/brewbooks/7358153986
チームも成長する
https://www.flickr.com/photos/brent_nashville/15623635958/
まとめ
https://www.flickr.com/photos/kanaka/3002744372/
DDDは素晴らしい構想
https://www.flickr.com/photos/gsfc/6074582633/
システム全体で考えよう
最後に
https://www.flickr.com/photos/antontwang/10221284164/
世界に対するエンジニアの貢献は
コードの優劣では決まらない
システムを通じて
社会に貢献する
ありがとうございました!
Photo by @digitalsoul0124 All rights reserved.

ドメイン駆動設計再入門