Upgrade to Pro — share decks privately, control downloads, hide ads and more …

DDD with RDRA, ICONIX

DDD with RDRA, ICONIX

DDDを具体的なプロセスに落とし込むにはどういう観点が必要だろうか。
- 境界づけられたコンテキストがどこまでの範囲かよくわからない
- ユビキタス言語やドメインモデルをどのように発見すればいいかわからない。どこから着手すればいいのか?
- ドメインモデルがただのデータの入れ物になってしまう(貧血症)
という問いに答えるには、RDRA, ICONIXを検討するとよいというテーマの資料です。

かとじゅん

May 14, 2017
Tweet

More Decks by かとじゅん

Other Decks in Programming

Transcript

  1. クネビンフレームワーク • Simple(単純) ◦ 因果関係はすべて明白。「知覚 - 分類 - 対応」アプローチ。ベストプラクティスの適 用

    • Complicated(煩雑) ◦ 因果関係の把握には分析もしくは何らか の調査、専門的知識が必要。「知覚 - 分析 - 対応」アプローチ。適切なプラクティスの 適用 • Complex(複雑) ◦ 因果関係の把握は振り返りによってのみ 可能であり、事前には不可能。「探査 - 知 覚 - 対応」アプローチ。プラクティスの出 現。 • Chaotic(カオス) ◦ システムレベルでの因果関係が存在しな い。「行動 - 知覚 - 対応」アプローチ。新た なプラクティスの発見。 ソフトウェア開発はこ ちらの傾向が強い 以降のスライドは、複雑な要件に対するアプローチです
  2. DDDを実践する際の課題 • 実際の開発プロセスに落とし込むにはどうした らよいかわからない。 ◦ 境界づけられたコンテキストがどこまでの範囲かよくわ からない ◦ ユビキタス言語やドメインモデルをどのように発見すれ ばいいかわからない。どこから着手すればいいのか?

    ◦ ドメインモデルがただのデータの入れ物になってしまう (貧血症) • 分析麻痺(完璧な分析→実装に進めない)では なく、十分に分析せずに実装するということに なってないでしょうか?(仮説)
  3. • リレーションシップ要件駆動分析(RDRA) • ユーケース駆動開発(ICONIX) • ユーザーストーリーマッピング(USM) • 組織パターン • マイクロサービス

    役に立つ開発手法を提唱している書籍 今日のスコープはここ。 すべてを取り上げることはできな いので、興味があれば本を読ん でみてください。
  4. RDRAの基本コンセプト • 網羅性 ◦ コンテキスト、システムの外部環境を捉え、システムが使われ る範囲を明らかする。そこからシステム要件を求めることで網 羅的に要件をまとめる。 • 整合性(今回紹介しないので興味があれば書籍を読んでください) ◦

    システムの外部環境からシステムの要件までを複数の視点 からモデルとして表現する。各モデルの情報を関係づけるこ とで、情報の整合性を保つ。 • 表現力 ◦ 様々な視点から対象を表現することで多様な要求を構造的 に表現する。それを図的な表現としてUMLを使って表現す る。それにより議論しながらドキュメントを作成する。
  5.  要件定義の基本的な考え方 • システム価値 ◦ システムと関係を持つ対象と そこからの要求を捉える • システム外部環境 ◦ システムを取り巻く外部環境

    を明らかにする • システム境界 ◦ システムの外部と内部の境 界線を明らかにし、システム の範囲を明確にする • システム ◦ システム内部の機能とデータ 構造を明らかにする システム (システムそ のもの) システム価値 (システムを使って生 み出す価値) システム外部環境 (システムを取り巻く環境 ) システム境界 (システムとの接点 ) 4つの価値は強い依存関係があり、 システムを語るには、これらの要素 は不可欠となる。
  6. コンテキストモデル • システムへの要求を発生させる 元となる利害関係者・外部シス テムを洗い出すためにコンテキ ストモデルを作成する。開発時 と運用時の両面で考える。図を 分けてもよい。 • このシステムに対して要望・要

    求を持つと考えられる、経営者 は間接的なつながりを示す。 • アクターはヒアリング対象。後の プロセスで、役割・責務を明確 にしていく。アクターの種類が多 い場合は汎化を検討する。
  7. 要求モデル • 各アクターが持っている、機能要 求・非機能要求を洗い出す • 要望→要求→要件 ◦ 要望: こうできたらいいなとい う思いつきレベル

    ◦ 要求: 検討対象として合意さ れているもの ◦ 要件: 開発対象として合意さ れているもの • 開発者は機能に関心が向かいが ち。機能の根源となる要求を整理 することは整合性の取れたシステ ムを作るために必要 • USMでいうところのバックボーン の洗い出し
  8. 概念モデル • 対象となる業務でどんな用語 や概念が使われているか整理 する。 • 合意形成するには、共通の概 念が欠如していては不可能。 同じ用語でも文脈が違えば、 目的が変わる可能性がありま

    す。中古車販売会社と自動車 修理工場では、「車」に対する とらえ方が変わるなど。議論 がかみ合わない場合は、まず 概念の整理が必要。 • ICONIXでも補強できる
  9. プロトコル/イベントモデル • 外部システムからのイベントや、外 部システムとのインターフェイスを洗 い出しルール化する。 • 外部システムとの連携は、人間が相 手ではないので、状態マシン図を使 用してモデル化できる。 •

    データのライフサイクルや条件に よって有効・無効になる機能がある 場合はこの手法で整理する。 • ここでいう状態とは外部システムと当 該システムの両方、相互作用を表し たものになる。
  10. ドメインモデル • システム化対象領域の概念(知 識)をソフトウェア構造にマッピン グし、その概念構造をシステム 上に再現することが目的 • システムに対する要求や変更 はビジネス上の概念から発生す るので、その概念がシステム上

    に存在することでシステムが理 解しやすくなる • 右図のようなドメインモデルには 最初から到達しない。ブレストの 中で違和感を排除しながら、合 意形成する必要がある。 • ICONIX, Eric本での補強をお 勧めする
  11. ICONIXとは RUP, XPなどのアジャイルソフ トウェア開発よりも前から存在 するソフトウェア開発方法論の 一つ。UMLのユースケース駆 動だが、RUPより軽量。以下の 4つのマイルストーンがある • 要求定義

    ◦ 要求レビュー • 分析/概念設計/テクニカル アーキテクチャ ◦ 予備設計レビュー • 設計/コーディング ◦ 詳細設計レビュー • テスト/要求の追跡 ◦ 配置
  12. 要求定義 • 要求レビューまでにやること • まず、ドメインモデルから洗い出す ◦ 多重度などは意識せず用語からド メインモデル候補を探索して図にす る。ただし不完全なものと仮定して いる

    • なぜユースケースが先ではないのか、 ユースケースはドメインモデルの用語を 使って記述されるべきだから。モデルの 静的な部分と動的な部分を結びつける ことができる。 • 要求が明らかになっていればこの手法 でよいが、不明瞭であればRDRAのシ ステム価値に基づき、利害関係者と外 部システムを洗い出し、要望を要求とし て蒸留した方がよいと考える。
  13. ドメインモデリング • 考えられる用語を列挙。ほとんどが同じ概念を指 す言葉として使われている。そのままシステム化 すると混乱のもと。用語を洗い出しながら排除する ◦ モデルとしてのユーザとユーザアカウントの 違いは?ユーザアカウントはエンティティだ が、ユーザはアクターです。 ◦

    グループリストとコミュニティリストは、同じも のなのでどちらかに決める。コミュニティリス トに決定 ◦ イベントの検索キーワードはUI要素。責務が 異なるのでそんなことはやめましょう。タグと 命名する。 • 用語リストから、最初のドメインモデル (静的)を作 る。 ◦ 集約(has-a), 汎化(is-a)のみの表現。属性・ 振る舞い、多重度はこの段階では早すぎる。 分析が終わってからにしましょう。 不完全と仮定し、分析麻痺 を回避する 用語リスト 初期のドメインモデルを作る
  14. ユースケースモデリング • ICONIXでは、ユースケースによって システムが駆動する。つまり、ユース ケースが設計駆動することを意識す る。実際には、全ユースケースに対 して、シーケンス図を起こすことにな る。 • ユースケースをドメインオブジェクト

    に紐付ける。ユースケース駆動のオ ブジェクト指向設計を実現する (RDRAの機能モデルと同様) • ドメインモデルの名前を使って、ユー スケース図を書く。 • 洗い出したユースケースの規模が大 きい場合グルーピングする。図をき れいにするコストは掛けてはならな い。ユースケースの依存関係も整理 していく。 アクター・ユースケース・ ドメインモデルつながり を網羅することが重要
  15. • 肝心なのはユースケースの内容=ユースケース記述 ◦ 「動詞+れる/られる」などの、指示的な記述をしてはならない。 ◦ 叙述(じょじゅつ)的な記述にすること。 • 指示的な記述 ◦ 「ユーザは、ユーザ名とパスワードを使った認証方式でログインできる」

    • 叙述的な記述 ◦ 「ユーザは ユーザ名とパスワードを入力して、「 ログイン」ボタン をクリッ クする。システムはユーザ名からユーザの情報を取り出し、パスワード をチェックする。そして、ユーザはシステムにログインする」 • 述べるのではなく示す ◦ 述べるだけだと、ソフトウェアの重要な振る舞いが隠されてしまう ◦ 述べるのではなく、ログインに含まれる手順を示すことが重要。 叙述的なユースケースを書く
  16. • 外側から内側の対話を意識する ◦ アクターとシステムの対話(外側から内側の対話)が示されていること。必要 に応じて、GUIモックアップを書く。 • ユースケース記述を、BCE(Boundary-Control-Entity)ステレオタイプで表現す る。 ◦ 名詞は、ドメインオブジェクトか、バウンダリオブジェクトになる。

    ◦ 動詞は、オブジェクト間のメッセージです。これは実装すべきソフトウェア機 能(コントロール)を示している。 システム境界とBCEステレオタイプ アクター システム アクション 応答 システム境界 エンティティ (ドメインオブジェクト ) バウンダリ コントロール (メッセージ) 名詞(オブジェクト) 動詞(処理) ロバストネス分析の前提となる
  17. • ユースケース ◦ イベントに参加する • 基本コース ◦ ユーザはイベントページへのリンクをクリックする。システムはイベントを 取得し、それを表示する。それから、ユーザは参加ボタンをクリックする。 システムは、そのイベントに参加者として登録する。

    • 代替コース ◦ 参加者枠がない場合:システムは、そのイベントに補欠者として登録す る。 ユースケース記述の例 • ユースケース記述を短く書く。ユースケースの外部は書かない。イベントの表 示に関することのみに集中する • ユースケースの範囲外の記述になりやすいため、事前条件と事後条件を排除 する。<<precedes>>関係でユースケースの順番を示す。 • ドメインモデルに直接ユースケースを結びつけるため、ユビキタス言語を使っ て表現すること
  18. • プロジェクトの用語(ユビキタス言語)で構成されたドメインオブジェクト を使って、ユースケースを記述する ◦ 曖昧な例 ▪ ユーザはイベントページへのリンクをクリックする。システムは イベントを取得し、それを表示する。それから、ユーザは参加 ボタンをクリックする。システムは、そのユーザが参加を希望 するイベントに参加予定のユーザとして登録する。

    • ユースケース記述にバウンダリの用語を使う ◦ 「システムは、ウェブページを表示する」では曖昧すぎる。「システ ムは、イベント一覧ページを表示する」とするべき。「システムは、 イベントカテゴリに基づくイベントリストを含むイベント一覧ページ を表示する」とするとさらに明確になる。 ユースケースにユビキタス言語を使う
  19. • 名詞 ー 動詞 ー 名詞 の形式でユースケース記述をパターン化する ◦ 結合ルール ▪

    名詞は動詞とつなぐことができる(逆もまた同様) ▪ 名詞を他の名詞につなぐことができない ▪ 動詞は他の動詞とつなぐことができる ロバストネス分析
  20. • ユースケース記述の精査が終わると詳細設計に移る。 • ユースケース記述で洗い出したした、アクターとBCEを中心とし たシーケンス図を作成する • 通常とは異なる記法を利用します。 ◦ シーケンス図上には、ユースケース記述に登場したコント ロールが存在しない(責務があれば存在してもよい)。代わり

    に、コントロールはエンティティなどのオブジェクトへのメッ セージに置き換えられます。 ◦ このシーケンス図ではオブジェクトの動的な側面を分析する ためであり、一般のシーケンス図のように手順の詳細を説 明するものではありません。このため、活性区間も扱いませ ん。 設計/コーディング
  21. エンティティに振る舞いを割り当てる • どのコントロールをエンティティに割り当てるべきかを 考える ◦ そのエンティティとは何か? ◦ その操作は、どのクラスの責務(アクション、情報保 持、判断)となるべきか? •

    オブジェクトデザインの格言 ◦ ”責務は、ユースケース中のシステムの振る舞いに 関する記述文やそこに暗示されているものから見 つかる” ◦ “責務は、ユースケースや他のシステム記述に内在 する抜けを埋めることでさらに見つかる”
  22. やかんをただの物体とみるか否か • 物理的なオブジェクトは、仕事を行うか、情報を保持するだけで 判断は行わない。電話帳オブジェクトは何も行わない。一方、 サーモスタットは判断を行い、制御信号を送信する。やかんも 容器の役割ぐらいしかない。しかし、分析によってどのような責 務を与えるかで変わってくる • Alexanderが考えるやかんの責務 ◦

    水をこぼしたり、しぶきをあげたりせずに中身を注ぐ ◦ 水を漏らすことがなく、沸騰するまで暖めることができる ◦ 水の沸騰を知らせる ◦ 安全な方法で運ぶための便利な手段を提供する これらの洞察によって、平凡な貧血症オブジェクトになるか、ドメイ ンリッチなオブジェクトになるかが決定づけられる
  23. BCEだけは十分に分析できない場合 • ロールステレオタイプ ◦ 情報保持役(Information Holder)は、情報を知り情報を提供する ◦ サービス提供役(Service Provider)は、仕事を行うが一般に演算サービスを提供する ◦

    構造役(Structrer)は、オブジェクト間の関係と、それらの関係についての情報を維持する ◦ インターフェイス役(Interfacer)は、システム内の異なる部分間で情報やリクエストを変換す る ◦ 調整役(Coordinator)は、他のオブジェクトにタスクを委譲することでイベントに対応する ◦ 制御役(Controller)は、判断を行い他のオブジェクトのアクションを指示する エンティティ、値オブジェクト 情報保持役、構造役 ビュー インターフェイス役 コントローラ 調整役、制御役 ドメインサービス サービス提供役 アプリケーションサービス 調整役、制御役 リポジトリ インターフェイス役 ファクトリ 調整役
  24. • RDRAでは、システム価値>システム外部環境>システム境界> システムの階層を使って、要件を捉えていくことに意味がある。 ◦ コンテキストモデル、要求モデル、利用シーンはICONIXにはな い考え方。境界づけられたコンテキストがどのようなものかを理 解する助けになる。 ◦ システム境界を跨がる際にプロトコルモデル/イベントモデルの 観点は、アーキテクチャ設計を支援する。

    • ICONIXでは、ユビキタス言語で構成されたユースケース駆動によ るオブジェクト指向設計を実現することに意味がある。 ◦ ドメインモデリングとユースケースモデリングはドメインモデルの 蒸留と実現するべきソフトウェア機能を具体的に洗い出す ◦ ロバストネス分析によって、静的なドメインモデルに動的な側面 を付け加えていくことができる。 RDRA, ICONIXの特徴
  25. 統合するためのヒント システム価値 システム 外部環境 システム 境界 システム ユースケースモデル 概念モデル ドメインモデル

    要求定義 分析/概念設計 /アーキテク チャ 設計 ドメインモデリング ユースケース モデリング (ユースケース記述含む ) ロバストネス分析 不完全と仮定 振り返る シーケンス図 利用シーン コンテキスト モデル 要求モデル 画面/帳票モデル プロトコル/ イベントモデル 必要最低限のものを選ぶ データモデル ”何をどのように”のギャップを埋める 機能モデル 振り返る 「探査 - 知覚 - 対応」のためのプロ セスと捉えると両者を統合すること ができる。つまり、振り返りこそが 重要。
  26. • すべてを適用すると開発プロセスが重くなるのは自明。何も考えず に網羅的に実践するのは現実的ではない。ただ、観点だけは抑え ておこう • 必要に応じて、プラクティスを選択することが重要 • ただし、重要なものを外さないこと。以下を基本の軸にしてみてはど うだろうか ◦

    コンテキストモデル (RDRA) ◦ 要求モデル (RDRA) ◦ ドメインモデリング (RDRA/ICONIX) ◦ ユースケースモデリング (RDRA/ICONIX) ◦ ロバストネス分析 (ICONIX) ◦ シーケンスモデル (ICONIX) • さらに簡単な部分ではなく、重要で複雑な部分から着手するとよい かもしれない。 まとめ 利害関係者と共に 動的な側面をフィードバック