SlideShare una empresa de Scribd logo
1 de 79
Descargar para leer sin conexión
第2週
深いモデルの探求
2015年9月4日 増田(@masuda220)
ギルドワークス株式会社 取締役
有限会社システム設計 代表
DDDアライアンス 設立メンバ
3週連続DDD 「ドメイン駆動設計」の要点と実践ノウハウ
そんな人のために …そんな人のために …
・読み解くのが困難
・実践でどう活用するか迷っている
・やってみたがうまくいかない
アジェンダ
• 第1週のおさらい
– 考え方
– 第1部 ドメインモデルを機能させる
– 第2部 モデル駆動設計の構成要素
• 第2週のテーマ
– 第3部 より深い洞察へ向かうリファクタリング
第1週のおさらい
考え方と背景
「まえがき」と「結論」から
エヴァンスの取り組み
この二つを組み合わせて、ソフトウェア開発
に取り組んだ。
その成功と失敗の経験から学んだことをまと
めたものが「ドメイン駆動設計」。
オブジェクト指向
エクストリームプログラミング
LocalDate
クラス
日付を汎用的に扱う手段
Java APIのレイヤ
int year
short month
short day
LocalDateの内部
Java言語仕様のレイヤ
if( day > 31 ) …
DateOfBirth
クラス
「誕生日」に用途を限定した独自定義クラス
「ドメイン層」の一級市民(ドメインオブジェクト)
人間の発想
コンピュータの
仕組み
抽象データ型/段階的な抽象化
人間の発想に近づける
Boolean 今月が誕生月()
Days 誕生日まであと何日()
plusDays()
plusMonths()
「適応型」のソフトウェア開発
開発の
スタイル
方法論
ソフトウェアの
最終形(着地点)
開発サイクル
予測型
ウォータ
フォール
事前に定義
厳密に定義
固定
分析/設計/製造
反復・
漸進型
RUP
それなりに定義
反復ごとに精緻化
方向付/推敲/作成/移行
各フェーズで分析/設計/製造を、
N回「反復」する
適応型
XP
スクラム
ざっくりと定義
日々更新
日、週、春夏秋冬
(人間の生活リズム)
俯瞰
• 第1部 ドメインモデルを機能させる
「ドメインモデル」を中心にすべてを組み立てる
第2部/第3部/第4部に一貫するテーマ
• 第2部 モデル駆動設計の構成要素
基本スキル(第3部と第4部の土台づくり)
このレベルは「必要」そして「不十分」
• 第3部 より深い洞察へ向かうリファクタリング
実際に「役に立つモデル」を育てる
• 第4部 戦略的設計
より広い範囲で、より長期的に取り組む
第1部のおさらい
ドメインモデルを
機能させる
主題:モデルを活用する
第2章
言葉を使った意図の伝達
第1章
ドメインの知識をかみ砕く
第3章
モデルと実装を結びつける
ドメイン
モデル
ドメインの
膨大な情報を
かみ砕き、蒸留して
重要な関心事を
鋭く説明する
選び抜かれた
ドメインの重要な関心事を
コードで表現する
会話を繰り返して
「要約」を改善する
(重要点を明確にする)
「重要な語彙」をメンバーで
合意する/共有する
ドメイン
• ソフトウェアを利用する人たちの
「活動」と「関心事」
– ソフトウェアの利用は、活動全体の一部
– 関心事の焦点は、ビジネスや業務上の成果
• ドメインではないこと
– ソフトウェアを作る活動そのもの
– コンピュータの仕組みや挙動
– 画面仕様書/機能一覧/ユーザーストーリー/…
活動の目的/背景
ドメインとソフトウェア
利用する人たちの
活動と関心事
ソフトウェア
モデル
• 膨大な知識を「要約」した
シンプルでわかりやすい説明
• モデリングのスキル=「要約力」
–重要な要素を発見する力
–本質的でないものを削る力
–厳密に組み立てる力
第1章 知識をかみ砕く
• 「モデル」の成長する様子
• コードでも表現してみる
• 本質的な関心事を探す
• 継続的に学ぶ
• 知識をかみ砕いた成果が「ドメインモデル」
– 利用する人たちの「活動」と「関心事」の本質を「簡
潔」に表現した言葉・図・コード
モデルの成長する様子
少しずつ成長していく感じを掴む
第2章
コミュニケーションと言葉の使用
• 言葉たいせつ
• みんなが持っているすばらしい能力
• それをとことん活用する
言葉たいせつ
• 「エクストリームプログラミング」では、言葉を
使った会話がドキュメントの代わり
• 「言葉」は、そのままクラス/メソッド/パッ
ケージの候補
• あらゆる場所で同じ言葉を
– 会話/チャット/メール/コミットログ/ソースコード
– 早期に食い違いを発見する
第3章
モデルと実装を結びつける
• ドメインの理解にも、コードの設計にも役に立
つ「モデル」(要約)を探す
• 「モデル」と一致した「コードの骨格」は利用者
にも理解できる
• コードを書く人間がドメインを深く理解するのが、
もっとも確実でもっとも効果的なソフトウェア
開発手法
ドメイン駆動設計の3原則
第2章
言葉を使った意図の伝達
第1章
ドメインの知識をかみ砕く
第3章
モデルと実装を結びつける
ドメイン
モデル
ドメインの
膨大な情報を
かみ砕き、蒸留して
重要な関心事を
鋭く説明する
選び抜かれた
ドメインの重要な関心事を
コードで表現する
会話を繰り返して
「要約」を改善する
(重要点を明確にする)
「重要な語彙」をメンバーで
合意する/共有する
【広告】DDDの3原則を体験的に学ぶ
• 【DDD Alliance】
第2回 実践的ドメイン駆動設計ワークショップ
• http://ddd-alliance0002.peatix.com
• 9月26日(土)と10月3日(土)の2日コース
• 有償(1万5千円 税抜)
• 内容
– 「要約力」
– 「ドメインの創造的な学び方」
– 「言葉」を使ったモデリングと設計の体験学習
第2部のおさらい
モデル駆動設計の
構成要素
主題:モデルと実装の協調を保つ
• 第4章 ドメインを隔離する
• 第5章 ソフトウェアで表現されたモデル
• 第6章 ドメインオブジェクトのライフサイクル
• 第7章 言語を使用する:応用例
主題:モデルと実装の一致
• 非常に難しい
– 頭の中の理解がコードで表現できていない
– そこに気づかない
• 無意識で高速な翻訳能力
• モデルとコードの不一致
– 的はずれなソフトウェア
– 構造がねじれたソフトウェア
– 変更コストの増大⇒成功が止まる⇒変化に適応できない
• 何をすべきか
– ドメインの隔離の徹底
– モデルをコードで表現する基本の徹底
– ドメインオブジェクトのライフサイクルの複雑の分離
第4章 ドメインを隔離する
第4章 ドメインを隔離する
• 形式的なコーディングルールや、フレームワーク
の導入は隔離の「出発点」
• ちょっとした修正で、ドメインの知識がドメイン
層以外に拡散する危険を察知する嗅覚を磨く
• プレゼンテーション層からドメインロジックを抽
出してドメイン層に移動し続ける
• データソース層からドメインロジックを抽出して
ドメイン層に移動し続ける
第5章
ソフトウェアで表現されたモデル
「関連」を考えなくて良い
「集約(Aggregates)」を考えなくて良い
データベースとマッピングしやすい
「関心事」があいまい(ごった煮)
「関連」の設計と実装が必要
「集約」の設計が必要
データベースとのマッピングが複雑
「関心事」を発見してクラスに抽出
第5章
ソフトウェアで表現されたモデル
• 「モデル」(利用者の主要な関心事)をプログラ
ムで表現する
• 「モデル」と「実装」の一致は難しい
• そのための基本スキルを体で覚える
• 第3部と第4部の土台
– ほんとうに役に立つのは深いモデルを見つけた時
– 大きな効果がでるのは戦略的に取り組んだ時
第6章
ドメインオブジェクトのライフサイクル
• ドメインオブジェクトのライフサイクル管理は
コードを複雑にする
• 「モデル」の表現から、この複雑さを取り除く
• 「集約」単位で関心事の境界を明確にする
• 「集約」は実装の単位でもある
第7章 より実戦に近い練習
• 「モデル」と「実装」が育っていく過程とリズム
• 「モデル駆動」で設計するということ
– 最初に「アプリケーション層」を導入する
• 「ドメイン層」の議論を「機能」視点から隔離する
• 機能(処理)の詳細化からの設計ではない
– 入出力項目(画面帳票)の定義は登場しない
• プレゼンテーション層無しのドメイン層の設計と実装
– データモデル/テーブル設計は登場しない
• データモデルから独立したドメイン層の設計と実装
第2部は基礎練習
• ボールを蹴って止める基本の練習
• 相手に囲まれても確実にできる
• 90分走りぬいたあとでも確実できる
• ぬかるんだピッチでも確実にできる
• 第2部の内容をどんな状況でも、確実に使え
ることが、「第3部 深いモデル」、「第4部
戦略的設計」を実践する土台になる。
第3部
より深い洞察に向かう
リファクタリング
主題:実際に役に立つモデルを探す
• 第8章 ブレークスルー
• 第9章 暗黙的な概念を明示的にする
• 第10章 しなやかな設計
• 第11章 アナリシスパターンを適用する
• 第12章 デザインパターンをモデルに関係づける
• 第13章 より深い洞察に向かうリファクタリング
第3部 導入
第3部
「ドメイン層」の
設計と実装の議論
「技術用語」が登場しても
「ドメイン層」以外の議論と
ごっちゃにしないこと
役に立つモデル
• ドメインについての深い理解を表現したモデル
– 利用者の「主要な関心事」の「明快な表現」
– 表面的な側面を捨て去る
– 利用する人たちの要望に機敏に対応できる
• 何をすべきか
– 「深いモデル」を目指した「リファクタリング」
– 「言葉」を使った発見/実験/改良
– 実験と成長のための「しなやかな設計」の工夫
リファクタリング
• 「リファクタリング」は主に技術的観点から書か
れている
• それを「モデル」の探求、「ドメイン層」の設計改
善の観点から読み直す
コードのいやな臭い
• 重複したコード
– ドメインの一つの関心事を、複数個所に書いてい
る
• 長いメソッド
– ドメインの概念が手続きの中に埋没している
• 巨大なクラス
– 概念の「抽出」が不十分(暗黙になっている)
• 長すぎる引数リスト
– 用途がはっきりしないメソッド
「分割」ではなく「抽出」
• 長いメソッド
– 長いメソッドの「分割」ではなく
– 意味のあるコードのかたまりをメソッドに「抽出」
• 巨大なクラス
– 巨大なクラスの「分割」ではなく
– 関連性が強いインスタンス変数とロジックを発見してクラスとして「抽
出」
• クラスの多いパッケージ
– パッケージの「分割」ではなく
– 意味のあるクラスのグループを発見して「抽出」
• 「抽出」
– 意味のあるかたまりを見つける
– 名前をつける
– 独立させる
深いモデル
• ドメインエキスパートの主要な関心事と、それ
に深く関連した知識を明快に表現する
– 主要な関心事
– それに深く関係した知識
• ドメインの表面的な側面を捨て去る
• 「モデル」は、全体のごく一部
– 膨大なドメインの知識を蒸留した本質的な部分
– ユビキタス言語の中で骨格になる重要な言葉
– ドメイン層のソースコードの「核」
深いモデル/しなやかな設計
• 「言葉」や「ラフスケッチ」によるモデリングは、非
常に柔軟で、いろいろな実験が簡単にできる
• 「コード」の組み換えは、コストが高く、リスクも大
きい
• 「モデル」と「コード」を一致させながら、「モデル」
の実験をやりやすくするためには、「コード」のしや
なかさが必須
– ソフトウェア設計スキルの見せ所
– しやなかにするために「リファクタリング」し、その結果
さらに「リファクタリング」がやりなすくなる
「モデル」の発見のプロセス
• 「役に立つモデル」は、開発のプロセスの中で
発見していく
• 「モデル」は、ドメインを理解するための「手段」
であると同時に、コードの設計図でもある
– オブジェクト指向らしいアプローチ
• コードを書くことが重要なフィードバック
– 「言葉」や「図」で表現したモデルの具体性と論理
性を検証する良い手段
第8章 ブレークスルー
• ブレークスルーの体験談
– 悪くないモデルなのだが
– ブレークスルー 「シェア」と「シェアパイ」
– さらに深いモデル
– 冷静な意思決定
– 結末
• 好機
• 基本への集中
• エピローグ:新しい洞察の連鎖
「8章 ブレークスルー」を読む
• ブレークスルーの自分の経験を思い出す
– なんだ、こういうことか
– お、そうか
– 目からうろこ
• 変化のリズム
– 緩-緩-急、緩ー緩ー急、…
• 「緩」 は基本を地道に繰り返し、小さな変化を積み重ねる期間
• 「急」 は大きな変化に冷静に対処する期間
• 大きな変化の時
– 「発見の喜び」と「実験」と「実装」を冷静に制御する
– チームで納得して行動する
シェアとシェアパイ
• 融資団(シンジケート)
– 複数の金融機関が共同して融資する
• 限度額
– 最大の貸し出し金額
– シンジケートの金融機関ごとの限度額の合計
– 金融機関ごとの「分担比率(シェア)」が決まる
• 貸出
– 一回の貸し出し
– 貸出ごとに金融機関の「分担比率(シェア)」が決まる
• 限度額の「分担比率」と、貸出の「分担比率」の関係が
ブレークスルーポイントになった話
兆候と結末
• 兆候(198ページ)
– ルールの追加や変更に対応できる程度には、良いコードになっ
ていた
– さまざまな取引ルールが明らかになるにつれ、コードの複雑さが
増し、しだいにルールの追加変更にかかる時間が増えていった
– 丸めによっておこる微妙な不整合
– これほど「苦労」するのは、基本的に設計に問題がある兆候では
ないか?
• 結末(204ページ)
– 自分たちを当惑させる予期せぬ要求変更が飛び出さなくなった
– 丸めのロジックは、(複雑だが)安定し、わかりやすくなった
– 「シェアパイ」が次期バージョンの基本コンセプトになり、製品の
営業トークにも使われるようになった
第8章 まとめ
• リファクタリング(設計改善)で、コードをきれいに保つ
– それなりに、良いコードになっている手ごたえが前提
• それでも、じわじわと増大する複雑さや、変更依頼と
コードとのギャップへの気づき
– ブレークスルーの兆候
• 突然のブレークスルー
– 突破口の発見/実験/適用
• 製品コンセプトや営業活動への波及
• 新しい洞察の連鎖
– このブレークスルーでコードがきれいになったことで、隠され
ていた別のコードの複雑さが明らかになり、新たなブレーク
スルーにつながった
第9章 暗黙的な概念を明示的にする
• 概念を掘り出す
– 言葉に耳を傾ける
– ぎこちなさを精査する
– 矛盾について熟考する
– 文献を読む
– 何度でも挑戦する
• それほど明確でない概念をモデル化する方法
– 明示的な制約
– ドメインオブジェクトとしてのプロセス
• 仕様(Specification)
「概念」を掘り出し表現する手段
• 長いメソッドに隠された概念
– 意味のあるコードのかたまりを見つけ、メソッドに「抽出」
• 巨大なクラスに隠された概念
– 関連性が強いインスタンス変数とロジックを発見して、クラ
スに「抽出」
• クラスの多いパッケージに隠された概念
– 意味のあるクラスのグループを発見して「抽出」
• 「抽出」
– 意味のあるかたまりを見つける
– 名前をつける
– 独立させる
概念を掘り出す努力していますか?
• 言葉に耳を傾ける
• ぎこちなさを精査する
• 矛盾について熟考する
• 文献を読む
• 何度でも挑戦する
ドメイン駆動設計の実践のキモ
9章を読みながら、個人やチームで振り返りを
言葉に耳を傾ける
• 利用者の活動や関心事を知る人(ドメインエキ
スパート)との会話
– 聞き取れない言葉
– 自分の理解となにかが違っていそうな違和感
– 自分が想定して言葉とは別の言葉による回答
– 会話(Q&A)のかみあわなさ
– 相手の怪訝な顔
– 会話の一瞬の間
• すべて、重要な「概念」を発見できる手掛り
ぎこちなさを精査する
• 「欠けている概念」の兆候
– 複雑な処理(長いメソッド)
– いろいろな用途に使われるクラス(巨大なクラス)
– 新しい要求がでてくるたびに、コードが複雑になる箇所
• if/else の追加
• for 内への if 文の追加
• この兆候を見つけたら
– その「複雑さ」への懸念を、「ドメインの言葉」で語ってみる
– 相手は、開発者仲間でも良いし、ドメインエキスパートへの
画面の説明でも良い
– 「ドメイン言葉」を使って、声に出すことが重要
矛盾について熟考する
• 兆候
– ドメインエキスパートが、時と場合によって、矛盾することを
いっているように感じる
– 複数のドメインエキスパートの言葉が、矛盾しているように
感じる
– そこに「未知の概念」が隠れている可能性を考える
• 考える
– すべての兆候を熟考できるわけではない
– すべての兆候に鈍感になると「概念」の「掘り出し」の機会
を失う
– 「少しは考えてみる(時間がきたらあきらめる)」を習慣に
– 「矛盾」を感じたことは記憶しておく
あとで「概念」を掘り出せた時の学びが増える
文献を読む
• 「概念」を探す時の良い手がかり
– その分野の基本的な概念の解説書(入門書)
– ビジネスの一般常識
• 契約
• 会計
• ビジネス文書の書き方
• 全体像、主要な要素、その関係を表現した箇所に、注
目すると効率的
– 目次(全体の構造)
– はじめに(概要説明)
– 図・表
– 用語集
何度でも挑戦する
• 手掛りは些細なことばかり
– 会話の違和感
– 矛盾
– コードの漠然としたごちゃごちゃ感
• こういうことを手掛かりに、「こうやったらどう
なる」「こう考えたらどうなる」を繰り返す
– 回数を繰り返すことが「概念」を発見する基本
– 「考えてみたがわからない」を繰り返すのが良いこ
と
概念を掘り出す努力していますか?
• 言葉に耳を傾ける
• ぎこちなさを精査する
• 矛盾について熟考する
• 文献を読む
• 何度でも挑戦する
ドメイン駆動設計の実践のキモ
9章を読みながら、個人やチームで振り返りを
9章の補足
• 「制約」
• 「プロセス」
• 「仕様」 (Specification)
9章の補足:制約
• 制約が「概念」の発見の手掛りになる
• 制約のなさに「便利さ」ではなく「気持ち悪さ」
を感じよう
– String
– LocalDate
– BigDecimal
– Collection
…
9章の補足:「プロセス」
• オブジェクト指向では表現しにくい概念
• イベントストリームやリアクティブの考え方が武
器になる
– 利用者の関心事を表現する武器
– 「手順」としてのイベントストリーム
– 「状態」の扱い方としてのリアクティブ
9章の補足:「仕様」
• 仕様(Specification)
– 述語論理(AND/OR/NOT/EXIST/…)をオブジェクト指向
的に表現しようとした試み
– オブジェクト指向の苦手な世界
– Prologやデータ正規化の考え方が参考になる
• 論理型パラダイムとか、ルールエンジンとか「ドメ
イン駆動設計」の中で繰り返し登場するテーマ
• 良い実装の仕組みがあれば強力な武器になる
• 利用者の関心事を表現する武器として
第10章 しなやかな設計
• 意図の明白なインタフェース
• 副作用のない関数
• 表明
• 概念の輪郭
• 独立したクラス
• 閉じた操作
• 宣言的な設計
• 設計の宣言的スタイル
• 攻める角度
開発者が「ソフトウェアを利
用する人たちの関心事」に
集中するための工夫
意図の明白なインタフェース
• クラス、操作(メソッド)、パッケージの名前
– 利用する人の関心事をそのまま表現した名前
• 実装を隠す
– 名前からデータ処理の詳細(how)を消す
– ドメインの関心事を語る言葉と、コンピュータの処理を語る
言葉を明確に分離する
• ドメイン層のメソッドの引数の型と返す型
– メソッドの引数はドメインオブジェクトの型を使う
– メソッドが返す型はドメインオブジェクトの型を使う
– 値オブジェクトの重要な用途
• そうすることで「利用する人たちの関心事」を考えてい
る時に、実装の心配事を脇に置いておけるようになる
値オブジェクト(10章の実践)
• 独立したクラス
– 言語仕様のデータ型や、標準のAPIだけで書けることが多
い
• 副作用のない関数
– 不変性(immutable)
– setter を使わない
• 閉じた操作
– 自分自身の型を返す操作
– (Javaだと) LocalDate, BigDecimal, String
• こうすることで、プログラムの安定性が増す
– 変更が楽で安全になる「しなやかな設計」
その他のテクニック
• 表明
– 「制約」による意図の明確化
– ソフトウェアの安定性
– 静的な型チェック、テスト、assert 文
– @NotEmpty などの検証アノテーション
• 宣言的スタイル
– 体で覚える
– SQL, HTML, CSS, XML , …
– 関数型言語
– Java/C#など、手続き型が基本の言語では、宣言的ス
タイルを、いつも意識すること
攻める角度
• あらゆる場所を広く薄く攻めるのは費用対効果が悪い
• サブドメインに切り分けて、重要な場所に集中する
– わかりやすい単位にモジュールを切り出す
– 残った部分もわかりやすくなる
– 重要なサブドメインに集中してしやなかにするほうが効果的
– 第15章で、サブドメインの選択と管理について議論
• 確立した概念体系を参考にする
– 会計
– 商取引(ビジネスプロトコル)
– その分野で確立された計算式
– そのまま深いモデルとしなやかな設計に使える基盤
– そのビジネスに独自の価値を生み出す場所の発見は、また別の
課題(ここも第15章の議論)
第10章のまとめ
• しやなかな設計
• 変更を楽で安全にするための工夫
– 多くの設計原則の動機
• 「深いモデル」を探求するために概念を掘り出し
表現することとコインの裏表
• 技術者が「利用する人たちの関心事」に集中すた
めの工夫
• 「しやなか」なほど、実験がやりやすい
• 実験の数をこなすほど「しなやか」さが向上する
• 実験の場所を限定する
第11章 分析パターンを適用する
• 「分析パターン」はゴールではなく出発点
• 「モデル」(重要な語彙)のネタ探し
• 「ユビキタス言語」のネタ探し
• 「公開された言語」も有用
• その分野の(プログラミングとは関係ない)解
説書や手引書も有用
– 特に「目次」「図表」「用語集」
– 「要約」されているから
参考にしている本
答えではなく「手掛り」
• 良い点
– 「利用する人たちの関心事」を「プログラムで表現」したパターン
集
– モデルと実装が結びついている
• 気を付ける点
– 過剰な抽象化、過剰な汎化
– 一般的な状況をうまく説明できても、特殊な状況をするどく説明
しているわけではない
• 利用方法
– 知らなかった概念や忘れていた概念の気づき
– 何が問題で、どのようにそのパターンを導いたかの「考える過
程」の参考
– 「パターン」の具体例を、自分たちの「言葉」で書き換えてみる
第12章
デザインパターンをモデルに関係づける
• デザインパターン
– 技術的な側面に焦点をあてている
– 動機と解決策を技術的な観点と用語で説明
• 「ドメイン」の概念を表現する道具として読み直す
– 技術的なデザインパターンが、どのようにドメインの問
題に適用できるか/できないか
– 「ドメイン」の言葉で、そのパターンの動機と解決策を
説明できるか?
– チーム内の意識合わせのネタとして
• 技術観点 vs. ドメイン観点
第13章
より深い洞察に向かうリファクタリング
• 開始
• 探求チーム
• 先達の技
• 開発者のための設計
• タイミング
• 好機となる危機
リファクタリングのきっかけ
• コードの複雑さやぎこちなさへの違和感
• 言葉の不一致を感じた時
• 新しい要求がすんなりと既存のコードに適合し
ない時
• コードを読んでいて、それを書いた時の理解が
古い/まちがっていことを発見した時
リファクタリングの
方向とタイミングを間違えないために
• 選抜チームで取り組む
– 変更を先導する人
– 問題を深く考えるのが得意な人
– その領域の経験が深い人
– 強力なモデリングスキルを持つ人
• ユビキタス言語を駆使する
– アイデアだし
– 言葉による実験
– コードによる実験
• ドメインエキスパートの納得感をたいせつに
– エキスパートが納得しない「深いモデル」はありえない
– 「正解」を本人が説明できなくても「違和感」は直観できる
深いモデルへのリファクタリング
実施の意思決定
• 設計が、ドメインに関する「チーム」の現在の理
解を表現していない時
• 「重要な概念」が設計で暗黙的になっている時
(かつ、それを明示的にする方法がわかってい
る時)
• 設計において「重要な部分」を、よりしなやか
にする好機がある時
第3部 まとめ
• 深いモデル
– ドメインについての深い理解を表現したモデル
– 利用者の「主要な関心事」の「明快な表現」
– 表面的な側面を捨て去る
– 利用する人たちの要望に機敏に対応する
– 機敏に対応できないときは改善のチャンス
• 何をすべきか
– 「深いモデル」を目指した「リファクタリング」
– 「言葉」を使って「チーム」で発見/実験/改良
– 実験と成長のための「しなやかな設計」の工夫
ドメイン駆動リファクタリング
• 「分割」ではなく「抽出」
– メソッドの「抽出」
– クラスの「抽出」
– パッケージの「抽出」
• 「抽出」
– 利用者にとって意味のあるかたまりを見つける
– 独立させる(メソッド、クラス、パッケージ)
– 「役に立つ」名前をつける
– この繰り返しが「しなやかな設計」への道
ドメインの理解と実装の
両方に役に立つ名前
概念を掘り出す努力を続けてますか?
• 「言葉」に耳を傾ける
• ぎこちなさを精査する
• 矛盾について熟考する
• 文献を読む
• 何度でも挑戦する
ドメイン駆動設計の実践のキモ
9章を読みながら、個人やチームで振り返りを
最後に
• どんな状況でも改善できる
• どんなときでも「あなた」から改善を始められる
• どんなときでも「今日」から改善を始められる
エクストリームプログラミングの
「はじめに」に記された
ケント・ベックのメッセージ

