Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHPカンファレンス2013 モデルとの向き合い方:ドメイン駆動設計体験ワークショップ スライド
Search
hidenorigoto
September 14, 2013
Technology
10
11k
PHPカンファレンス2013 モデルとの向き合い方:ドメイン駆動設計体験ワークショップ スライド
DDDについての基礎、DDDの俯瞰、実践方法
ワークショップ
hidenorigoto
September 14, 2013
Tweet
Share
More Decks by hidenorigoto
See All by hidenorigoto
ドメインと向き合う - 旅行予約編
hidenorigoto
4
780
「ソフトウェア設計」のドメイン - 「データモデリングでドメインを駆動する」を読んで
hidenorigoto
10
2.9k
メルカリ バックエンド領域のこれまでとこれから
hidenorigoto
1
460
メルカリのエンジニアリング組織の変化〜Engineering Managerの視点から〜
hidenorigoto
0
8.1k
The changes of the engineering organization in Mercari - from the view of an engineering manager -
hidenorigoto
0
280
PHPerKaigi 2019 ランチセッション (3/31)
hidenorigoto
1
4k
抽象化って何? (What is abstraction?)
hidenorigoto
9
4.5k
抽象化って何? (What is abstraction?)
hidenorigoto
11
6.7k
続・SOLIDの原則ってどんなふうに使うの? 〜オープン・クローズドの原則 センパイのコーディングノート編〜
hidenorigoto
14
5.9k
Other Decks in Technology
See All in Technology
ディスプレイ広告(Yahoo!広告・LINE広告)におけるバックエンド開発
lycorptech_jp
PRO
0
210
ESXi で仮想化した ARM 環境で LLM を動作させてみるぞ
unnowataru
0
150
設計を積み重ねてシステムを刷新する
sansantech
PRO
0
130
PHPで印刷所に入稿できる名札データを作る / Generating Print-Ready Name Tag Data with PHP
tomzoh
0
180
Potential EM 制度を始めた理由、そして2年後にやめた理由 - EMConf JP 2025
hoyo
2
1.6k
LINEギフトにおけるバックエンド開発
lycorptech_jp
PRO
0
190
AIエージェント入門
minorun365
PRO
13
7.3k
Share my, our lessons from the road to re:Invent
naospon
0
130
人はなぜISUCONに夢中になるのか
kakehashi
PRO
6
1.8k
【内製開発Summit 2025】イオンスマートテクノロジーの内製化組織の作り方/In-house-development-summit-AST
aeonpeople
1
500
Cracking the Coding Interview 6th Edition
gdplabs
14
28k
JavaにおけるNull非許容性
skrb
1
1.1k
Featured
See All Featured
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
30
2.2k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.7k
Testing 201, or: Great Expectations
jmmastey
42
7.2k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
The Invisible Side of Design
smashingmag
299
50k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2.1k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
GitHub's CSS Performance
jonrohan
1030
460k
Fashionably flexible responsive web design (full day workshop)
malarkey
406
66k
Large-scale JavaScript Application Architecture
addyosmani
511
110k
Rebuilding a faster, lazier Slack
samanthasiow
80
8.8k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
30
4.6k
Transcript
DDD(ドメイン駆動設計) 体験ワークショップ PHPメンターズ 後藤 秀宣 / 久保 敦啓 1 PHPカンファレンス2013
2013.09.14 139݄15༵
アジェンダ • 基礎編 • DDD基礎、実践方法 • ワークショップ • 要件の説明他 •
モデリング他 • 実装への落とし込み(の説明) 2 139݄15༵
3 PHP界隈でのDDD 139݄15༵
実用段階 • 言語の成熟、フレームワークの成熟に より、実用段階に入った • DDDを素直に適用可能な技術フレーム ワークが隆盛 Symfony、zf2等 • 海外の大きなPHPカンファレンスでは
DDD関連の講演が毎回複数ある 4 139݄15༵
1 基礎編 5 139݄15༵
6 前提 良いソフトウェア とは? 139݄15༵
良くないものは? • メンテナンスしづらい • テストできない • コードが読みづらい 7 139݄15༵
良くないものは? • メンテナンスしづらい • テストできない • コードが読みづらい 7 なぜ読みづらいのか 考えたことはありますか?
139݄15༵
読みづらいコード • なぜ読みづらいのか? • 規約? • 長い? • 設計? 8
139݄15༵
読みづらいコード 9 139݄15༵
読みづらいコード 9 短い、規約にそっているが 読んでいて「えっ?」となる 139݄15༵
良くないものは? • メンテナンスしづらい • テストできない • コードが読みづらい 10 139݄15༵
良くないものは? • メンテナンスしづらい • テストできない • コードが読みづらい 10 プログラマのメンタルモデル とかけはなれている
139݄15༵
良いソフトウェアとは? 11 Brian "DoctaBu" Moore 139݄15༵
良いソフトウェアとは? 11 メンタルモデルとの乖離が ないソフトウェア Brian "DoctaBu" Moore 139݄15༵
違和感に敏感になろう 12 メンタルモデルとの 乖離・相違に気づく モデルを忠実に 表現する 139݄15༵
13 1-1 DDD基礎 139݄15༵
何であって、何でないか • 実装のためのパターン • なんとかプロセス • OOPの高度な使い方 • 良いソフトウェアを開発するための 設計のガイドライン、フレームワーク
• パターン集(パターンランゲージ) • 哲学 14 139݄15༵
DDDまえがき 15 139݄15༵
DDDまえがき • 明確に体系化されてはいないものの、オ ブジェクトコミュニティの底流として、 ある哲学が出現してきている。私はその 哲学を、ドメイン駆動設計と呼んでい る。 • 本書で提供するのは、設計上の意思決定 を行なうためのフレームワークと、ドメ
イン駆動設計について議論するための技 術的な語彙である。 16 139݄15༵
17 DDDを俯瞰する 139݄15༵
18 139݄15༵
19 139݄15༵
最重要パターン • ユビキタス言語 • モデル駆動設計 20 139݄15༵
21 139݄15༵
22 モデリングとは? • DDD p2 モデルとは簡素化 どんなモデルも、現実の何らかの側面や興味 の対象となる概念を表している。モデルとは 簡素化である。つまり、当面の問題を解決す る上で関連する側面を抽象化し、それ以外の
詳細を無視することによって行われた、現実 に対する1つの解釈なのだ。 139݄15༵
モデリングと設計の違い • モデリング=設計書作成の手がかり 23 厚紙をハサミでチョキチョキ切って、それをセロテープでペタペタ とはりあわせて、建物の見本を作っている場面。モデリングだ。 見本は見本でしかない。材質が違うし、窓も入口もないし、柱も床 もない。つまり、その見本だけでは本物の建物を作ることはできな い。作るのに必要な情報が不足しているからだ。設計書とは「これ だけの情報があれば作れる」という情報を持っている必要がある。
そしてモデリングはその設計書作成の手掛かりでしかない。 http://d.hatena.ne.jp/masayang/20070402/1175584867 139݄15༵
24 モデル探索のうずまき 139݄15༵
25 1-3 DDDの実践方法 139݄15༵
実践方法 26 最重要パターンの意識 ユビキタス言語 モデル駆動設計 ドメイン辞書 ユビキタス言語 ユースケース起点 ドメインモデル ミニマムビルディングブロック
139݄15༵
実践イメージ 27 ICONIXプロセス 139݄15༵
実践イメージ 27 モデリング ICONIXプロセス 139݄15༵
実践イメージ 27 モデリング 設計 ICONIXプロセス 139݄15༵
28 実際にやってみよう 139݄15༵
2 ワークショップ 29 139݄15༵
流れ 30 • 要件の説明 • ドメイン辞書作成 • ドメインモデリング • ユースケース作成
• 実装について 139݄15༵
31 2-1 要件 139݄15༵
状況 • 山村書店という書店のシステム • 店舗販売とネットショップ併用 • 会員サービスがある • 会員は2段階あり、有料の優待会員にはポ イントによる値引きなど特典サービスがあ
る • 優待会員へアップグレードは申請が必要 • IT部門はない 32 139݄15༵
33 この企業へ訪問して 開発するシステムについて ヒアリング 139݄15༵
ヒアリング(抜粋) 34 来年度から会員向けサービスに力を入れることになりまして、その一環として会員の プレミアム処理を効率化したいんです。それでこの部分のシステム化をお願いするこ とになりました。 プレメン申請の受け付けは店舗で行っているんですぅ。カウンターに置いてあるプレ メン申請用紙に記入してもらってぇ、それを受け取ったらパソで履歴なんかを調べ てぇ、OKそうだったら認証サインして、その用紙を本社へFAXしてるんですよぉ。 有償サービスになるので、クレジットカードの与信を本社側で確認することになりま す。カード会社の審査OKであれば会員システムに登録します。クレジットカード会
社単位でまとめて、その日の深夜にまとめて処理してもらいたいです。 ੨ࢁ͞Μ ͞Μ ଜాઐ 139݄15༵
ヒアリング(抜粋) 35 店舗スタッフが購買状況を確認してFAXする作業の手間とミスがあるので、基本的に は会員自らインターネットで申請できるようにしたいのです。ただ、店舗の端末もイ ンターネットにつながっていますので、店舗スタッフの業務も行えるようにしてほし いんです。 お客さんが会員番号忘れちゃったりしても突き返すわけにはいかないでしょぉ。お客 さんの名前や電話番号から会員を探すんだけどぉ、登録してある電話番号が変わっ ちゃってたり(笑) あと会員じゃない人がいきなりプレメンになりたいとか言われ ても困るんですけどぉ(怒)
今回は申請の受け付け業務のみですが、これを軸として今後10年で会員数を100 倍にするための足がかりとなる重要なシステムと位置づけています。 ੨ࢁ͞Μ ͞Μ ଜాઐ 139݄15༵
36 2-2 ドメイン辞書 139݄15༵
ドメイン辞書 • ドメインの用語集 • ユビキタス言語 • 主語だけでなく述語にも気を配る • 現場の人がどういった言葉で話している のか
• 業界標準の語彙を学ぶ • 時間をかけすぎない 37 139݄15༵
ドメイン辞書 • 会員 • プレミアム会員 • プレミアム会員申請用紙 • 購買履歴 38
139݄15༵
39 2-3 ドメインモデル 139݄15༵
ドメインモデル • 最初から正解を求めすぎない • 短い時間のブレインストーミング等 • 記述の詳細にこだわりすぎない • 厳密なUML •
略式UML、付箋紙CRCではじめる 40 CRCカード 『オブジェクトデザイン』 白紙のCRC 『レガシーコード改善ガイド』17.2 (p.236) 139݄15༵
DDD本の略式UML 41 オブジェクト名 139݄15༵
付箋紙CRC 42 オブジェクト名 139݄15༵
ビルディングブロック • エンティティ(識別する必要がある) • リポジトリ(エンティティの貯蔵庫) • サービス(上記以外、シナリオのような ものなど) 43 139݄15༵
44 2-4 ユースケース 139݄15༵
ユースケース • ドメインモデル/ユビキタス言語の検証 • 動的な側面 • いろいろな方法で試みる • 会話 •
白紙のCRC • シナリオ(ストーリー) 45 声に出してモデリングする 139݄15༵
ユースケースのレイヤー • アプリケーションユースケース • ドメイン(ビジネス)ユースケース 46 ドメインユースケースだけでスタートする と俯瞰しづらい場合がある 139݄15༵
ユースケース例 47 ユーザーがログインする システムはログイン画面を表示する。ユーザー はユーザー名とパスワードを入力して、「ログ イン」ボタンをクリックする。システムはユー ザー名からユーザーの情報を取り出し、パス ワードをチェックする。そして、ユーザーはシ ステムにログインする。 アプリケーションユースケース
139݄15༵
ユースケース例 48 ユーザーがログインする ユーザー認証サービスがユーザー名とパスワー ドを受け取る。ユーザー名を元にユーザーリポ ジトリから該当するユーザーエンティティを取 り出す。ユーザーエンティティのパスワードの 検証に成功すれば認証成功とする。 ドメインユースケース サービスを起点とする
139݄15༵
白紙のCRC 49 オブジェクト名 すら書かない 白紙のCRC 『レガシーコード改善ガイド』17.2 (p.236) 139݄15༵
50 ユースケース ドメイン辞書 (ユビキタス言語) ドメインモデル 139݄15༵
51 2-5 実装への落とし込み 139݄15༵
実装への落とし込み • 適切なアーキテクチャをもった技術フレームワークであ れば、モデルを素直に実装に落とし込める • 指針 • サービスから始める • サービスは道具をDIで受け取って良い
• ステートレスに • エンティティはPureに • リポジトリはORMと折り合いをつける • ORM依存をリポジトリに閉じ込める 52 139݄15༵
ディレクトリ 53 139݄15༵
PHPのメリットを活かす • Lazyである点 • パッケージのゆるさ • 実装の配置、インターフェイスなど の分離は、必要になる時まで遅らせ ることができる 54
139݄15༵
55 まとめ 139݄15༵
良いソフトウェアとは? 56 メンタルモデルとの乖離が ないソフトウェア Brian "DoctaBu" Moore 139݄15༵
何であって、何でないか • 実装のためのパターン • なんとかプロセス • OOPの高度な使い方 • 設計のガイドライン、フレームワーク •
パターン集(パターンランゲージ) • 哲学 57 139݄15༵
58 139݄15༵
今回の成果を 59 • ブログやtwitter、メールなどでご感想お 聞かせください • DDDは、現場ですぐにでも活かすべき 139݄15༵
今回の成果を 59 • ブログやtwitter、メールなどでご感想お 聞かせください • DDDは、現場ですぐにでも活かすべき 良いエンジニアに なろう! 139݄15༵
60 参考書籍 139݄15༵
ドメイン駆動設計 61 • 基本的な考え方・取 り組み方から、実践 に適用可能なパター ンまで幅広く解説 139݄15༵
ユースケース駆動開発実践ガイド 62 • ユースケースからオ ブジェクトの実装ま でをカバーする ICONIXプロセスの解 説・実践書 • トップ10形式など要
点をつかみやすい 139݄15༵
実践プログラミングDSL 63 • DSLについての基礎 知識から実装までカ バー 139݄15༵
アジャイルソフトウェア開発の奥義 64 • 実装部分について、 オブジェクト指向ク ラス設計の原則 (SOLID原則)、ク ラスの安定性等 139݄15༵
ジェネレーティブプログラミング • DSL、AOP、インテン ショナルプログラミ ング、ドメイン工学 等包括的に扱う 65 139݄15༵