Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
ドメイン駆動設計の
学習曲線とブレークポイント
ギルドワークス
増田 亨
1
Qcon Tokyo 2016
学習曲線
ブレークポイント
2
ドメイン駆動設計
2つのブレークポイント
3
ドメイン駆動設計
4
ドメイン駆動設計の効果
役に立つソフトウエアを
確実に
効率的に
ドメイン駆動設計でやらない何がおきるか?
5
ドメイン駆動設計の基本の活動
知識をかみ砕く
言葉を活用する
モデルと実装を一致させる
第1章
第2章
第3章
開発者が
業務を知る
チームで
認識を合わせる
要求とコードを
一致させる
6
ドメイン駆動設計の基本
ドメインの
オブジェクト
モデル
ドメインの
重要な関心事を
「言葉」で鋭く説明する
選び抜かれた
重要な「言葉」を
コードで表現する
会話を繰り返して
「要点」を明確にする
重要な「言葉」を
チームで合意する
1章
2...
ドメイン駆動設計の原理
開発者が業務を広く深く理解すればするほど、
役に立つソフトウェアを確実に効率的に作れる
チーム内の認識が合っていればいるほど、
役に立つソフトウェアを確実に効率的に作れる
要求とコードが一致していればいるほど、
役に立つ...
ドメイン駆動設計を
支える技術
9
オブジェクト指向
インクリメンタルな設計
データクラス+機能クラスの世界から、ドメインオブジェクトの世界へ
「設計不要」でもなく「上流工程で設計する」でもない世界へ
(JPA,Active Record,Entity Framework…)
技...
ドメイン駆動設計
2つのブレークポイント
オブジェクト指向設計
インクリメンタルな設計
11
体で覚える
オブジェクト指向設計
12
頭でわかっているつもりではだめ
オブジェクト指向らしい設計が
直観的にわかり
オブジェクトらしいコードに
自然に手が動くように
実践的に練習する
オブジェクト指向エクササイズ
ソフトウェア設計を改善する9つのルール
リファクタリング
既存のコードの設計を改善する
13
オブジェクト指向
エクササイズ
オブジェクト指向の良さを生み出す9つのルール
14
9つのルール
1. 一つのメソッドでインデントは一段階
2. else 句は使わない
3. すべてのプリミティブ型と文字列をラップする
4. 一行につきドットは1つまで
5. 名前を省略しない
6. すべてのエンティティを小さくする
7. 一つ...
名前をつける
1. 一つのメソッドでインデントは一段階
2. else 句は使わない
3. すべてのプリミティブ型と文字列をラップする
4. 一行につきドットは1つまで
5. 名前を省略しない
6. すべてのエンティティを小さくする
7. 一つ...
データとロジックを凝集させる
1. 一つのメソッドでインデントは一段階
2. else 句は使わない
3. すべてのプリミティブ型と文字列をラップする
4. 一行につきドットは1つまで
5. 名前を省略しない
6. すべてのエンティティを小さく...
複数の関心事を持たない
1. 一つのメソッドでインデントは一段階
2. else 句は使わない
3. すべてのプリミティブ型と文字列をラップする
4. 一行につきドットは1つまで
5. 名前を省略しない
6. すべてのエンティティを小さくする
...
オブジェクト指向エクササイズ
9つのルールで、1000行くらい書いてみると
オブジェクト指向らしい設計を体感できる
既存のコードから9つのルールの適用例を探し、
値オブジェクトやファーストクラスコレクションを
実際に作ってみると
before/...
リファクタリング
オブジェクト指向の良さを生み出す設計改善のガイドライン
20
いやな臭い
• コードが重複している
• メソッドが長い
• クラスが大きい
• 引数が多い
• データとロジックの置き場所が別のクラスに
分かれている
21
設計の改善
• 名前の変更
– 業務の関心事と実装を一致させる
• メソッドの抽出
– 手続きに名前をつける
• クラスの抽出
– 手続きのグループに名前を付ける
• メソッドの移動/フィールドの移動
– データとロジックの置き場所を同じクラス...
リファクタリング
既存のコードで、いやな臭いを見つける
これを繰り返しているうちに
・いやな臭いに敏感になる
・最初から短いメソッド/小さなクラスを書きはじめる
リファクタリングを適用して
設計改善のbefore/afterを体感する
23
補足
技術方式(レイヤ構造)
プログラミング言語
ドメイン駆動設計を実践するための技術方針
24
技術方式 レイヤ構造
• 三層構造ではなく、
三層+ドメイン層
• O-Rマッピング
– データクラス+機能クラス(手続き型)になりがち
なツールは避ける
• JPA, Active Record, Entity Framework、…
– オ...
プログラミング言語
• 静的な型付き言語
• 独自の型の定義
– 標準ライブラリの型(クラス)は汎用的すぎる
– 目的特化の型をどんどん作る
• 型名を明記して意図を表現する
– メソッドの返す型、メソッドの引数の型
– インスタンス変数の型
...
ドメイン駆動設計
2つのブレークポイント
オブジェクト指向設計
インクリメンタルな設計
パラダイムシフトに3ヵ月から半年くらい
27
インクリメンタルな設計
オブジェクト指向の良さを生み出す設計手法
28
インクリメンタルな設計
コードを書いて動かしてから設計を改善する
最初から良い設計は見つからない
動いていても良い設計とは限らない
コードに書いて動かしてみると学びが多い
その学びをコードに反映する
そういう設計のほうが確実で効率的
29
インクリメンタルな設計
発想の転換
体制とやり方
体で覚える
30
インクリメンタルな設計
発想の転換
システム企画書
プロジェクト計画書
要件定義書
基本設計書
画面デザイン
項目定義書
データベース設計書
ユーザーガイド
テスト計画書
…
どれもいきなり完成しない
アウトラインからはじまり
少しずつ加筆し整...
インクリメンタルな設計
体制とやり方
コードを書く人間が要件のヒアリングと分析をする
それができる人材を選ぶ/育てる
コードを書かない人間に設計やモデリングをさせない
初日からコードのアウトラインを書く
毎日コードを加筆し整形していく
それがも...
インクリメンタルな設計
実プロジェクトで体で覚える
初日からコードを書こうとしてみる
書けなかったら
時間を制限してラフスケッチ
コードで書いてみる
コードが書ける時は、コードだけ書く
コードが書けなくなったら会話や図を使う
動いたらコードを見...
インクリメンタルな設計
スナップショット
34
コードを書きだすための準備
コードを書くのが行き詰った時の会話
コンテキスト図と言葉の洗い出し
業務の流れ 主要な関心事の整理
パッケージ構成
パッケージのスケッチ クラスのスケッチ 35
インクリメンタルな設計
機能や画面を段階的に追加していくという意味ではない
(開発はそうやって進むが)
ソフトウェアの設計を「毎日」行う
名前の変更
メソッドの抽出
クラスの抽出
パッケージの抽出
フィールドの移動
メソッドの移動
クラスの移動...
ドメイン駆動設計
2つのブレークポイント
オブジェクト指向設計
インクリメンタルな設計
パラダイムシフトに3ヵ月から半年くらい
実プロジェクトでいっしょにやりながら
パラダイムシフトに半年から数年
37
できない理由?
• 今のプロジェクトでは無理
• 今のチームでは無理
• 今の会社では無理
• 今の自分では無理
…
38
• どんな状況でも改善できる
• どんなときでも「あなた」から改善を始められる
• どんなときでも「今日」から改善を始められる
エクストリームプログラミングの
「はじめに」に記された
ケント・ベックのメッセージ
39
その一歩を踏み出そう
Upcoming SlideShare
Loading in …5
×

