ドメイン駆動設計再入門

61
ドメイン駆動設計 再入門 グロースエクスパートナーズ(株) ITアーキテクト 和智 右桂 Developers Summit 2015

Transcript of ドメイン駆動設計再入門

ドメイン駆動設計 再入門

グロースエクスパートナーズ(株) ITアーキテクト 和智 右桂

Developers Summit 2015

和智 右桂

JavaEE勉強会 所属

グロースエクスパートナーズ株式会社 勤務

Yukei Wachi

@digitalsoul0124Digital 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 Costahttps://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 BoxBits

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 BoxBits

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.