SlideShare a Scribd company logo
ドメイン駆動設計
複雑さに立ち向かう
2017年5月20日
越境アジャイル勉強会 in 大阪
ソフトウエア開発
複雑さ
不確実性
リスクではなく、チャンス
ソフトウェア開発
複雑さと不確実性に立ち向かう
仮説検証型
アジャイル
リレーションシップ駆動
要件分析
ドメイン駆動設計
相互補完かつ相乗効果
地図(全体の絵)を手に入れる
・どこの議論をしているのか明らかに
・それが他の部分とどう関係するかを明確に
道なきところに道を見つける
・わかっていないという自覚から出発
・わかっていることを増やす
・短サイクルで反復的に学習する
進化と発展を続けるソフトウェアを生み出す
・中核の課題に集中する
・ドメインとドメインロジックに焦点を合わせる
・重要な要素を選び抜き意図的に組み立てる
相互補完かつ相乗効果
• 仮説検証
• わからないことが前提
• 仮説・検証・学習・実践のサイクル
• そのために全体を俯瞰する(RDRA)
• そのために中核のアイデアをコードを書いて検証する(DDD)
• リレーションシップ駆動要件分析
• 全体像を関係者で共有する
• どこに焦点をあてたか関係者で共有する
• 仮説が有望になれば、横展開をはかる
• 仮説が行き詰まれば、俯瞰してみなおす
• ドメイン駆動設計
• ソフトウェア全体の中核部分に焦点を合わせる
• 見つけた中核の課題に集中して設計を洗練させる
• 中核を洗練させることにより全体に秩序と発展性が波及する
ドメイン駆動設計
複雑さ/不確実さと戦いながら
進化と発展を続けるソフトウェアを生み出す
設計の考え方とやり方
ソフトウェアの核心にある複雑さに立ち向かう
根底技法 2つの設計原則 目指すところ 戦略的取り組み
根底技法
オブジェクト指向
分析設計
エクストリーム
プログラミング
変更容易性/変化への柔軟な対応を重視した技法
ドメインロジックの分析設計
(モジュール化)
ドメインモデル
オブジェクトの組み合わせ
演算対象と演算をカプセル化(データとロジック)
コードの重複をなくす
変更の影響範囲を閉じ込める
トランザクション
スクリプト
機能分解/手続き型プログラミング
・Smart UI
・貧血ドメインモデル
・ファットコントローラ
テーブル
モジュール
テーブルに対応するクラスにロジックを集める
・テーブル構造とプログラム構造との密結合
・不自然なロジックの置き場所
・ファットモデル
コードが膨らんできた時に修正や拡張が容易なのはどれか
利用者の関心事や活動の要点をモデル化しやすいのどれか
どこに何が書いてあるか、見つけやすいのはどれか
開発プロセスと分析設計
いつ 誰が 仕様の記述
エクストリーム
プログラミング
毎日分析設計に
投資を続ける
コードを書く人
実行可能なコード
で表現(一元化)
スクラム
スコープの対象外
(どんなやり方でもよい -> やらなくても良い?)
ウォータフォール
アップフロントに
分析し、アップフ
ロントに設計する
・分析者
・設計者
(コードを書か
ない人)
ドキュメントとコー
ドの二重管理
ソフトウェア開発の目的を正しく実現できるのはどのやり方か?
コードが膨らんで複雑になってきた時の修正や拡張がやりやすいのはどのやり方か?
2つの設計原則
ドメインとドメインロジックに
焦点を合わせる
モデルと実装を一致させる
プレゼンテーション層
データソース層
アプリケーション層
ドメインロジックに集中する
@Controller
@Service
@Repository
ドメイン
モデル
ここを
インクリメンタルに
成長させながら
左側の開発を駆動する
ドメインロジックを
ここに集約して
オブジェクトで記述する
ドメインロジックに焦点を合わせる
• 多くの技術者にとって、なじみがない発想
• 抵抗や反発すらある
• ドメイン駆動設計を指向している技術者でも焦点が
あっていないことが多い
• データの入出力/OR-マッピング
• 機能/ユースケース/ストリーのバックログつぶし
• プログラミング言語仕様と標準ライブラリへの執着
• フレームワークへの執着
• 越境のトレーニング
• 数値、日付、区分に関わるロジックをオブジェクトで表現する
• JUnitで独立して実行(永続化や通信のコードから分離する)
• リファクタリング
• オブジェクト指向エクササイズ
モデルと実装を一致させる
• モデル
• さまざまな知識のうち、重要な要素を選び抜き、意図的
に組み立てた簡潔な表現
• 実装
• パッケージ名、クラス名、メソッド名
• メソッドの引数の型、メソッドの型
• 一致させる
• うまく説明できているモデルでも実装した感じに違和感
があれば別のモデルを模索する
• モデルと実装の一致が、ソフトウェアの変更容易性と発
展性のカギになる
モデルと実装を一致させる
越境のトレーニング
• 全体像
• ドメイン層のパッケージ図を描く(特に依存関係)
• パッケージ名を使って、ドメインを超えに出して説明してみる
• 中核の関心事
• 中核な関心事を文章にして声に出して読み上げる
• その文章に関連するクラスを抜粋する
• 抜粋したクラスのクラス名とメソッド名で、中核の関心事を声
に出して読み上げてみる
• コードレビュー
• 開発者が、どのようにドメインを理解しているかの表明として
コードを読む
• ドメイン理解の観点からフィードバック
目指すところ
深いモデル
しなやかな設計
次元の違う柔軟性と発展性
深いモデル
• ドメインの根底にある原則や構造の理解(発見)
• モデルの探求としてのリファクタリング活動
• 動いてはいるが、何かぎこちない
• 修正や拡張のたびに、あちこちが破たんする
• 何かを見落としている感じがする
• コードがドメインの説明になっていない
しなやなか設計
• オブジェクト指向の設計原則を愚直に丁寧に
• 概念の輪郭と、パッケージ/クラス/メソッドの単位を
一致させる
• 業務の用語とパッケージ名/クラス名/メソッド名を一
致させる
• 宣言的に書けるロジックと、実行時の状態に依存する
ロジックを分離する
• 実行時の状態の不確実性を局所に閉じ込める
• メソッドの引数の型、返す型を自身の型に閉じる
• 言語仕様レベル、標準ライブラリレベルの記述をでき
るだけ隠ぺいする(ラップする)
戦略的に取り組む
長期的に
複数チームで
大規模に
戦略的に取り組む
• 誰が
• 開発現場で、実際にコードを書いている技術者
• その中で視野が広く、経験を積み、他のメンバーへの影響
力がある非公式なリーダー
• どうやって
• 非公式な打ち合わせ/意見交換
• コード一行一行への反映
• テクニック
• コンテキストのマッピング
• コアドメインの蒸留
• 大規模なロジックの構造化
• 時間とともに進化する秩序
ドメイン駆動設計
複雑さ/不確実さと戦いながら
進化と発展を続けるソフトウェアを生み出す
設計の考え方とやり方
ソフトウェアの核心にある複雑さに立ち向かう
根底技法 2つの設計原則 目指すところ 戦略的取り組み
ソフトウエア開発
複雑さ
不確実性
リスクではなく、チャンス
ソフトウェア開発
複雑さと不確実性に立ち向かう
仮説検証型
アジャイル
リレーションシップ駆動
要件分析
ドメイン駆動設計
相互補完かつ相乗効果
地図(全体の絵)を手に入れる
・どこの議論をしているのか明らかに
・それが他の部分とどう関係するかを明確に
道なきところに道を見つける
・わかっていないという自覚から出発
・わかっていることを増やす
・短サイクルで反復的に学習する
進化と発展を続けるソフトウェアを生み出す
・中核の課題に集中する
・ドメインとドメインロジックに焦点を合わせる
・重要な要素を選び抜き意図的に組み立てる
越境のススメ
どんなときも、あなたから始められる
どんなときでも、今日から始められる
どんな状況でも改善できる
正しいと信じる方向に、小さな一歩を踏み出そう、いますぐに…
Transgrade Agile