Más contenido relacionado

La actualidad más candente

イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
Shuhei Fujita
 

La actualidad más candente (20)

ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
 
ソフトウェア開発のやり方の改善
ソフトウェア開発のやり方の改善ソフトウェア開発のやり方の改善
ソフトウェア開発のやり方の改善
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
 
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
 
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
 
正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
 
実践に向けたドメイン駆動設計のエッセンス
実践に向けたドメイン駆動設計のエッセンス実践に向けたドメイン駆動設計のエッセンス
実践に向けたドメイン駆動設計のエッセンス
 
ドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計 コアドメインを語り合ってみようドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計 コアドメインを語り合ってみよう
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 
Humble Object Patternな話
Humble Object Patternな話Humble Object Patternな話
Humble Object Patternな話
 
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 

Destacado

オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
 

Destacado (20)

オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門
 
ドメイン駆動設計の学習曲線とブレークポイント
ドメイン駆動設計の学習曲線とブレークポイントドメイン駆動設計の学習曲線とブレークポイント
ドメイン駆動設計の学習曲線とブレークポイント
 
21世紀のソフトウェア技術者
21世紀のソフトウェア技術者21世紀のソフトウェア技術者
21世紀のソフトウェア技術者
 
いまなぜドメイン駆動設計か
いまなぜドメイン駆動設計かいまなぜドメイン駆動設計か
いまなぜドメイン駆動設計か
 
