狠狠撸

狠狠撸Share a Scribd company logo
私がドメイン駆动设计をやる理由
ギルドワークス 増田
2014年8月26日
DevLOVE 現場甲子園2014 東日本大会 「技」
ソフトウェアの変更に
苦しんでいませんか?
? どこに何が書いてあるか、わからない
? ちょっとした変更なのに、あちこち修正が必要
? 副作用が怖くて、既存コードがいじれない
…
ドメイン駆動設計をがんばると
ソフトウェアの変更コストが
劇的に下がる
変更コストが下がれば
ソフトウェアの
成長の可能性が広がる
before ドメイン駆動設計
after ドメイン駆動設計
ドメイン駆動設計
before - after
これ以上なにもできないソフトウェア 成长力のあるソフトウェア
ドメイン駆動設計のエッセンス
? モデル駆動
? 三層+ドメインモデル
? チームをドメイン駆动に
モデル駆動
現実世界
の関心事
モデル
(模型) ソースコード
単純化
コードで
表現
動くソフトウェア
モデル駆動
? 現実世界の「関心事の模型」をつくる
– 単純化(要点と基本の構造)
? クラス図っぽい絵
? 言葉
– 会話(打合せ、雑談、…)
– 文章(メール、wiki、issue、commit , … )
? 「関心事の模型」をコードで表現
– 動くソフトウェア
– プログラミング言語/フレームワーク/実行環境とい
う「制約」
? 改善を繰り返す
改善を繰り返す
現実世界
の関心事
モデル
(模型) ソースコード
単純化
コードで
表現
動くソフトウェア
一回では
うまくいかない
一回では
うまくいかない
動くソフトウェアで検証
プロジェクト初日の関心事模型
? パッケージ図
顧客
商品
注文
出荷 売上?請
求?回収
値引き 返品
<<use>>
( = import 文)
関心事の基本構造
=プログラムの基本構造
参照関係の「複雑さ」や「あいまいさ」が、設計課題を暗示している
?
?
?
三層+ドメインモデル
? 業務視点でコードを整理する枠組み
– このアーキテクチャに移行したのが、ドメイン駆動設計
実践のターニングポイントだった
– 業務の関心事を「ドメインモデル」に集約する
? 業務の関心事の構造をプログラムの構造に反映
– どこに何が書いてあるか「業務の関心事」の視点で、
コードを整理する
– 変更の依頼があった時に、変更箇所が探しやすくなる
– 業務的に関連しない箇所で、変更の副作用が起きな
くなる
三層アーキテクチャの問題
プレゼンテーション層
アプリケーション層
データソース層
OrderForm.vm
OrderConfirm.vm
OrderRegistered.vm
@Controller
class OrderEntryController
… // bind & validate
@Service
class OrderRegisterService
…
void register( Order order )
@Repository
class OrderDatasource
…
void save( Order order )
業務ロジックの断片が
まぎれこみがち
かつ
その断片が複数画面に
重複しがち
複数の機能に
同じロジックが重複しがち
業務ロジックの断片が
まぎれこみがち
かつ
複数の機能や画面用に
同じコードを書きがち
三層+ドメインモデル
プレゼンテーション層
アプリケーション層
データソース層
OrderForm.vm
OrderConfirm.vm
OrderRegistered.vm
@Controller
class OrderEntryController
… // bind & validate
@Service
class OrderRegisterService
…
void register( Order order )
@Repository
class OrderDatasource
…
void save( Order order )
ドメインモデル
class Order
class Items
class ShipTo
class BillingTo
class ContactInfo
…
interface OrderRepository
<<use>>
import model.Order
業務ロジックの抽出と移動
矢印の意味
ドメイン駆動設計にたどりつくまで
? 大炎上プロジェクト
? 分岐点
? チームがドメイン駆动に変わっていく
大炎上プロジェクト
? バグだらけ
– 変更画面は使用不可、レポート出力タイムアウト、他のユーザのデータ
が丸見え、データ整合性チェックバッチ、…
? リファクタリングやりほうだい
– いまより悪くなるわけない
– 一か月くらい、毎日2回本番リリース
? リファクタリングの効果絶大/面白いほどコード整理が進んだ
– 名前の変更
– 説明用変数
– メソッドの抽出
– クラスの抽出
– ビューとモデルの分離
– モデルとデータベース操作の分離
…
ドメイン駆動設計への分かれ道
? クラス構成やレイヤ構成で意見に違いがでてきた
– 技術視点のコード整理
– 業務視点のコード整理
? 技術視点のコード整理
– ネタは盛りだくさん
– 当時発展しつつあった、Webアプリケーションのフレー
ムワークやツール導入の誘惑
? 業務視点のコード整理
– 障害は業務的なものばかり
? テクニカルには正しく動くようになってきていた
– 機能の追加?修正の要求は業務的なものばかり
業務視点のコード整理
? 三層+ドメインモデルのアーキテクチャ
– ターニングポイント
– 業務の関心事構造=プログラムの構造
– 業務の用語を、パッケージ名/クラス名/メソッド
名/引数名/変数名に反映
? 業務視点のリファクタリング
– 初期の設計よりも、継続的な設計改善がポイント
? 改善する機会が多い
? 累積効果も大きい
チームがドメイン駆动に変わっていく
? 業務視点でコードを整理する効果の実感
? 手続型からオブジェクト指向へ
? 技术视点から业务视点へ
業務視点でコードを整理する効果の実感
? 業務視点のリファクタリング
– やり方と効果を実感できると、がらっと変わる
– 障害対応や機能追加が絶好のチャンス
– 変更の前に「必ずやるべき作業」として徹底する
? 業務ロジックの重複記述を発見する
– メソッドやクラスに抽出して重複をなくしておく
? 他のレイヤの業務ロジックの断片を発見する
– メソッドに抽出して、ドメインのクラスに移動しておく
? 効果
– 変更すべき箇所を特定しやすい
– 変更するコード量が減る
– 変更の影響範囲がローカルになり、副作用の心配が減る
– 自信を持って変更できる
手続き型からオブジェクト指向へ
? 最初は小学生ルール
– メソッドやクラスの行数とか、引数の数とか
– 「リファクタリング」の「いやな臭い」の勉強会
– 怪しい箇所/直すべき箇所の臭いがだんだんわかってくる
? 設計改善の基本テクニックの習得
– メソッドの抽出
– ガード節と早期リターン
– Value Object
– ファーストクラスコレクション
– 振る舞いを持った定数
– 「区分」ごとのサブクラス化
? 区分ごとのロジックをそれぞれ専用クラスに分ける
? 「業務視点のリファクタリング」の徹底
– 業務ルール(加工、判断、計算)をメソッド化する
– 業務用語のクラス化/パッケージ化
– 改善を繰り返す(放置すると劣化する)
技术视点から业务视点へ
? 語彙力
– 業務用語の「語彙」を増やす(使う機会を増やす)
– 会話や文書で「業務用語」の正しい使い方を確認
– 似た用語の「使い分け」の練習
? ビジネス論理力
– 顧客の関心度の強弱を当てる練習
? Q&Aや状況説明などで、業務のいちばんの関心事(用語)を一番最初
に持ってくる練習
? whatとwhyの説明に業務の用語をちりばめる練習
? 断片化しあちこちにちらばった業務ロジックの発見ゲーム
– ビュー
– コントローラ
– データベースアクセス
? 技術者だけで話す時に、使う言葉が変わってきたら、本物
チームがドメイン駆动に変わっていく
? 業務視点でコードを整理する効果の実感
? 手続型からオブジェクト指向へ
? 技术视点から业务视点へ
ソフトウェアの変更に
苦しんでいませんか?
? どこに何が書いてあるか、わからない
? ちょっとした変更なのに、あちこち修正が必要
? 副作用が怖くて、既存コードがいじれない
…
ドメイン駆動設計があなたを救う
これ以上なにもできないソフトウェア 成长力のあるソフトウェア

