** まえがき [#tc660b7a]
 
 「PHPカンファレンス2013」に行ってきたので、久々にSandboxを書いてみますよ! by 竹村
 
 
 ** 概要 [#q205f6f6]
 
 2013年9月14日(土) PHPカンファレンス2013(以降、PHPカンファ) 
 http://phpcon.php.gr.jp/w/2013/
 場所:大田区産業プラザPiO
 
 10:45〜
 モデルとの向き合い方:ドメイン駆動設計体験ワークショップ -PHPメンターズ
 - [[公開スライド>https://speakerdeck.com/hidenorigoto/phpkanhuarensu2013-moderutofalsexiang-kihe-ifang-domeinqu-dong-she-ji-ti-yan-wakusiyotupu-suraido]]
 
 
 ** いきなりまとめ!w [#q6615472]
 
 - ドメイン駆動設計の本で「ユビキタス言語」「モデル駆動設計」の部分を読もうぜ!
 SIZE(25){[[エリック・エヴァンスのドメイン駆動設計>http://www.amazon.co.jp/dp/4798121967]]}
 [[&ref(DDDBook.jpg,nolink);>http://www.amazon.co.jp/dp/4798121967]]
 [[&ref(DDDBook_s.jpg,nolink);>http://www.amazon.co.jp/dp/4798121967]]
 
 
 - ただしこの本で扱うモデルがデカイらしいのでミニマルにして自分で考えてみよう
 
 - エンティティ・リポジトリ・サービスの 3つからモデリングをし始めよう(これもミニマルに)
 
 - 実装はSymfonyなどモデルを落とし込みやすいフレームワークを使おう
 -- また、実装で新たに用語が出てきたらモデルへフィードバックしよう
 
 
 ** 基礎 [#b09bf3e0]
 
 *** 前提:良いソフトウェアとは (P.6) [#q1a391a9]
 
 - メンテ、テスト、コードが読みやすい
 
 読みづらいコード (P.9のコード参照)
 - 規約、長い、設計悪い
 - 某WPなるメイン処理
 -- 処理関数が 7つくらいあるので一見シンプル!
 …でも、register_globals()とか一目見て何を処理するか分かるかというと分かりづらい
 →読んでて気持ち悪い
 
 ''なんとなくなイメージとメソッド記述にズレがある''
 …これが読んでて気持ち悪い
 
 - ズレ=メンタルモデル
 
 ''”メンタルモデルとの乖離がないソフトウェア=良いソフトウェア”''
 
 どうしたらいいの?
 
 - 業務に関わる複数の人がどう理解してるか
 →メンタルモデルの共通化的な感じかな?
 -- モデルを忠実に再現する
 -- メンタルモデルとの乖離・相違に気づく
 
 
 *** DDDってなんぞ? (P.14) [#z163dc87]
 
 DDD概要
 
 - 実装方法、プロセス、OOPのテクニックじゃないよ
 - 良いソフトウェアを作るための ''ガイドライン・フレームワーク'' だよ
 
 詳しくは、エリック・エヴァンスのドメイン駆動設計(以降、 ''DDD本'' )のまえがきを読んで。
 - 設計のフレームワークで、語彙として重要
 
 「DDD本」の見開き
 - 関連をたどるのに使えるね
 - 「''ユビキタス言語''」「''モデル駆動設計''」が各関連事項のベースになっているので分かる通り、この 2つが大変重要!
 
 #blikimore()
 
 
 ユビキタス言語
 - 業務で使われてる言葉と、実装の言葉を統一する
 
 モデル駆動設計
 - P.21の図を参照
 - 問題ドメインで発生した課題を解決ドメインの
 問題ドメインモデル」→「モデル駆動設計」→「解決ドメインモデル」と詳細に落としていって
 そこであたらに見つかった問題は「問題ドメインモデル」に戻す。
 また、これらのモデルは「ユビキタス言語」を元に構築する。
 
 
 モデリングとは?
 - DDD本のP.2〜を読むといい
 -- 設計書作成の手がかり=モデリング
 →ドメインモデルの設計 (でも初心者はいきなりドメインモデルに取り掛かると失敗することもある)
 
 
 モデル探索 (P.24参照)
  シナリオ -> モデル -> コード -> シナリオに戻る
     │         ↓        │
     └→  ドキュメント ←┘
 
 
 ** 実践方法 (P.26) [#c27b3d94]
 
 - ドメイン辞書 (ユビキタス言語)
 →用語集のようなもの
 
 - ドメインモデル (ミニマルビルディングブロック)  ''静的な構造''
 →DBにどう適用するのかを検討するのは後回しにして、要素の抽出とその関係をまとめる
 
 - ユースケース ''動的な構造''
 →フォームでどんな入力要素があるか等細かい部分は後回しにして、シナリオやフローを書いてみる
 
 ※↑この辺が「DDD本」には書いてないので分かりづらいのかも、とのこと。
 
 
 ** ワークショップ (P.29) [#wa27f68d]
 
 要件を出すので、ドメインモデルとユースケースを書いてみよう!
 
 
 *** 要件 (P.31) [#t40585b9]
 
 - P.32〜P.35をみて。
 
 以下は当日の私のメモ
  書店システム
  店舗とEC
  会員サービスがある。種類が有料・無料がある
  有料はポイントの値引き・特典サービス
  優待へのアップグレードは申請が必要
  
  プレミアム会員をやっている
  
  既存:
  店舗で申請している
  FAXで送信
  クレカのチェック
  
  要望:
  ネットからでも申請したい
  会員番号とかわすれたら名前・電話から探す
  FAXはやめる。ネット申請に寄せる
  クレカはASPを利用する? ←後から追記
 
 
 *** ドメイン辞書 (P.36) [#b67ecee4]
 
 - 名詞と動詞、ふるまい、業界用語をまとめる
 ※時間をかけすぎない!
 
 やってみる (※以下は当日の私のメモで正解とは限りません)
 
  - 会員 (会員情報)
  - プレミアム会員
  - プレミアム申請用紙
  - プレミアム処理
  - 新規会員登録処理
  - 電話番号等からのリマインド
  - 購買履歴
  - カード与信サービス
 
 *** ドメインモデル (P.39) [#x85649ab]
 
 関係性を見ていこう
 
 ※正解を求めすぎないで!
 ※記述の仕方もテキトーでやって!
 →まだモデリング段階デスカラ。
  モデル例:
  |公開| -----*|貨物|
 
 付箋紙CRCを使う手もある
 - [タケ]よくExcelで作ってるゎ
 
 
 ビルディングブロック
 
 - エンティティ (DBに入りそうなモノ)
 - リポジトリ (エンティティの集合)
 - サービス (シナリオのようなもの)
 
 に絞ってモデリングする
 ''”ミニマムビルディングブロック!”''
 - 初期ではだいたいコレで決められるはず!…とのこと。
 
 
 やってみる(※以下は当日の私のメモで正解とは限りません)
  * エンティティ (DBに入りそうなモノ)
  ** 1)会員
  ** 2)プレミアム会員
  ** 3)プレミアム会員申請
  
  * リポジトリ (エンティティの集合)
  ** a)会員情報
  ** b)購買履歴
  
  * サービス (シナリオのようなもの)
  ** A)プレミアム処理
  ** B)電話番号等からのリマインド
  ** C)カード与信サービス
  ** D)新規会員登録処理
  
  ドメインモデル
  A) --- 1) --- 2)
  A) --- 3)
  
  B) --- a)
  B) --- b)
  
  ※C)は検討できてない
  
  D) --- 1)
  D) --- B)
 
 
 *** ユースケース (P.44) [#ua5a9de3]
 
 ドメインモデル・ユビキタス言語の検証(動的な構造)
 
 - アプリケーション
 -- 具体的な行動のシナリオ
 
 - ドメイン(ビジネスの課題)
 -- 「サービスが情報を受け取ってAしてBする」程度の抽象的に書く
 -- (利用者という意味での)アクターについては考えない
 →あくまでサービスを起点としてシナリオを書いてみる
 
 
 やってみる(※以下は当日の私のメモで正解とは限りません)
  1) ---> 3)を使って ---> A) (true) ---> 2) ←基本コース
                             (false)---> B)を使って ---> A) ←代替コース
                                        ↑
                                         a)とb)から1)を割り出す
                             (false and B経由) ---> D)
  C)の要件聞き忘れたorz
  D)ってのをあとから気づいて追加したよ。ユビキタス言語にも追加した
  
  追記:「サービス起点」と言っているのに 1)会員 がアクターで書いてるなーorz A)プレミアム処理 からのを書くべきらしい
  まぁ、初心者はコレでもいいんじゃないかな^^;;
 
 
 *** 実装へ落とし込む (P.51) [#a8259107]
 
 技術フレームワーク(Symfonyとか使うとイイ)に、モデルを落としこむ
 
 - 指針
 -- サービスから始める
 --- データはDIで受け取ってつかう
 -- エンティティはなるべくPureに(例外もあるだろけど)
 -- リポジトリはORMと折り合いを付ける(これも例外はあるだろう)
 
 Symfonyに適用したディレクトリの例がP.53に書いてあるので参考に。
 
 
 DDDとPHPのメリット
 - Javaはパッケージ制限があってレイヤー毎に分けるとかめんどい
 →PHPはその辺ゆるいので楽なのはメリット
 
 
 ** まとめ (P.55) [#d7412e72]
 
 ドメイン駆動設計の本を読もうぜ!
 - 例の2つが重要なので。
 
 フレームワークへ落とす実装などは PHPメンターズさんのブログ参照とのこと。
 PHPメンターズ: http://phpmentors.jp/
 
 #blikifooter(竹村)
 ----
 tag:[[ドメイン駆動設計>tag/ドメイン駆動設計]], [[DDD>tag/DDD]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

アークウェブのサービスやソリューションはこちら