実践的な設計って、なんだろう?
実践的な設計って、なんだろう?実践的な設計って、なんだろう?
実践的な設計って、なんだろう?
 
wabi sabi のススメ
wabi sabi のススメwabi sabi のススメ
wabi sabi のススメ
 
RDRA DDD Agile
RDRA DDD AgileRDRA DDD Agile
RDRA DDD Agile
 
ドメイン駆動設計 思えば遠くにきたもんだ
ドメイン駆動設計 思えば遠くにきたもんだドメイン駆動設計 思えば遠くにきたもんだ
ドメイン駆動設計 思えば遠くにきたもんだ
 
「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう
 
私がドメイン駆動設計をやる理由
私がドメイン駆動設計をやる理由私がドメイン駆動設計をやる理由
私がドメイン駆動設計をやる理由
 
リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計
 
ドメインモデルの育て方
ドメインモデルの育て方ドメインモデルの育て方
ドメインモデルの育て方
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
 
ちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てるちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる
 
ドメイン駆動設計入門
ドメイン駆動設計入門ドメイン駆動設計入門
ドメイン駆動設計入門
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
 
『JUnit実践入門』写経・実践会 in 横浜 #3
『JUnit実践入門』写経・実践会 in 横浜 #3『JUnit実践入門』写経・実践会 in 横浜 #3
『JUnit実践入門』写経・実践会 in 横浜 #3
 
