PHPカンファレンス2013 モデルとの向き合い方:ドメイン駆動設計体験ワークショップ スライド

Ba8ecb9f1d269e44056ff4e7dca4c5e0?s=47 hidenorigoto
September 14, 2013

PHPカンファレンス2013 モデルとの向き合い方:ドメイン駆動設計体験ワークショップ スライド

DDDについての基礎、DDDの俯瞰、実践方法
ワークショップ

Ba8ecb9f1d269e44056ff4e7dca4c5e0?s=128

hidenorigoto

September 14, 2013
Tweet

Transcript

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

    2013.09.14 13೥9݄15೔೔༵೔
  2. アジェンダ • 基礎編 • DDD基礎、実践方法 • ワークショップ • 要件の説明他 •

    モデリング他 • 実装への落とし込み(の説明) 2 13೥9݄15೔೔༵೔
  3. 3 PHP界隈でのDDD 13೥9݄15೔೔༵೔

  4. 実用段階 • 言語の成熟、フレームワークの成熟に より、実用段階に入った • DDDを素直に適用可能な技術フレーム ワークが隆盛 Symfony、zf2等 • 海外の大きなPHPカンファレンスでは

    DDD関連の講演が毎回複数ある 4 13೥9݄15೔೔༵೔
  5. 1 基礎編 5 13೥9݄15೔೔༵೔

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

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

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

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

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

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

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

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

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

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

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

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

  18. 何であって、何でないか • 実装のためのパターン • なんとかプロセス • OOPの高度な使い方 • 良いソフトウェアを開発するための 設計のガイドライン、フレームワーク

    • パターン集(パターンランゲージ) • 哲学 14 13೥9݄15೔೔༵೔
  19. DDDまえがき 15 13೥9݄15೔೔༵೔

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

    イン駆動設計について議論するための技 術的な語彙である。 16 13೥9݄15೔೔༵೔
  21. 17 DDDを俯瞰する 13೥9݄15೔೔༵೔

  22. 18 13೥9݄15೔೔༵೔

  23. 19 13೥9݄15೔೔༵೔

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

  25. 21 13೥9݄15೔೔༵೔

  26. 22 モデリングとは? • DDD p2 モデルとは簡素化 どんなモデルも、現実の何らかの側面や興味 の対象となる概念を表している。モデルとは 簡素化である。つまり、当面の問題を解決す る上で関連する側面を抽象化し、それ以外の

    詳細を無視することによって行われた、現実 に対する1つの解釈なのだ。 13೥9݄15೔೔༵೔
  27. モデリングと設計の違い • モデリング=設計書作成の手がかり 23 厚紙をハサミでチョキチョキ切って、それをセロテープでペタペタ とはりあわせて、建物の見本を作っている場面。モデリングだ。 見本は見本でしかない。材質が違うし、窓も入口もないし、柱も床 もない。つまり、その見本だけでは本物の建物を作ることはできな い。作るのに必要な情報が不足しているからだ。設計書とは「これ だけの情報があれば作れる」という情報を持っている必要がある。

    そしてモデリングはその設計書作成の手掛かりでしかない。 http://d.hatena.ne.jp/masayang/20070402/1175584867 13೥9݄15೔೔༵೔
  28. 24 モデル探索のうずまき 13೥9݄15೔೔༵೔

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

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

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

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

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

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

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

  36. 流れ 30 • 要件の説明 • ドメイン辞書作成 • ドメインモデリング • ユースケース作成

    • 実装について 13೥9݄15೔೔༵೔
  37. 31 2-1 要件 13೥9݄15೔೔༵೔

  38. 状況 • 山村書店という書店のシステム • 店舗販売とネットショップ併用 • 会員サービスがある • 会員は2段階あり、有料の優待会員にはポ イントによる値引きなど特典サービスがあ

    る • 優待会員へアップグレードは申請が必要 • IT部門はない 32 13೥9݄15೔೔༵೔
  39. 33 この企業へ訪問して 開発するシステムについて ヒアリング 13೥9݄15೔೔༵೔

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

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

    今回は申請の受け付け業務のみですが、これを軸として今後10年で会員数を100 倍にするための足がかりとなる重要なシステムと位置づけています。 ੨ࢁ͞Μ ੺஑͞Μ ଜాઐ຿ 13೥9݄15೔೔༵೔
  42. 36 2-2 ドメイン辞書 13೥9݄15೔೔༵೔

  43. ドメイン辞書 • ドメインの用語集 • ユビキタス言語 • 主語だけでなく述語にも気を配る • 現場の人がどういった言葉で話している のか

    • 業界標準の語彙を学ぶ • 時間をかけすぎない 37 13೥9݄15೔೔༵೔
  44. ドメイン辞書 • 会員 • プレミアム会員 • プレミアム会員申請用紙 • 購買履歴 38

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

  46. ドメインモデル • 最初から正解を求めすぎない • 短い時間のブレインストーミング等 • 記述の詳細にこだわりすぎない • 厳密なUML •

    略式UML、付箋紙CRCではじめる 40 CRCカード 『オブジェクトデザイン』 白紙のCRC 『レガシーコード改善ガイド』17.2 (p.236) 13೥9݄15೔೔༵೔
  47. DDD本の略式UML 41 オブジェクト名 13೥9݄15೔೔༵೔

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

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

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

  51. ユースケース • ドメインモデル/ユビキタス言語の検証 • 動的な側面 • いろいろな方法で試みる • 会話 •

    白紙のCRC • シナリオ(ストーリー) 45 声に出してモデリングする 13೥9݄15೔೔༵೔
  52. ユースケースのレイヤー • アプリケーションユースケース • ドメイン(ビジネス)ユースケース 46 ドメインユースケースだけでスタートする と俯瞰しづらい場合がある 13೥9݄15೔೔༵೔

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

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

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

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

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

  58. 実装への落とし込み • 適切なアーキテクチャをもった技術フレームワークであ れば、モデルを素直に実装に落とし込める • 指針 • サービスから始める • サービスは道具をDIで受け取って良い

    • ステートレスに • エンティティはPureに • リポジトリはORMと折り合いをつける • ORM依存をリポジトリに閉じ込める 52 13೥9݄15೔೔༵೔
  59. ディレクトリ 53 13೥9݄15೔೔༵೔

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

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

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

  63. 何であって、何でないか • 実装のためのパターン • なんとかプロセス • OOPの高度な使い方 • 設計のガイドライン、フレームワーク •

    パターン集(パターンランゲージ) • 哲学 57 13೥9݄15೔೔༵೔
  64. 58 13೥9݄15೔೔༵೔

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

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

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

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

  69. ユースケース駆動開発実践ガイド 62 • ユースケースからオ ブジェクトの実装ま でをカバーする ICONIXプロセスの解 説・実践書 • トップ10形式など要

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

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

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