More Related Content

What's hot (20)

PDF
ドメイン駆動で開発する ラフスケッチから実装まで
増田 亨
?
PPTX
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
Koichiro Matsuoka
?
PDF
ドメイン駆動設計 基本を理解する
増田 亨
?
PDF
ドメインオブジェクトの见つけ方?作り方?育て方
増田 亨
?
PDF
ドメイン駆动设计 分析しながら设计する
増田 亨
?
PDF
ドメイン駆動設計 の 実践 Part3 DDD
増田 亨
?
PDF
ドメイン駆動設計 失敗したことと成功したこと
BIGLOBE Inc.
?
PDF
ドメイン駆动设计(顿顿顿)の実践笔补谤迟2
増田 亨
?
PDF
3週連続DDDその3 ドメイン駆動設計 戦略的設計
増田 亨
?
PDF
ドメインオブジェクトの设计ガイドライン
増田 亨
?
PDF
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
Koichiro Matsuoka
?
PDF
ドメイン駆动设计に15年取り组んでわかったこと
増田 亨
?
PDF
リッチなドメインモデル 名前探し
増田 亨
?
PDF
RDRA DDD Agile
増田 亨
?
PDF
ドメイン駆动设计 コアドメインを语り合ってみよう
増田 亨
?
PPTX
ドメイン駆动设计の学习曲线とブレークポイント
増田 亨
?
PDF
実践的な设计って、なんだろう?
増田 亨
?
PDF
ドメイン駆动设计という仕事の流仪
増田 亨
?
PDF
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
?
PDF
ドメイン駆动设计サンプルコードの彻底解説
増田 亨
?
ドメイン駆動で開発する ラフスケッチから実装まで
増田 亨
?
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
Koichiro Matsuoka
?
ドメイン駆動設計 基本を理解する
増田 亨
?
ドメインオブジェクトの见つけ方?作り方?育て方
増田 亨
?
ドメイン駆动设计 分析しながら设计する
増田 亨
?
ドメイン駆動設計 の 実践 Part3 DDD
増田 亨
?
ドメイン駆動設計 失敗したことと成功したこと
BIGLOBE Inc.
?
ドメイン駆动设计(顿顿顿)の実践笔补谤迟2
増田 亨
?
3週連続DDDその3 ドメイン駆動設計 戦略的設計
増田 亨
?
ドメインオブジェクトの设计ガイドライン
増田 亨
?
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
Koichiro Matsuoka
?
ドメイン駆动设计に15年取り组んでわかったこと
増田 亨
?
リッチなドメインモデル 名前探し
増田 亨
?
RDRA DDD Agile
増田 亨
?
ドメイン駆动设计 コアドメインを语り合ってみよう
増田 亨
?
ドメイン駆动设计の学习曲线とブレークポイント
増田 亨
?
実践的な设计って、なんだろう?
増田 亨
?
ドメイン駆动设计という仕事の流仪
増田 亨
?
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
?
ドメイン駆动设计サンプルコードの彻底解説
増田 亨
?