Xpとシステム思考の シナジー 「8の字を見つけよう」
Xpとシステム思考のシナジー 「8の字を見つけよう」Xpとシステム思考のシナジー 「8の字を見つけよう」
Xpとシステム思考の シナジー 「8の字を見つけよう」
 
Agileな開発からAgileな組織へ #aj21 #b2
Agileな開発からAgileな組織へ #aj21 #b2Agileな開発からAgileな組織へ #aj21 #b2
Agileな開発からAgileな組織へ #aj21 #b2
 
ドメイン駆動設計を実践するプログラマーの悩み
ドメイン駆動設計を実践するプログラマーの悩みドメイン駆動設計を実践するプログラマーの悩み
ドメイン駆動設計を実践するプログラマーの悩み
 

Similar a 3週連続DDDその2 深いモデルの探求(ドメイン駆動設計 第3部)

ウォーターフォールとアジャイル開発の比較 
ウォーターフォールとアジャイル開発の比較 ウォーターフォールとアジャイル開発の比較 
ウォーターフォールとアジャイル開発の比較 
Unicast Inc.
 
XP祭り関西2011 森崎 修司「プラクティスが有効にはたらく前提は明らかになっていますか?」
XP祭り関西2011 森崎 修司「プラクティスが有効にはたらく前提は明らかになっていますか?」XP祭り関西2011 森崎 修司「プラクティスが有効にはたらく前提は明らかになっていますか?」
XP祭り関西2011 森崎 修司「プラクティスが有効にはたらく前提は明らかになっていますか?」
Shuji Morisaki
 