More Related Content

PDF
オブジェクト指向の設計と実装の学び方のコツ
PDF
私がドメイン駆動設計をやる理由
PDF
ドメイン駆動設計 基本を理解する
PDF
Tackling Complexity
PDF
ドメイン駆動設計に15年取り組んでわかったこと
PDF
オブジェクト指向プログラミングのためのモデリング入門
PDF
ソーシャルゲームのためのデータベース設計
PDF
実践に向けたドメイン駆動設計のエッセンス
オブジェクト指向の設計と実装の学び方のコツ
私がドメイン駆動設計をやる理由
ドメイン駆動設計 基本を理解する
Tackling Complexity
ドメイン駆動設計に15年取り組んでわかったこと
オブジェクト指向プログラミングのためのモデリング入門
ソーシャルゲームのためのデータベース設計
実践に向けたドメイン駆動設計のエッセンス

What's hot (20)

PDF
3週連続DDDその1 ドメイン駆動設計の基本を理解する
PDF
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
PDF
実践的な設計って、なんだろう?
PDF
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
PDF
3週連続DDDその2 深いモデルの探求(ドメイン駆動設計 第3部)
PDF
オブジェクト指向プログラミングの現在・過去・未来
PDF
ドメイン駆動設計 の 実践 Part3 DDD
PDF
ソフトウェア設計の学び方を考える
PDF
マイクロサービス 4つの分割アプローチ
PDF
こわくない Git
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
PDF
世界でいちばんわかりやすいドメイン駆動設計
PPT
ドメインロジックの実装方法とドメイン駆動設計
PDF
正しいものを正しく作る塾-設計コース
PDF
ドメイン駆動設計の正しい歩き方
PDF
ドメイン駆動設計サンプルコードの徹底解説
PDF
ドメインオブジェクトの見つけ方・作り方・育て方
PDF
ドメイン駆動設計のためのオブジェクト指向入門
PDF
Test Yourself - テストを書くと何がどう変わるか
PPTX
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
3週連続DDDその1 ドメイン駆動設計の基本を理解する
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
実践的な設計って、なんだろう?
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
3週連続DDDその2 深いモデルの探求(ドメイン駆動設計 第3部)
オブジェクト指向プログラミングの現在・過去・未来
ドメイン駆動設計 の 実践 Part3 DDD
ソフトウェア設計の学び方を考える
マイクロサービス 4つの分割アプローチ
こわくない Git
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
世界でいちばんわかりやすいドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
正しいものを正しく作る塾-設計コース
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計サンプルコードの徹底解説
ドメインオブジェクトの見つけ方・作り方・育て方
ドメイン駆動設計のためのオブジェクト指向入門
Test Yourself - テストを書くと何がどう変わるか
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
Ad

