Slide 1

Slide 1 text

DDD(ドメイン駆動設計) 体験ワークショップ PHPメンターズ 後藤 秀宣 / 久保 敦啓 1 PHPカンファレンス2013 2013.09.14 13೥9݄15೔೔༵೔

Slide 2

Slide 2 text

アジェンダ • 基礎編 • DDD基礎、実践方法 • ワークショップ • 要件の説明他 • モデリング他 • 実装への落とし込み(の説明) 2 13೥9݄15೔೔༵೔

Slide 3

Slide 3 text

3 PHP界隈でのDDD 13೥9݄15೔೔༵೔

Slide 4

Slide 4 text

実用段階 • 言語の成熟、フレームワークの成熟に より、実用段階に入った • DDDを素直に適用可能な技術フレーム ワークが隆盛 Symfony、zf2等 • 海外の大きなPHPカンファレンスでは DDD関連の講演が毎回複数ある 4 13೥9݄15೔೔༵೔

Slide 5

Slide 5 text

1 基礎編 5 13೥9݄15೔೔༵೔

Slide 6

Slide 6 text

6 前提 良いソフトウェア とは? 13೥9݄15೔೔༵೔

Slide 7

Slide 7 text

良くないものは? • メンテナンスしづらい • テストできない • コードが読みづらい 7 13೥9݄15೔೔༵೔

Slide 8

Slide 8 text

良くないものは? • メンテナンスしづらい • テストできない • コードが読みづらい 7 なぜ読みづらいのか 考えたことはありますか? 13೥9݄15೔೔༵೔

Slide 9

Slide 9 text

読みづらいコード • なぜ読みづらいのか? • 規約? • 長い? • 設計? 8 13೥9݄15೔೔༵೔

Slide 10

Slide 10 text

読みづらいコード 9 13೥9݄15೔೔༵೔

Slide 11

Slide 11 text

読みづらいコード 9 短い、規約にそっているが 読んでいて「えっ?」となる 13೥9݄15೔೔༵೔

Slide 12

Slide 12 text

良くないものは? • メンテナンスしづらい • テストできない • コードが読みづらい 10 13೥9݄15೔೔༵೔

Slide 13

Slide 13 text

良くないものは? • メンテナンスしづらい • テストできない • コードが読みづらい 10 プログラマのメンタルモデル とかけはなれている 13೥9݄15೔೔༵೔

Slide 14

Slide 14 text

良いソフトウェアとは? 11 Brian "DoctaBu" Moore 13೥9݄15೔೔༵೔

Slide 15

Slide 15 text

良いソフトウェアとは? 11 メンタルモデルとの乖離が ないソフトウェア Brian "DoctaBu" Moore 13೥9݄15೔೔༵೔

Slide 16

Slide 16 text

違和感に敏感になろう 12 メンタルモデルとの 乖離・相違に気づく モデルを忠実に 表現する 13೥9݄15೔೔༵೔

Slide 17

Slide 17 text

13 1-1 DDD基礎 13೥9݄15೔೔༵೔

Slide 18

Slide 18 text

何であって、何でないか • 実装のためのパターン • なんとかプロセス • OOPの高度な使い方 • 良いソフトウェアを開発するための 設計のガイドライン、フレームワーク • パターン集(パターンランゲージ) • 哲学 14 13೥9݄15೔೔༵೔

Slide 19

Slide 19 text

DDDまえがき 15 13೥9݄15೔೔༵೔

Slide 20

Slide 20 text

DDDまえがき • 明確に体系化されてはいないものの、オ ブジェクトコミュニティの底流として、 ある哲学が出現してきている。私はその 哲学を、ドメイン駆動設計と呼んでい る。 • 本書で提供するのは、設計上の意思決定 を行なうためのフレームワークと、ドメ イン駆動設計について議論するための技 術的な語彙である。 16 13೥9݄15೔೔༵೔

Slide 21

Slide 21 text

17 DDDを俯瞰する 13೥9݄15೔೔༵೔

Slide 22