Social Change 〜 ソフトウェア開発者が経営者になるまでと、これからの戦略
Social Change 〜 ソフトウェア開発者が経営者になるまでと、これからの戦略Social Change 〜 ソフトウェア開発者が経営者になるまでと、これからの戦略
Social Change 〜 ソフトウェア開発者が経営者になるまでと、これからの戦略
Yoshihito Kuranuki
 
[ESM_CM セミナー]小さく作って大いに役立つスマートフォンアプリ(CYCLONE)公開用
[ESM_CM セミナー]小さく作って大いに役立つスマートフォンアプリ(CYCLONE)公開用[ESM_CM セミナー]小さく作って大いに役立つスマートフォンアプリ(CYCLONE)公開用
[ESM_CM セミナー]小さく作って大いに役立つスマートフォンアプリ(CYCLONE)公開用
masashi takehara
 

Similar a 3週連続DDDその2 深いモデルの探求(ドメイン駆動設計 第3部) (20)

社内 DDD 勉強会第1回
社内 DDD 勉強会第1回社内 DDD 勉強会第1回
社内 DDD 勉強会第1回
 
ソフトウェア開発の現場風景
ソフトウェア開発の現場風景ソフトウェア開発の現場風景
ソフトウェア開発の現場風景
 
ウォーターフォールとアジャイル開発の比較 
ウォーターフォールとアジャイル開発の比較 ウォーターフォールとアジャイル開発の比較 
ウォーターフォールとアジャイル開発の比較 
 
