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
650
「ソフトウェア設計」のドメイン - 「データモデリングでドメインを駆動する」を読んで
hidenorigoto
10
2.7k
メルカリ バックエンド領域のこれまでとこれから
hidenorigoto
1
410
メルカリのエンジニアリング組織の変化〜Engineering Managerの視点から〜
hidenorigoto
0
8k
The changes of the engineering organization in Mercari - from the view of an engineering manager -
hidenorigoto
0
250
PHPerKaigi 2019 ランチセッション (3/31)
hidenorigoto
1
3.9k
抽象化って何? (What is abstraction?)
hidenorigoto
9
4.4k
抽象化って何? (What is abstraction?)
hidenorigoto
11
6.5k
続・SOLIDの原則ってどんなふうに使うの? 〜オープン・クローズドの原則 センパイのコーディングノート編〜
hidenorigoto
14
5.8k
Other Decks in Technology
See All in Technology
OCI Security サービス 概要
oracle4engineer
PRO
0
6.5k
テストコード品質を高めるためにMutation Testingライブラリ・Strykerを実戦導入してみた話
ysknsid25
7
2.6k
マルチモーダル / AI Agent / LLMOps 3つの技術トレンドで理解するLLMの今後の展望
hirosatogamo
37
12k
Taming you application's environments
salaboy
0
180
Python(PYNQ)がテーマのAMD主催のFPGAコンテストに参加してきた
iotengineer22
0
470
Terraform未経験の御様に対してどの ように導⼊を進めていったか
tkikuchi
2
430
スクラム成熟度セルフチェックツールを作って得た学びとその活用法
coincheck_recruit
1
140
TypeScript、上達の瞬間
sadnessojisan
46
13k
Security-JAWS【第35回】勉強会クラウドにおけるマルウェアやコンテンツ改ざんへの対策
4su_para
0
170
[FOSS4G 2024 Japan LT] LLMを使ってGISデータ解析を自動化したい!
nssv
1
210
障害対応指揮の意思決定と情報共有における価値観 / Waroom Meetup #2
arthur1
5
470
ドメイン名の終活について - JPAAWG 7th -
mikit
33
20k
Featured
See All Featured
Designing for humans not robots
tammielis
250
25k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
65k
Typedesign – Prime Four
hannesfritz
40
2.4k
Agile that works and the tools we love
rasmusluckow
327
21k
How to train your dragon (web standard)
notwaldorf
88
5.7k
Ruby is Unlike a Banana
tanoku
97
11k
Code Review Best Practice
trishagee
64
17k
Automating Front-end Workflow
addyosmani
1366
200k
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.3k
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.5k
Designing the Hi-DPI Web
ddemaree
280
34k
5 minutes of I Can Smell Your CMS
philhawksworth
202
19k
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༵