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

ドメイン駆動で設計する、機能的凝集されたフロントエンドコンポーネント

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for IkedaNoritaka IkedaNoritaka
August 19, 2026
40

 ドメイン駆動で設計する、機能的凝集されたフロントエンドコンポーネント

Avatar for IkedaNoritaka

IkedaNoritaka

August 19, 2026

More Decks by IkedaNoritaka

Transcript

  1. はじめに 今日話すこと 複数ロール、類似の機能を多く含む複雑なシステムの設計に、機能的凝集で立ち向かおう - 競合優位性を生む事業領域は、システムが複雑になる フラグによる条件付きレンダリングを減らすことで、論理的凝集を回避する 意味的に違う塊は別コンポーネントにする 共通化できる塊は思っているより少ない 機能的凝集を行うことで、チームのベロシティ、プロダクト品質が向上した -

    他のメンバーが書いたコード、自分が過去に書いたコードを読みやすい 機能中心的に考える際、 APIのスキーマの構造、デザイン、要件を総合的にすり合わせて、各所へ フィードバックできる。プロダクトが本来目指すべき姿になっていく ドメイン駆動で設計する、機能的凝集されたフロントエンドコンポーネント 6
  2. はじめに 競合優位性を生む事業領域は、システムが複雑になる - 中核の事業領域 - 競合他社との違うを生み出す業務活動 - 売り上げを左右するような、ビジネスノウハウや知的財産・最適化された業務内容など。 - 複雑なことは必然

    - 複雑な課題に正面から取り組む企業が大きな事業価値を生み出す - できるだけ競争相手が簡単に真似できないようにする - 変更容易性が求められる - 競合他社が追いつけない理由として、企業は中核の業務領域を常に革新し、進化させる - ソフトウェア開発も、様々な実装を試し、改善し続ける双発的なものになる 参照: Vlad Khononov 著、増田亨・綿引琢磨 訳『ドメイン駆動設計をはじめよう ―ソフトウェアの実装と事業戦略を結びつける実践技法』オライリー・ジャパン、2024年 ドメイン駆動で設計する、機能的凝集されたフロントエンドコンポーネント 7
  3. はじめに コンポーネント分割の観点の例 ドメイン・要件的な観点 - ロールごとの分割 機能ごとの意味的な分割 関連するデータを集約するための分割 UI的な観点 - UIを構成する部品単位での分割

    UIライブラリのラッパーコンポーネント レイアウト的に再利用可能なコンポーネント その他の観点 - フォームプロバイダーなど、技術的に必要な分割 ドメイン駆動で設計する、機能的凝集されたフロントエンドコンポーネント 8
  4. はじめに 目次 - - 凝集度とは : - 機能的凝集と論理的凝集 - なぜ機能的凝集を目指すべきなのか

    実際のプロジェクトで出会った機能的凝集パターン : - Pattern1: ルーティングで分岐できる場合 - Pattern2: 分岐がコンポーネント内から排除出来ない場合 - Pattern3: 共通化したいなという気持ちが湧き出てきた場合 ドメイン駆動で設計する、機能的凝集されたフロントエンドコンポーネント 10
  5. 1. 凝集度とは なぜ論理的凝集を避けるのか 条件分岐 がコードの中に点在 コードが大きくなるにつれて、 条件分岐が増え、コードの複雑さが増していく 人間が書く文章 (要件定義書など )でも、

    細部に場合分けが多い文章は読みにくいはず 「似ているから共通化したい」「今は簡単な 分岐だけだ」と思ったとしても、将来的に さらに条件を追加したくなるような場合は多い ドメイン駆動で設計する、機能的凝集されたフロントエンドコンポーネント 18
  6. 1. 凝集度とは なぜ論理的凝集を避けるのか 条件分岐がコードの中に点在 🚩開発初期の判断(ありがちな思考) : 「購入者と出品者で商品詳細の UI、ほとんど同じだし、 ひとつの ProductDetailコンポーネントで共通化しよう」

    「今は価格と在庫の表示を切り替えるだけだし、 role === 'buyer'の条件で分ければ十分」 🧨 時間が経ってから発生する現実 : 「購入者のモバイルの画面ではレビューを非表示にして」 「出品者の画面ではドラフト状態の時だけ公開ボタン出して」 「在庫がない商品は購入者にも出品者にも警告を出す。 ただしアドミンには出さない」 「管理者用にも同じコンポーネント使って、 IDと出品者情報表示し て」 「購入者がログインしてないときは購入ボタンを押せなくして」 ドメイン駆動で設計する、機能的凝集されたフロントエンドコンポーネント 19
  7. 1. 凝集度とは なぜ機能的凝集を目指すのか ✨機能の修正や追加に耐えやすい - コードの修正が他の機能まで影響しにくい 今修正したい、関心があるコードのみを読むことができる 機能的凝集をしておけば、追加するコードも機能的凝集しやすくなる 🔧 要件とコードが一致しているか確認しやすい

    - 要件定義書は機能単位で書かれているはずなので対応づけて読みやすい 別の機能を開発しているメンバー、デザインエンジニアと意思疎通がとりやすい ドメイン駆動で設計する、機能的凝集されたフロントエンドコンポーネント 20
  8. 2. 実際のプロジェクトで出会った機能的凝集パターン 登壇者の参加したプロジェクト背景 DXを推進したい分野の複雑な業務ドメイン - - 複数ロール / 管理者ロール -

    ロールによって異なる業務フロー・状態遷移がある - ロール間で相互作用がある操作がある - ロールごとに異なる操作権限・閲覧権限がある 多岐にわたる業務フロー 前提 - フロントエンドチームは 5~7名程度 要件定義やデザイン、 APIスキーマは別チームが策定 React + Vite + GraphQL(型付きAPIスキーマ ) 参考のADR: https://tech.route06.co.jp/entry/2023/08/08/115253 具体的なドメインは公開できないため、以後、 ECドメインを参考にサンプルコードを提示します ドメイン駆動で設計する、機能的凝集されたフロントエンドコンポーネント 24
  9. 2. 実際のプロジェクトで出会った機能的凝集パターン 実際のプロジェクトで出会った、状況別、機能的凝集パターン - Pattern1: ルーティングで分岐できる場合 - Case1: 新規作成画面と編集画面 -

    Pattern2: 分岐がコンポーネント内から排除出来ない場合 - Pattern3: 共通化したいなという気持ちが湧き出てきた場合 ドメイン駆動で設計する、機能的凝集されたフロントエンドコンポーネント 26
  10. 2. 実際のプロジェクトで出会った機能的凝集パターン 実際のプロジェクトで出会った、状況別、機能的凝集パターン - Pattern1: ルーティングで分岐できる場合 - Pattern2: 分岐がコンポーネント内から排除出来ない場合 -

    - Case3: 通知機能 Pattern3: 共通化したいなという気持ちが湧き出てきた場合 ドメイン駆動で設計する、機能的凝集されたフロントエンドコンポーネント 31
  11. 2. 実際のプロジェクトで出会った機能的凝集パターン Pattern3: 共通化したいなという気持ちが芽生えた時 共通化したいなと思う、エンジニア的な嗅覚・直感 - コードを局所的に見て、「ここの実装似ているかも?」「過去に似た実装をした記憶がある」「共通化した 先の幸せな未来が見える」 機能的な関連性を正しく評価したい -

    要件、デザイン、 APIのスキーマの型からヒントを集め、総合的に判断する - 要件、デザイン、 APIのスキーマは、実装がない中、様々な仮定のなかで作成されているものなので、そ れらの辻褄をしっかり合わせる作業になる ドメイン駆動で設計する、機能的凝集されたフロントエンドコンポーネント 36
  12. Pattern3: 共通化したいなという気持ちが芽生えた時 そもそも分割するに値するか、以下の要素から判断する 分割したい箇所の実装量、実装の複雑さ - ループ処理、状態管理、条件分岐などが入ってくると分割する価値があるかもしれない 分割したい箇所が、 Figmaでグルーピングもしくはコンポーネント化されているか - 共通化したいからといって、意味的に一塊のものから無理に切り出していないか

    分割したい箇所が、 APIのスキーマのオブジェクト型の塊と一致しているか - オブジェクト型でまとまっているものは一つの意味の塊として見出しやすい チーム内の (形式的/暗黙的な )合意に従う - コード規約 - 実際のコードの分割粒度 ドメイン駆動で設計する、機能的凝集されたフロントエンドコンポーネント 37
  13. Pattern3: 共通化したいなという気持ちが芽生えた時 共通化できる時とはどんな時か (実装も、 Figma上も似通っている前提 ) 要件定義的にも同じと言えるか - 購入者視点の「購入履歴画面」と、管理者視点の「注文管理画面」だと、意味的に同じだと言いにくい -

    その中のに通った UIを共通化していいか十分に注意を払うべき APIのスキーマのオブジェクト型的に同じかどうか - Buyerオブジェクトの中の Userオブジェクトと、 SellerUserオブジェクトは同じだと言いにくい - 十分注意して共通化の判断をするか、 APIスキーマ側で Sellerオブジェクトの中の Userオブジェクトみたい な実装にできないか相談 ドメイン駆動で設計する、機能的凝集されたフロントエンドコンポーネント 38
  14. まとめ 今日話すこと 複数ロール、類似の機能を多く含む複雑なシステムの設計に、機能的凝集で立ち向かおう - 競合優位性を生む事業領域は、システムが複雑になる フラグによる条件付きレンダリングを減らすことで、論理的凝集を回避する 意味的に違う塊は別コンポーネントにする 共通化できる塊は思っているより少ない 機能的凝集を行うことで、チームのベロシティ、プロダクト品質が向上した -

    他のメンバーが書いたコード、自分が過去に書いたコードを読みやすい 機能中心的に考える際、 APIのスキーマの構造、デザイン、要件を総合的にすり合わせて、各所へ フィードバックできる。プロダクトが本来目指すべき姿になっていく ドメイン駆動で設計する、機能的凝集されたフロントエンドコンポーネント 40