[141004] cedec 2014 참관기 & 강연 리뷰 #1
[141004] cedec 2014 참관기 & 강연 리뷰 #1[141004] cedec 2014 참관기 & 강연 리뷰 #1
[141004] cedec 2014 참관기 & 강연 리뷰 #1
 
SIerとクラウドの付き合い方
SIerとクラウドの付き合い方SIerとクラウドの付き合い方
SIerとクラウドの付き合い方
 
Service Cloud Trailblazers #5
Service Cloud Trailblazers #5Service Cloud Trailblazers #5
Service Cloud Trailblazers #5
 
ゲームの裏側を支える人たちの裏側
ゲームの裏側を支える人たちの裏側ゲームの裏側を支える人たちの裏側
ゲームの裏側を支える人たちの裏側
 
非開発者のためのアジャイル開発入門
非開発者のためのアジャイル開発入門非開発者のためのアジャイル開発入門
非開発者のためのアジャイル開発入門
 
XP祭り関西2011 森崎 修司「プラクティスが有効にはたらく前提は明らかになっていますか?」
XP祭り関西2011 森崎 修司「プラクティスが有効にはたらく前提は明らかになっていますか?」XP祭り関西2011 森崎 修司「プラクティスが有効にはたらく前提は明らかになっていますか?」
XP祭り関西2011 森崎 修司「プラクティスが有効にはたらく前提は明らかになっていますか?」
 