Slide 22 text

18 13೥9݄15೔೔༵೔

Slide 23

Slide 23 text

19 13೥9݄15೔೔༵೔

Slide 24

Slide 24 text

最重要パターン • ユビキタス言語 • モデル駆動設計 20 13೥9݄15೔೔༵೔

Slide 25

Slide 25 text

21 13೥9݄15೔೔༵೔

Slide 26

Slide 26 text

22 モデリングとは? • DDD p2 モデルとは簡素化 どんなモデルも、現実の何らかの側面や興味 の対象となる概念を表している。モデルとは 簡素化である。つまり、当面の問題を解決す る上で関連する側面を抽象化し、それ以外の 詳細を無視することによって行われた、現実 に対する1つの解釈なのだ。 13೥9݄15೔೔༵೔

Slide 27

Slide 27 text

モデリングと設計の違い • モデリング=設計書作成の手がかり 23 厚紙をハサミでチョキチョキ切って、それをセロテープでペタペタ とはりあわせて、建物の見本を作っている場面。モデリングだ。 見本は見本でしかない。材質が違うし、窓も入口もないし、柱も床 もない。つまり、その見本だけでは本物の建物を作ることはできな い。作るのに必要な情報が不足しているからだ。設計書とは「これ だけの情報があれば作れる」という情報を持っている必要がある。 そしてモデリングはその設計書作成の手掛かりでしかない。 http://d.hatena.ne.jp/masayang/20070402/1175584867 13೥9݄15೔೔༵೔

Slide 28

Slide 28 text

24 モデル探索のうずまき 13೥9݄15೔೔༵೔

Slide 29

Slide 29 text

25 1-3 DDDの実践方法 13೥9݄15೔೔༵೔

Slide 30

Slide 30 text

実践方法 26 最重要パターンの意識 ユビキタス言語 モデル駆動設計 ドメイン辞書 ユビキタス言語 ユースケース起点 ドメインモデル ミニマムビルディングブロック 13೥9݄15೔೔༵೔

Slide 31

Slide 31 text

実践イメージ 27 ICONIXプロセス 13೥9݄15೔೔༵೔

Slide 32

Slide 32 text

実践イメージ 27 モデリング ICONIXプロセス 13೥9݄15೔೔༵೔

Slide 33

Slide 33 text

実践イメージ 27 モデリング 設計 ICONIXプロセス 13೥9݄15೔೔༵೔

Slide 34

Slide 34 text

28 実際にやってみよう 13೥9݄15೔೔༵೔

Slide 35

Slide 35 text

2 ワークショップ 29 13೥9݄15೔೔༵೔

Slide 36

Slide 36 text

流れ 30 • 要件の説明 • ドメイン辞書作成 • ドメインモデリング • ユースケース作成 • 実装について 13೥9݄15೔೔༵೔

Slide 37

Slide 37 text

31 2-1 要件 13೥9݄15೔೔༵೔

Slide 38

Slide 38 text

状況 • 山村書店という書店のシステム • 店舗販売とネットショップ併用 • 会員サービスがある • 会員は2段階あり、有料の優待会員にはポ イントによる値引きなど特典サービスがあ る • 優待会員へアップグレードは申請が必要 • IT部門はない 32 13೥9݄15೔೔༵೔

Slide 39

Slide 39 text

33 この企業へ訪問して 開発するシステムについて ヒアリング 13೥9݄15೔೔༵೔

Slide 40

Slide 40 text

ヒアリング(抜粋) 34 来年度から会員向けサービスに力を入れることになりまして、その一環として会員の プレミアム処理を効率化したいんです。それでこの部分のシステム化をお願いするこ とになりました。 プレメン申請の受け付けは店舗で行っているんですぅ。カウンターに置いてあるプレ メン申請用紙に記入してもらってぇ、それを受け取ったらパソで履歴なんかを調べ てぇ、OKそうだったら認証サインして、その用紙を本社へFAXしてるんですよぉ。 有償サービスになるので、クレジットカードの与信を本社側で確認することになりま す。カード会社の審査OKであれば会員システムに登録します。クレジットカード会 社単位でまとめて、その日の深夜にまとめて処理してもらいたいです。 ੨ࢁ͞Μ ੺஑͞Μ ଜాઐ຿ 13೥9݄15೔೔༵೔