Similar to ドメイン駆動設計 複雑さに立ち向かう (20)

PDF
現場で役立つシステム設計の原則
PDF
RDRA DDD Agile
PDF
【16-E-4】残業ゼロで開発スピードが10倍に!もう元の開発体制には戻れないデンソー流のアジャイル開発
PPT
Distributed Agile using UML
PPTX
ドメイン駆動設計の学習曲線とブレークポイント
KEY
メンバーズグループ アジャイル開発への取り組み
PDF
.NET Coreから概観する.NETのOSSへの取り組み
PPTX
サービス開発における工程
PPTX
RAD Studioで始めるマルチデバイス・クロスプラットフォーム開発ワークショップ
PDF
Stripeを1年使ってみて思ったこと
PDF
人が作るソフトウェア 〜今組織パターンを読む意味〜
PDF
「ドメイン駆動設計」の複雑さに立ち向かう
PDF
大阪DDD読書会ワークショップvol.1ガイダンス
PDF
いまなぜドメイン駆動設計か
PDF
Vision and Language(メタサーベイ )
PPTX
チーム運用で苦労した話_20160629
PDF
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
PDF
ドメイン駆動設計 思えば遠くにきたもんだ
PDF
効果的なXPの導入を目的とした プラクティス間の相互作用の分析
現場で役立つシステム設計の原則
RDRA DDD Agile
【16-E-4】残業ゼロで開発スピードが10倍に!もう元の開発体制には戻れないデンソー流のアジャイル開発
Distributed Agile using UML
ドメイン駆動設計の学習曲線とブレークポイント
メンバーズグループ アジャイル開発への取り組み
.NET Coreから概観する.NETのOSSへの取り組み
サービス開発における工程
RAD Studioで始めるマルチデバイス・クロスプラットフォーム開発ワークショップ
Stripeを1年使ってみて思ったこと
人が作るソフトウェア 〜今組織パターンを読む意味〜
「ドメイン駆動設計」の複雑さに立ち向かう
大阪DDD読書会ワークショップvol.1ガイダンス
いまなぜドメイン駆動設計か
Vision and Language(メタサーベイ )
チーム運用で苦労した話_20160629
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
ドメイン駆動設計 思えば遠くにきたもんだ
効果的なXPの導入を目的とした プラクティス間の相互作用の分析
Ad

More from 増田 亨 (20)

PDF
ソフトウェア開発のやり方の改善
PDF
事業活動モデル・システム機能モデル・ビジネスロジックの記述
PDF
ドメインオブジェクトの設計ガイドライン
PDF
ドメイン駆動設計 コアドメインを語り合ってみよう
PDF
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
PDF
ドメイン駆動設計という設計スタイル
PDF
プロダクトづくりのためのソフトウェア設計スタイル
PDF
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
PDF
ビジネスルールの複雑さに立ち向かう
PDF
ソフトウェアの核心にある複雑さに立ち向かう
PDF
ドメイン駆動設計 本格入門
PDF
DDD sample code explained in Java
PDF
アジャイルなソフトウェア設計を目指して
PDF
ドメイン駆動設計をゲーム開発に活かす
PDF
SoR 2.0 summary
PDF
毎日が越境だ!
PDF
SoR 2.0 基幹システムの再定義と再構築
PDF
ドメイン駆動設計とは何か 【入門編】
PDF
ドメイン駆動設計のための Spring の上手な使い方
PDF
越境する情シス:進化可能なアーキテクチャを手に入れる
ソフトウェア開発のやり方の改善
事業活動モデル・システム機能モデル・ビジネスロジックの記述
ドメインオブジェクトの設計ガイドライン
ドメイン駆動設計 コアドメインを語り合ってみよう
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
ドメイン駆動設計という設計スタイル
プロダクトづくりのためのソフトウェア設計スタイル
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
ビジネスルールの複雑さに立ち向かう
ソフトウェアの核心にある複雑さに立ち向かう
ドメイン駆動設計 本格入門
DDD sample code explained in Java
アジャイルなソフトウェア設計を目指して
ドメイン駆動設計をゲーム開発に活かす
SoR 2.0 summary
毎日が越境だ!
SoR 2.0 基幹システムの再定義と再構築
ドメイン駆動設計とは何か 【入門編】
ドメイン駆動設計のための Spring の上手な使い方
越境する情シス:進化可能なアーキテクチャを手に入れる

ドメイン駆動設計 複雑さに立ち向かう