地図を捨ててコンパスを頼りに進め
地図を捨ててコンパスを頼りに進め地図を捨ててコンパスを頼りに進め
地図を捨ててコンパスを頼りに進め
 
地図を捨ててコンパスを頼りに進め
地図を捨ててコンパスを頼りに進め地図を捨ててコンパスを頼りに進め
地図を捨ててコンパスを頼りに進め
 
「納品のない受託開発」にみるソフトウェア受託開発の未来
「納品のない受託開発」にみるソフトウェア受託開発の未来「納品のない受託開発」にみるソフトウェア受託開発の未来
「納品のない受託開発」にみるソフトウェア受託開発の未来
 
「納品のない受託開発」にみるソフトウェア受託開発の未来
「納品のない受託開発」にみるソフトウェア受託開発の未来「納品のない受託開発」にみるソフトウェア受託開発の未来
「納品のない受託開発」にみるソフトウェア受託開発の未来
 
Agile Overview In Ono
Agile Overview In OnoAgile Overview In Ono
Agile Overview In Ono
 
DSLによる要求獲得でスーパーアジャイル
DSLによる要求獲得でスーパーアジャイルDSLによる要求獲得でスーパーアジャイル
DSLによる要求獲得でスーパーアジャイル
 
保守性の高いアプリケーション設計について
保守性の高いアプリケーション設計について保守性の高いアプリケーション設計について
保守性の高いアプリケーション設計について
 