Viewers also liked (8)

PPTX
How to customize redmine public
Hirotaka Nishimiya
?
PDF
20141108 俺のエンシ?ニアリンク? #devlove
Takao Oyobe
?
PDF
ドメインモデルの育て方
増田 亨
?
PPTX
「実践ドメイン駆動設計」社内読書会まとめ ~IDDD本難民に捧げる1章から7章~
A AOKI
?
PDF
20140301ハッカース?チャンフ?ルー告知濒迟
Koichiro Nishijima
?
PDF
困らない程度の闯顿碍入门
Yohei Oda
?
PPTX
超先取り厂丑别苍补苍诲辞补丑骋颁
Yohei Oda
?
PDF
叠迟辞颁でバインド変数
Yoshito Ueki
?
How to customize redmine public
Hirotaka Nishimiya
?
20141108 俺のエンシ?ニアリンク? #devlove
Takao Oyobe
?
ドメインモデルの育て方
増田 亨
?
「実践ドメイン駆動設計」社内読書会まとめ ~IDDD本難民に捧げる1章から7章~
A AOKI
?
20140301ハッカース?チャンフ?ルー告知濒迟
Koichiro Nishijima
?
困らない程度の闯顿碍入门
Yohei Oda
?
超先取り厂丑别苍补苍诲辞补丑骋颁
Yohei Oda
?
叠迟辞颁でバインド変数
Yoshito Ueki
?
Ad

Similar to 私がドメイン駆动设计をやる理由 (20)