Slide 41

Slide 41 text

ヒアリング(抜粋) 35 店舗スタッフが購買状況を確認してFAXする作業の手間とミスがあるので、基本的に は会員自らインターネットで申請できるようにしたいのです。ただ、店舗の端末もイ ンターネットにつながっていますので、店舗スタッフの業務も行えるようにしてほし いんです。 お客さんが会員番号忘れちゃったりしても突き返すわけにはいかないでしょぉ。お客 さんの名前や電話番号から会員を探すんだけどぉ、登録してある電話番号が変わっ ちゃってたり(笑) あと会員じゃない人がいきなりプレメンになりたいとか言われ ても困るんですけどぉ(怒) 今回は申請の受け付け業務のみですが、これを軸として今後10年で会員数を100 倍にするための足がかりとなる重要なシステムと位置づけています。 ੨ࢁ͞Μ ੺஑͞Μ ଜాઐ຿ 13೥9݄15೔೔༵೔

Slide 42

Slide 42 text

36 2-2 ドメイン辞書 13೥9݄15೔೔༵೔

Slide 43

Slide 43 text

ドメイン辞書 • ドメインの用語集 • ユビキタス言語 • 主語だけでなく述語にも気を配る • 現場の人がどういった言葉で話している のか • 業界標準の語彙を学ぶ • 時間をかけすぎない 37 13೥9݄15೔೔༵೔

Slide 44

Slide 44 text

ドメイン辞書 • 会員 • プレミアム会員 • プレミアム会員申請用紙 • 購買履歴 38 13೥9݄15೔೔༵೔

Slide 45

Slide 45 text

39 2-3 ドメインモデル 13೥9݄15೔೔༵೔

Slide 46

Slide 46 text

ドメインモデル • 最初から正解を求めすぎない • 短い時間のブレインストーミング等 • 記述の詳細にこだわりすぎない • 厳密なUML • 略式UML、付箋紙CRCではじめる 40 CRCカード 『オブジェクトデザイン』 白紙のCRC 『レガシーコード改善ガイド』17.2 (p.236) 13೥9݄15೔೔༵೔

Slide 47

Slide 47 text

DDD本の略式UML 41 オブジェクト名 13೥9݄15೔೔༵೔

Slide 48

Slide 48 text

付箋紙CRC 42 オブジェクト名 13೥9݄15೔೔༵೔

Slide 49

Slide 49 text

ビルディングブロック • エンティティ(識別する必要がある) • リポジトリ(エンティティの貯蔵庫) • サービス(上記以外、シナリオのような ものなど) 43 13೥9݄15೔೔༵೔

Slide 50

Slide 50 text

44 2-4 ユースケース 13೥9݄15೔೔༵೔

Slide 51

Slide 51 text

ユースケース • ドメインモデル/ユビキタス言語の検証 • 動的な側面 • いろいろな方法で試みる • 会話 • 白紙のCRC • シナリオ(ストーリー) 45 声に出してモデリングする 13೥9݄15೔೔༵೔

Slide 52

Slide 52 text

ユースケースのレイヤー • アプリケーションユースケース • ドメイン(ビジネス)ユースケース 46 ドメインユースケースだけでスタートする と俯瞰しづらい場合がある 13೥9݄15೔೔༵೔

Slide 53

Slide 53 text

ユースケース例 47 ユーザーがログインする システムはログイン画面を表示する。ユーザー はユーザー名とパスワードを入力して、「ログ イン」ボタンをクリックする。システムはユー ザー名からユーザーの情報を取り出し、パス ワードをチェックする。そして、ユーザーはシ ステムにログインする。 アプリケーションユースケース 13೥9݄15೔೔༵೔

