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

Railsで考えるドメイン駆動設計のコアドメイン

 Railsで考えるドメイン駆動設計のコアドメイン

銀座Rails#26の登壇資料です
https://ginza-rails.connpass.com/event/189892/

MinoDriven

October 23, 2020
Tweet

More Decks by MinoDriven

Other Decks in Programming

Transcript

  1. アジェンダ • 自己紹介 • 本スピーチの目的 • ドメイン駆動設計の「ドメイン」とは • コアドメインとは •

    コアドメインの価値向上手法 • DDD実現手段とRailsへの応用、その考え方 • 巨大Railsレガシーの技術的負債にDDDで立ち向かった例 • DDD向き不向き • まとめ
  2. 自己紹介 • ミノ駆動(@MinoDriven) • リファクタリング大好き。 • クソコードを滅ぼす技術が大好き。 • たまに夢の中でもリファクタリング… •

    ㈱クラウドワークスではリファクタリングや設計が主任 務。 • 巨大Railsレガシーの技術的負債に対し、DDDベースに リファクタリング実践中。
  3. ドメイン(問題領域): RPGを楽しみたい 解決領域: ドラゴンクエスト 解決領域: ファイナルファンタジー メラ メラミ ファイア メラ

    ゾーマ ファイラ ファイガ ドメインモデル: ActiveRecordではない。 ドメインの課題を解決するモデルであり、物事の特定の側面を抽象化したもの。 ドメイン課題を効果的に解決するための 変換能力を備えた概念。変換能力がなければド メインモデルとは呼べない。
  4. 問題領域: RPGを楽しみたい 様々な戦い方、成長を 楽しみたい アイテムコンプ したい 魔法で 戦いたい 解決領域: ドラゴンクエスト

    武闘家 バイ キルト 小さな メダル 盗賊 賢者 ニフラム メド ローア ドメインには、さらに個々のドメイン(問題領域)がある。 各問題領域の解決に貢献するドメインモデルがいる。
  5. 問題領域: SNSを楽しみたい 情報収集 話題性 コンテンツ 健全性 解決領域: Twitter ブック マーク

    ミュート リツイート モーメント リスト ブロック 通報 Twitterの例 いいね フォロー
  6. 問題領域: SNSを楽しみたい 情報収集 話題性 コンテンツ 健全性 解決領域: Twitter ブック マーク

    ミュート リツイート モーメント リスト ブロック 通報 いいね フォロー 話題性に貢献する、他にはない 非常に特徴的なモデル おそらく コアドメイン
  7. 問題領域: フィットネスゲームを楽しみたい 飽きずに 続けたい 解決領域: リングフィットアドベンチャー リング君 フィット スキル ステージ

    ギミック プレイヤーの運動動作を モンスターへの攻撃に変換する 非常に画期的なモデル おそらくコアドメイン (開発者インタビューの内容より ) アドバイザであり、 心理的にサポートするメンター 道中の様々なギミックの正 体は、動的なフィットネスメ ニュー。
  8. ①ビジネス価値向上に関連する手法(一部抜粋) 手法 説明 ドメインエキスパート 問題領域に関して深い知識を持つメンバー。 ドメインビジョン声明文 コアドメインの価値を簡潔に説明した文書。 深いモデル コアドメインの本質的課題の解決に大きく貢献する、重要モデル。 暗黙的概念

    本質理解に重要だが、明示的に示されない隠れた概念。 ユビキタス言語 ビジネス概念を噛み砕き、ソフトウェアが解決したい本質的概念を理解する ための言語。 顧客のニーズに訴求し利益を増大するには、顧客課題の本質を理解し、 その本質的課題を解決するドメインモデルを発見・発明・改良しなければ ならない。 フィット スキル リツイート コアドメインと同様にドメインモデルの価値向上も DDDの議論であまり語られない!でも超重要!!
  9. ②開発生産性向上に関連する手法(一部抜粋) 手法 説明 ユビキタス言語 関係者全員の意思疎通の精度とコストパフォーマンス向上に貢献。 ドメイン層 UIやDBなど他の技術レイヤから隔離され、問題領域の課題解決に貢献す るピュアな層。コアドメインの構成要素を他から隔離する。 Repository 永続化ロジックをドメインロジックから隔離する設計パターン。

    ValueObject 値の振る舞いを表現する、 DDDで基本にして重要なパターン。 コアドメインを解決するロジックが低凝集密結合なクソコードになっていると、折角ビジネ スチャンスがあってもすぐに変更できず、市場要求に素早く対応できなくなる。また、コア ドメインに貢献する概念(ドメインモデル)に相当するロジックを発見したり、改良するの が困難になる(やりたいことはむしろコレ)。 だから以下各種設計手法を用い、コアドメインのロジックをクリーンな構造にして開発生 産性を向上させなければならない。
  10. View Controller ActiveRecord Domain ActiveRecord ActiveRecord :重要ビジネスロジック 重要ビジネスロジックをドメイン 層に凝集。他の関心事(例え ばUI制御やDB制御)から隔離

    する。 サービスの中心的価値を認識 しやすくなる。 関係し合う重要ロジックがドメ イン層内で整理されていること で高い開発生産性を出せる。 注文 予約 割引金額 クリスマス キャンペーン 特別会員価格