PDF
ソフトウェアの核心にある复雑さに立ち向かう
増田 亨
?
PDF
レガシーコードの复雑さに立ち向かう~ドメイン駆动设计のアプローチ
増田 亨
?
PDF
ドメイン駆动设计をゲーム开発に活かす
増田 亨
?
PDF
ドメイン駆动设计の正しい歩き方
増田 亨
?
PDF
「ト?メイン駆动设计」の复雑さに立ち向かう
増田 亨
?
PDF
ドメイン駆动设计入门
増田 亨
?
PDF
20130202 ドメイン駆動設計読書会at名古屋のお誘い
Ryo RKTM
?
PDF
ドメイン駆動設計 本格入門
増田 亨
?
PDF
ドメインロジックに集中せよ ?ドメイン駆動設計 powered by Spring
増田 亨
?
PDF
実践に向けたト?メイン駆动设计のエッセンス
GuildWorks
?
PPT
ドメインロジックの実装方法とドメイン駆动设计
Tadayoshi Sato
?
PDF
ドメイン駆动设计入门
Yukei Wachi
?
PDF
ドメイン駆动设计のプラクティスでカバーできること、できないこと摆顿顿顿闭
Koichiro Matsuoka
?
PDF
ドメイン駆动设计という设计スタイル
増田 亨
?
PDF
20130202 ドメイン駆動設計読書会at名古屋のお誘い β
Ryo RKTM
?
PDF
いまなぜドメイン駆动设计か
増田 亨
?
PDF
Python におけるドメイン駆動設計(戦術面)の勘どころ
Junya Hayashi
?
PDF
【19-叠-5】出张!顿顿顿难民救済キャンプ
kentaro watanabe
?
PDF
ト?メイン駆動設計の捉え方 20150718
Mao Ohnishi
?
PPTX
ドメイン駆动设计入门
KenjiroUehara
?
ソフトウェアの核心にある复雑さに立ち向かう
増田 亨
?
レガシーコードの复雑さに立ち向かう~ドメイン駆动设计のアプローチ
増田 亨
?
ドメイン駆动设计をゲーム开発に活かす
増田 亨
?
ドメイン駆动设计の正しい歩き方
増田 亨
?
「ト?メイン駆动设计」の复雑さに立ち向かう
増田 亨
?
ドメイン駆动设计入门
増田 亨
?
20130202 ドメイン駆動設計読書会at名古屋のお誘い
Ryo RKTM
?
ドメイン駆動設計 本格入門
増田 亨
?
ドメインロジックに集中せよ ?ドメイン駆動設計 powered by Spring
増田 亨
?
実践に向けたト?メイン駆动设计のエッセンス
GuildWorks
?
ドメインロジックの実装方法とドメイン駆动设计
Tadayoshi Sato
?
ドメイン駆动设计入门
Yukei Wachi
?
ドメイン駆动设计のプラクティスでカバーできること、できないこと摆顿顿顿闭
Koichiro Matsuoka
?
ドメイン駆动设计という设计スタイル
増田 亨
?
20130202 ドメイン駆動設計読書会at名古屋のお誘い β
Ryo RKTM
?
いまなぜドメイン駆动设计か
増田 亨
?
Python におけるドメイン駆動設計(戦術面)の勘どころ
Junya Hayashi
?
【19-叠-5】出张!顿顿顿难民救済キャンプ
kentaro watanabe
?
ト?メイン駆動設計の捉え方 20150718
Mao Ohnishi
?
ドメイン駆动设计入门
KenjiroUehara
?
Ad

More from 増田 亨 (16)

PDF
ソフトウェア开発のやり方の改善
増田 亨
?
PDF
事业活动モデル?システム机能モデル?ビジネスロジックの记述
増田 亨
?
PDF
オブジェクト指向プログラミングの现在?过去?未来
増田 亨
?
PDF
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
増田 亨
?
PDF
プロダクトづくりのためのソフトウェア设计スタイル
増田 亨
?
PDF
ソフトウェア设计の学び方を考える
増田 亨
?
PDF
マイクロサービス 4つの分割アプローチ
増田 亨
?
PDF
ビジネスルールの复雑さに立ち向かう
増田 亨
?
PDF
DDD sample code explained in Java
増田 亨
?
PDF
アジャイルなソフトウェア设计を目指して
増田 亨
?
PDF
SoR 2.0 summary
増田 亨
?
PDF
毎日が越境だ!
増田 亨
?
PDF
SoR 2.0 基幹システムの再定義と再構築
増田 亨
?
PDF
越境する情シス:进化可能なアーキテクチャを手に入れる
増田 亨
?
PDF
ドメイン駆动设计の基础知识:设计のスタイル、开発のスタイル
増田 亨
?
PDF
现场で役立つシステム设计の原则
増田 亨
?
ソフトウェア开発のやり方の改善
増田 亨
?
事业活动モデル?システム机能モデル?ビジネスロジックの记述
増田 亨
?
オブジェクト指向プログラミングの现在?过去?未来
増田 亨
?
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
増田 亨
?
プロダクトづくりのためのソフトウェア设计スタイル
増田 亨
?
ソフトウェア设计の学び方を考える
増田 亨
?
マイクロサービス 4つの分割アプローチ
増田 亨
?
ビジネスルールの复雑さに立ち向かう
増田 亨
?
DDD sample code explained in Java
増田 亨
?
アジャイルなソフトウェア设计を目指して
増田 亨
?
SoR 2.0 summary
増田 亨
?
毎日が越境だ!
増田 亨
?
SoR 2.0 基幹システムの再定義と再構築
増田 亨
?
越境する情シス:进化可能なアーキテクチャを手に入れる
増田 亨
?
ドメイン駆动设计の基础知识:设计のスタイル、开発のスタイル
増田 亨
?
现场で役立つシステム设计の原则
増田 亨
?

私がドメイン駆动设计をやる理由