Slide 54

Slide 54 text

ユースケース例 48 ユーザーがログインする ユーザー認証サービスがユーザー名とパスワー ドを受け取る。ユーザー名を元にユーザーリポ ジトリから該当するユーザーエンティティを取 り出す。ユーザーエンティティのパスワードの 検証に成功すれば認証成功とする。 ドメインユースケース サービスを起点とする 13೥9݄15೔೔༵೔

Slide 55

Slide 55 text

白紙のCRC 49 オブジェクト名 すら書かない 白紙のCRC 『レガシーコード改善ガイド』17.2 (p.236) 13೥9݄15೔೔༵೔

Slide 56

Slide 56 text

50 ユースケース ドメイン辞書 (ユビキタス言語) ドメインモデル 13೥9݄15೔೔༵೔

Slide 57

Slide 57 text

51 2-5 実装への落とし込み 13೥9݄15೔೔༵೔

Slide 58

Slide 58 text

実装への落とし込み • 適切なアーキテクチャをもった技術フレームワークであ れば、モデルを素直に実装に落とし込める • 指針 • サービスから始める • サービスは道具をDIで受け取って良い • ステートレスに • エンティティはPureに • リポジトリはORMと折り合いをつける • ORM依存をリポジトリに閉じ込める 52 13೥9݄15೔೔༵೔

Slide 59

Slide 59 text

ディレクトリ 53 13೥9݄15೔೔༵೔

Slide 60

Slide 60 text

PHPのメリットを活かす • Lazyである点 • パッケージのゆるさ • 実装の配置、インターフェイスなど の分離は、必要になる時まで遅らせ ることができる 54 13೥9݄15೔೔༵೔

Slide 61

Slide 61 text

55 まとめ 13೥9݄15೔೔༵೔

Slide 62

Slide 62 text

良いソフトウェアとは? 56 メンタルモデルとの乖離が ないソフトウェア Brian "DoctaBu" Moore 13೥9݄15೔೔༵೔

Slide 63

Slide 63 text

何であって、何でないか • 実装のためのパターン • なんとかプロセス • OOPの高度な使い方 • 設計のガイドライン、フレームワーク • パターン集(パターンランゲージ) • 哲学 57 13೥9݄15೔೔༵೔

Slide 64

Slide 64 text

58 13೥9݄15೔೔༵೔

Slide 65

Slide 65 text

今回の成果を 59 • ブログやtwitter、メールなどでご感想お 聞かせください • DDDは、現場ですぐにでも活かすべき 13೥9݄15೔೔༵೔

Slide 66

Slide 66 text

今回の成果を 59 • ブログやtwitter、メールなどでご感想お 聞かせください • DDDは、現場ですぐにでも活かすべき 良いエンジニアに なろう! 13೥9݄15೔೔༵೔

Slide 67

Slide 67 text

60 参考書籍 13೥9݄15೔೔༵೔

Slide 68

Slide 68 text

ドメイン駆動設計 61 • 基本的な考え方・取 り組み方から、実践 に適用可能なパター ンまで幅広く解説 13೥9݄15೔೔༵೔

Slide 69

Slide 69 text

ユースケース駆動開発実践ガイド 62 • ユースケースからオ ブジェクトの実装ま でをカバーする ICONIXプロセスの解 説・実践書 • トップ10形式など要 点をつかみやすい 13೥9݄15೔೔༵೔

Slide 70

Slide 70 text

実践プログラミングDSL 63 • DSLについての基礎 知識から実装までカ バー 13೥9݄15೔೔༵೔

Slide 71

Slide 71 text

アジャイルソフトウェア開発の奥義 64 • 実装部分について、 オブジェクト指向ク ラス設計の原則 (SOLID原則)、ク ラスの安定性等 13೥9݄15೔೔༵೔

Slide 72

Slide 72 text

ジェネレーティブプログラミング • DSL、AOP、インテン ショナルプログラミ ング、ドメイン工学 等包括的に扱う 65 13೥9݄15೔೔༵೔