Social Change 〜 ソフトウェア開発者が経営者になるまでと、これからの戦略
Social Change 〜 ソフトウェア開発者が経営者になるまでと、これからの戦略Social Change 〜 ソフトウェア開発者が経営者になるまでと、これからの戦略
Social Change 〜 ソフトウェア開発者が経営者になるまでと、これからの戦略
 
[ESM_CM セミナー]小さく作って大いに役立つスマートフォンアプリ(CYCLONE)公開用
[ESM_CM セミナー]小さく作って大いに役立つスマートフォンアプリ(CYCLONE)公開用[ESM_CM セミナー]小さく作って大いに役立つスマートフォンアプリ(CYCLONE)公開用
[ESM_CM セミナー]小さく作って大いに役立つスマートフォンアプリ(CYCLONE)公開用
 
仕様七変化
仕様七変化仕様七変化
仕様七変化
 
実践に向けたドメイン駆動設計のエッセンス
実践に向けたドメイン駆動設計のエッセンス実践に向けたドメイン駆動設計のエッセンス
実践に向けたドメイン駆動設計のエッセンス
 

Más de 増田 亨

Más de 増田 亨 (20)

事業活動モデル・システム機能モデル・ビジネスロジックの記述
事業活動モデル・システム機能モデル・ビジネスロジックの記述事業活動モデル・システム機能モデル・ビジネスロジックの記述
事業活動モデル・システム機能モデル・ビジネスロジックの記述
 
ドメインオブジェクトの設計ガイドライン
ドメインオブジェクトの設計ガイドラインドメインオブジェクトの設計ガイドライン
ドメインオブジェクトの設計ガイドライン
 
オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来
 
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
オブジェクト指向プログラミング入門 -- Java object-oriented programming primerオブジェクト指向プログラミング入門 -- Java object-oriented programming primer
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
 
ドメイン駆動設計という設計スタイル
ドメイン駆動設計という設計スタイルドメイン駆動設計という設計スタイル
ドメイン駆動設計という設計スタイル
 
プロダクトづくりのためのソフトウェア設計スタイル
プロダクトづくりのためのソフトウェア設計スタイルプロダクトづくりのためのソフトウェア設計スタイル
プロダクトづくりのためのソフトウェア設計スタイル
 
ソフトウェア設計の学び方を考える
ソフトウェア設計の学び方を考えるソフトウェア設計の学び方を考える
ソフトウェア設計の学び方を考える
 
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチレガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
ビジネスルールの複雑さに立ち向かう
ビジネスルールの複雑さに立ち向かうビジネスルールの複雑さに立ち向かう
ビジネスルールの複雑さに立ち向かう
 
ソフトウェアの核心にある複雑さに立ち向かう
ソフトウェアの核心にある複雑さに立ち向かうソフトウェアの核心にある複雑さに立ち向かう
ソフトウェアの核心にある複雑さに立ち向かう
 
DDD sample code explained in Java
DDD sample code explained in JavaDDD sample code explained in Java
DDD sample code explained in Java
 
アジャイルなソフトウェア設計を目指して
アジャイルなソフトウェア設計を目指してアジャイルなソフトウェア設計を目指して
アジャイルなソフトウェア設計を目指して
 
ドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かすドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かす
 
SoR 2.0 summary
SoR 2.0 summarySoR 2.0 summary
SoR 2.0 summary
 
毎日が越境だ!
毎日が越境だ!毎日が越境だ!
毎日が越境だ!
 
SoR 2.0 基幹システムの再定義と再構築
SoR 2.0 基幹システムの再定義と再構築SoR 2.0 基幹システムの再定義と再構築
SoR 2.0 基幹システムの再定義と再構築
 
ドメイン駆動設計とは何か 【入門編】
ドメイン駆動設計とは何か 【入門編】ドメイン駆動設計とは何か 【入門編】
ドメイン駆動設計とは何か 【入門編】
 
越境する情シス:進化可能なアーキテクチャを手に入れる
越境する情シス:進化可能なアーキテクチャを手に入れる越境する情シス:進化可能なアーキテクチャを手に入れる
越境する情シス:進化可能なアーキテクチャを手に入れる
 
ドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイル
ドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイルドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイル
ドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイル
 

3週連続DDDその2 深いモデルの探求(ドメイン駆動設計 第3部)