ドメイン駆動設計の学習曲線とブレークポイント

5,628 views

Published on

ドメイン駆動設計の実践力に転機が訪れる時。
チームがオブジェクト指向を体で覚えた時。
チームがインクリメンタルな設計を体で覚えた時。
チームでオブジェクト指向とインクリメンタルな設計を体で覚えるための指針。
QCon Tokyo 2016

Published in: Software
  • Be the first to comment

ドメイン駆動設計の学習曲線とブレークポイント

  1. 1. ドメイン駆動設計の 学習曲線とブレークポイント ギルドワークス 増田 亨 1 Qcon Tokyo 2016
  2. 2. 学習曲線 ブレークポイント 2
  3. 3. ドメイン駆動設計 2つのブレークポイント 3
  4. 4. ドメイン駆動設計 4
  5. 5. ドメイン駆動設計の効果 役に立つソフトウエアを 確実に 効率的に ドメイン駆動設計でやらない何がおきるか? 5
  6. 6. ドメイン駆動設計の基本の活動 知識をかみ砕く 言葉を活用する モデルと実装を一致させる 第1章 第2章 第3章 開発者が 業務を知る チームで 認識を合わせる 要求とコードを 一致させる 6
  7. 7. ドメイン駆動設計の基本 ドメインの オブジェクト モデル ドメインの 重要な関心事を 「言葉」で鋭く説明する 選び抜かれた 重要な「言葉」を コードで表現する 会話を繰り返して 「要点」を明確にする 重要な「言葉」を チームで合意する 1章 2章 3章 7 第1章 ドメインの知識をかみ砕く 第3章 モデルと実装を結びつける 第2章 言葉を使った意図の伝達
  8. 8. ドメイン駆動設計の原理 開発者が業務を広く深く理解すればするほど、 役に立つソフトウェアを確実に効率的に作れる チーム内の認識が合っていればいるほど、 役に立つソフトウェアを確実に効率的に作れる 要求とコードが一致していればいるほど、 役に立つソフトウエアを確実に効率的に作れる 8
  9. 9. ドメイン駆動設計を 支える技術 9
  10. 10. オブジェクト指向 インクリメンタルな設計 データクラス+機能クラスの世界から、ドメインオブジェクトの世界へ 「設計不要」でもなく「上流工程で設計する」でもない世界へ (JPA,Active Record,Entity Framework…) 技術的にはこの2つ越境が、ドメイン駆動設計を実践するブレークポイント 10 二つはコインの裏表
  11. 11. ドメイン駆動設計 2つのブレークポイント オブジェクト指向設計 インクリメンタルな設計 11
  12. 12. 体で覚える オブジェクト指向設計 12 頭でわかっているつもりではだめ オブジェクト指向らしい設計が 直観的にわかり オブジェクトらしいコードに 自然に手が動くように
  13. 13. 実践的に練習する オブジェクト指向エクササイズ ソフトウェア設計を改善する9つのルール リファクタリング 既存のコードの設計を改善する 13
  14. 14. オブジェクト指向 エクササイズ オブジェクト指向の良さを生み出す9つのルール 14
  15. 15. 9つのルール 1. 一つのメソッドでインデントは一段階 2. else 句は使わない 3. すべてのプリミティブ型と文字列をラップする 4. 一行につきドットは1つまで 5. 名前を省略しない 6. すべてのエンティティを小さくする 7. 一つのクラスのインスタンス変数は2つまで 8. ファーストクラスコレクションを使う 9. getter, setter, プロパティを使わない 15
  16. 16. 名前をつける 1. 一つのメソッドでインデントは一段階 2. else 句は使わない 3. すべてのプリミティブ型と文字列をラップする 4. 一行につきドットは1つまで 5. 名前を省略しない 6. すべてのエンティティを小さくする 7. 一つのクラスのインスタンス変数は2つまで 8. ファーストクラスコレクションを使う 9. getter, setter, プロパティを使わない 16 パッケージ クラス メソッド 小さい単位で 名前をつける
  17. 17. データとロジックを凝集させる 1. 一つのメソッドでインデントは一段階 2. else 句は使わない 3. すべてのプリミティブ型と文字列をラップする 4. 一行につきドットは1つまで 5. 名前を省略しない 6. すべてのエンティティを小さくする 7. 一つのクラスのインスタンス変数は2つまで 8. ファーストクラスコレクションを使う 9. getter, setter, プロパティを使わない 17 値オブジェクト ファーストクラス コレクション データとロジックを別の場所におかない
  18. 18. 複数の関心事を持たない 1. 一つのメソッドでインデントは一段階 2. else 句は使わない 3. すべてのプリミティブ型と文字列をラップする 4. 一行につきドットは1つまで 5. 名前を省略しない 6. すべてのエンティティを小さくする 7. 一つのクラスのインスタンス変数は2つまで 8. ファーストクラスコレクションを使う 9. getter, setter, プロパティを使わない 18 ルールに違反している時は、複数の関心事が混在している
  19. 19. オブジェクト指向エクササイズ 9つのルールで、1000行くらい書いてみると オブジェクト指向らしい設計を体感できる 既存のコードから9つのルールの適用例を探し、 値オブジェクトやファーストクラスコレクションを 実際に作ってみると before/afterでオブジェクト指向設計を体感できる 19
  20. 20. リファクタリング オブジェクト指向の良さを生み出す設計改善のガイドライン 20
  21. 21. いやな臭い • コードが重複している • メソッドが長い • クラスが大きい • 引数が多い • データとロジックの置き場所が別のクラスに 分かれている 21
  22. 22. 設計の改善 • 名前の変更 – 業務の関心事と実装を一致させる • メソッドの抽出 – 手続きに名前をつける • クラスの抽出 – 手続きのグループに名前を付ける • メソッドの移動/フィールドの移動 – データとロジックの置き場所を同じクラスにする 22
  23. 23. リファクタリング 既存のコードで、いやな臭いを見つける これを繰り返しているうちに ・いやな臭いに敏感になる ・最初から短いメソッド/小さなクラスを書きはじめる リファクタリングを適用して 設計改善のbefore/afterを体感する 23
  24. 24. 補足 技術方式(レイヤ構造) プログラミング言語 ドメイン駆動設計を実践するための技術方針 24
  25. 25. 技術方式 レイヤ構造 • 三層構造ではなく、 三層+ドメイン層 • O-Rマッピング – データクラス+機能クラス(手続き型)になりがち なツールは避ける • JPA, Active Record, Entity Framework、… – オブジェクトが主役の軽量のツールを選ぶ • myBatis, Spring JDBCTemplate, … 25
  26. 26. プログラミング言語 • 静的な型付き言語 • 独自の型の定義 – 標準ライブラリの型(クラス)は汎用的すぎる – 目的特化の型をどんどん作る • 型名を明記して意図を表現する – メソッドの返す型、メソッドの引数の型 – インスタンス変数の型 – ローカル変数の型 • 型の設計変更に強い – リファクタリングを楽に安全に 26
  27. 27. ドメイン駆動設計 2つのブレークポイント オブジェクト指向設計 インクリメンタルな設計 パラダイムシフトに3ヵ月から半年くらい 27
  28. 28. インクリメンタルな設計 オブジェクト指向の良さを生み出す設計手法 28
  29. 29. インクリメンタルな設計 コードを書いて動かしてから設計を改善する 最初から良い設計は見つからない 動いていても良い設計とは限らない コードに書いて動かしてみると学びが多い その学びをコードに反映する そういう設計のほうが確実で効率的 29
  30. 30. インクリメンタルな設計 発想の転換 体制とやり方 体で覚える 30
  31. 31. インクリメンタルな設計 発想の転換 システム企画書 プロジェクト計画書 要件定義書 基本設計書 画面デザイン 項目定義書 データベース設計書 ユーザーガイド テスト計画書 … どれもいきなり完成しない アウトラインからはじまり 少しずつ加筆し整形していく コードもいっしょ プロジェクトの早い段階から アウトラインのコード書いて 少しずつ加筆し整形していく それがもっとも確実で効率的 初日から ソフトウェア設計の主たる表現手段はコード (図や文書は補助) 31
  32. 32. インクリメンタルな設計 体制とやり方 コードを書く人間が要件のヒアリングと分析をする それができる人材を選ぶ/育てる コードを書かない人間に設計やモデリングをさせない 初日からコードのアウトラインを書く 毎日コードを加筆し整形していく それがもっとも確実で効率的 32
  33. 33. インクリメンタルな設計 実プロジェクトで体で覚える 初日からコードを書こうとしてみる 書けなかったら 時間を制限してラフスケッチ コードで書いてみる コードが書ける時は、コードだけ書く コードが書けなくなったら会話や図を使う 動いたらコードを見直す 業務の知識が増えたらコードに反映する 33
  34. 34. インクリメンタルな設計 スナップショット 34
  35. 35. コードを書きだすための準備 コードを書くのが行き詰った時の会話 コンテキスト図と言葉の洗い出し 業務の流れ 主要な関心事の整理 パッケージ構成 パッケージのスケッチ クラスのスケッチ 35
  36. 36. インクリメンタルな設計 機能や画面を段階的に追加していくという意味ではない (開発はそうやって進むが) ソフトウェアの設計を「毎日」行う 名前の変更 メソッドの抽出 クラスの抽出 パッケージの抽出 フィールドの移動 メソッドの移動 クラスの移動 コードを書いて動かして得た知見をコードに反映する 36
  37. 37. ドメイン駆動設計 2つのブレークポイント オブジェクト指向設計 インクリメンタルな設計 パラダイムシフトに3ヵ月から半年くらい 実プロジェクトでいっしょにやりながら パラダイムシフトに半年から数年 37
  38. 38. できない理由? • 今のプロジェクトでは無理 • 今のチームでは無理 • 今の会社では無理 • 今の自分では無理 … 38
  39. 39. • どんな状況でも改善できる • どんなときでも「あなた」から改善を始められる • どんなときでも「今日」から改善を始められる エクストリームプログラミングの 「はじめに」に記された ケント・ベックのメッセージ 39 その一歩を踏み出そう

×