Book description
ドメイン駆動設計はエリック・エヴァンスにより提唱されたソフトウェア設計の手法です。対象とする事業活動(ドメイン)とその課題の観点から、より良いソフトウェアを構築するために関係者が協力する方法を提供します。本書は4部構成になっており、第Ⅰ部「設計の基本方針」では、ソフトウェアの設計方針を大きな視点から決めるための考え方とやり方を取り上げます。第Ⅱ部「実装方法の選択」ではソースコードに焦点を合わせ、業務ロジックをどう実装するかの選択肢を学びます。第Ⅲ部「ドメイン駆動設計の実践」では、ソフトウェア開発の現場にドメイン駆動設計を実践的に取り入れるための方法を紹介します。第Ⅳ部「他の方法論や設計技法との関係」では、ドメイン駆動設計とそれ以外の方法論や設計技法との関係を検討します。最新の技術トレンドを取り入れながら、ドメイン駆動設計の基本概念と実践方法をわかりやすく解説します。
Table of contents
- 表紙
- 訳者まえがき
- 推薦の言葉
- 序文
- この本について
- はじめに
- 目次
- 第Ⅰ部 設計の基本方針
- 1章 事業活動を分析する
- 1.1 事業領域(ビジネスドメイン)とは何か
- 1.2 業務領域(サブドメイン)とは何か
- 1.2.1 業務領域を分類する
- 1.2.2 業務領域を比較する
- 1.2.3 業務領域の境界を明確にする
- 1.3 事業分析の具体例
- 1.3.1 ライブチケット社
- 1.3.2 バス・オンデマンド社
- 1.4 業務エキスパート
- 1.5 まとめ
- 1.6 演習問題
- 2章 業務知識を発見する
- 2.1 事業の課題
- 2.2 知識の発見
- 2.3 意図の伝達
- 2.4 「同じ言葉」とは何か?
- 2.5 業務で使う言葉
- 2.5.1 同じ言葉の使い方
- 2.5.2 一貫性
- 2.6 事業活動のモデル
- 2.6.1 モデルとは何か
- 2.6.2 効果的なモデル
- 2.6.3 事業活動のモデルを作る
- 2.6.4 継続的に取り組む
- 2.6.5 道具の利用
- 2.6.6 困難に立ち向かう
- 2.7 まとめ
- 2.8 演習問題
- 3章 事業活動の複雑さに立ち向かう
- 3.1 異なるモデルの混在
- 3.2 区切られた文脈とは何か
- 3.2.1 文脈の境界
- 3.2.2 同じ言葉の定義(改良版)
- 3.2.3 区切られた文脈の大きさをどうするか
- 3.3 区切られた文脈と業務領域の関係
- 3.3.1 業務領域
- 3.3.2 区切られた文脈
- 3.3.3 業務領域と区切られた文脈の対応
- 3.4 文脈の境界
- 3.4.1 物理的な境界
- 3.4.2 所有権の境界
- 3.5 現実世界の区切られた文脈
- 3.5.1 言葉の意味論
- 3.5.2 科学
- 3.5.3 冷蔵庫を買った時の話
- 3.6 まとめ
- 3.7 演習問題
- 4章 区切られた文脈どうしの連係
- 4.1 緊密な協力
- 4.1.1 良きパートナー
- 4.1.2 モデルの共有
- 4.2 利用者と供給者の関係
- 4.2.1 従属する関係
- 4.2.2 モデル変換装置
- 4.2.3 共用サービス
- 4.3 互いに独立
- 4.3.1 意思疎通の問題
- 4.3.2 一般的な業務領域
- 4.3.3 モデルの違い
- 4.4 文脈の地図
- 4.4.1 最新の状態を維持する
- 4.4.2 限界
- 4.5 まとめ
- 4.6 演習問題
- 第Ⅱ部 実装方法の選択
- 5章 単純な業務ロジックを実装する
- 5.1 トランザクションスクリプト
- 5.1.1 実装方法
- 5.1.2 それほど単純な話ではない
- 5.1.3 トランザクションスクリプトをいつ使うか
- 5.2 アクティブレコード
- 5.2.1 実装方法
- 5.2.2 アクティブレコードをいつ使うか
- 5.3 現実的に考える
- 5.4 まとめ
- 5.5 演習問題
- 6章 複雑な業務ロジックに立ち向かう
- 6.1 歴史
- 6.2 ドメインモデル
- 6.2.1 実装方法
- 6.2.2 ドメインモデルの部品
- 6.2.3 複雑さの扱い方
- 6.3 まとめ
- 6.4 演習問題
- 7章 時間軸でモデルを作る
- 7.1 イベントソーシング
- 7.1.1 検索
- 7.1.2 分析
- 7.1.3 真実を語る唯一の情報源
- 7.1.4 イベントストア
- 7.2 イベント履歴式ドメインモデル
- 7.2.1 利点
- 7.2.2 欠点
- 7.3 よくある質問
- 7.3.1 性能
- 7.3.2 データの削除
- 7.3.3 他のやり方ではだめですか?
- 7.4 まとめ
- 7.5 演習問題
- 8章 技術方式
- 8.1 業務ロジックと技術方式
- 8.2 レイヤードアーキテクチャ
- 8.2.1 プレゼンテーション層
- 8.2.2 業務ロジック層
- 8.2.3 データアクセス層
- 8.2.4 レイヤー間の通信
- 8.2.5 レイヤードアーキテクチャの派生型
- 8.2.6 レイヤードアーキテクチャをいつ使うか
- 8.3 ポートとアダプター
- 8.3.1 概念の整理
- 8.3.2 依存関係逆転の原則
- 8.3.3 インフラストラクチャ層のコンポーネントとの連係
- 8.3.4 ポートとアダプターの同類
- 8.3.5 ポートとアダプターをいつ使うか
- 8.4 コマンド・クエリ責任分離
- 8.4.1 目的別のモデリング
- 8.4.2 実装
- 8.4.3 読み取りモデルの投影方法
- 8.4.4 課題
- 8.4.5 モデルの隔離
- 8.4.6 コマンド・クエリ責任分離をいつ使うか
- 8.5 スコープ
- 8.6 まとめ
- 8.7 演習問題
- 9章 通信
- 9.1 モデルの変換
- 9.1.1 状態なしのモデル変換
- 9.1.2 状態ありのモデル変換
- 9.2 集約どうしの連係
- 9.2.1 送信箱
- 9.2.2 サーガ
- 9.2.3 プロセスマネージャー
- 9.3 まとめ
- 9.4 演習問題
- 第Ⅲ部 ドメイン駆動設計の実践
- 10章 設計の経験則
- 10.1 経験則
- 10.2 区切られた文脈
- 10.3 業務ロジックの実装方法
- 10.4 技術方式の選択
- 10.5 テストの基本方針
- 10.5.1 ピラミッド形
- 10.5.2 ダイヤモンド形
- 10.5.3 逆ピラミッド形
- 10.6 実装方法の判定
- 10.7 まとめ
- 10.8 演習問題
- 11章 設計を進化させる
- 11.1 事業活動の変化
- 11.1.1 中核から一般へ
- 11.1.2 一般から中核へ
- 11.1.3 補完から一般へ
- 11.1.4 補完から中核へ
- 11.1.5 中核から補完へ
- 11.1.6 一般から補完へ
- 11.2 設計の基本方針を再検討する
- 11.3 業務ロジックの実装方法を見直す
- 11.3.1 トランザクションスクリプトからアクティブレコードへ
- 11.3.2 アクティブレコードからドメインモデルへ
- 11.3.3 ドメインモデルからイベント履歴式ドメインモデルへ
- 11.3.4 過去の状態変化を修復する
- 11.3.5 移行イベントとして表現する
- 11.4 組織の変更
- 11.4.1 良きパートナーから利用者と供給者の関係へ
- 11.4.2 利用者と供給者の関係から互いに独立へ
- 11.5 業務知識
- 11.6 システムの成長
- 11.6.1 業務領域
- 11.6.2 区切られた文脈
- 11.6.3 集約
- 11.7 まとめ
- 11.8 演習問題
- 12章 イベントストーミング
- 12.1 イベントストーミングとは何か
- 12.2 誰がイベントストーミングに参加するべきか
- 12.3 イベントストーミングに必要なもの
- 12.4 イベントストーミングのプロセス
- 12.4.1 ステップ1:発散的に探索する
- 12.4.2 ステップ2:時系列に並べる
- 12.4.3 ステップ3:問題点を洗い出す
- 12.4.4 ステップ4:転換イベントを見つける
- 12.4.5 ステップ5:コマンドを見つける
- 12.4.6 ステップ6:ポリシーを定義する
- 12.4.7 ステップ7:読み取りモデルを見つける
- 12.4.8 ステップ8:外部システムを追加する
- 12.4.9 ステップ9:集約を見つける
- 12.4.10 ステップ10:区切られた文脈に分割する
- 12.5 いろいろなやり方
- 12.6 イベントストーミングをいつ使うか
- 12.7 ファシリテーションのコツ
- 12.7.1 変化に注目する
- 12.7.2 リモートでのイベントストーミング
- 12.8 まとめ
- 12.9 演習問題
- 13章 現実世界のドメイン駆動設計
- 13.1 戦略的な分析
- 13.1.1 事業活動を理解する
- 13.1.2 既存システムの構造を調べる
- 13.2 設計改善の基本方針
- 13.2.1 基本方針の改善
- 13.2.2 実装方法の改善
- 13.2.3 同じ言葉を育てる
- 13.3 実践的なドメイン駆動設計
- 13.4 ドメイン駆動設計を売り込む
- 13.4.1 ドメイン駆動設計を非公式に取り入れる
- 13.5 まとめ
- 13.6 演習問題
- 第Ⅳ部 他の方法論や設計技法との関係
- 14章 マイクロサービス
- 14.1 サービスとは何か?
- 14.2 マイクロサービスとは何か?
- 14.2.1 「メソッド単位のサービス」が完璧なマイクロサービスか?
- 14.2.2 設計の目的
- 14.2.3 システムの複雑さ
- 14.2.4 マイクロサービスの深さ
- 14.2.5 深いモジュール
- 14.3 ドメイン駆動設計とマイクロサービスの境界
- 14.3.1 区切られた文脈
- 14.3.2 集約
- 14.3.3 業務領域
- 14.4 公開インターフェースを小さくする
- 14.4.1 共用サービス
- 14.4.2 モデル変換装置
- 14.5 まとめ
- 14.6 演習問題
- 15章 イベント駆動型アーキテクチャ
- 15.1 イベント駆動型アーキテクチャとは?
- 15.2 イベント
- 15.2.1 イベント、コマンド、メッセージ
- 15.2.2 データ構造
- 15.2.3 イベントのカテゴリー
- 15.3 イベント駆動型の連係を設計する
- 15.3.1 分散した大きな泥団子
- 15.3.2 時間的な結合
- 15.3.3 機能的な結合
- 15.3.4 実装の結合
- 15.3.5 イベント駆動型連係のリファクタリング
- 15.3.6 イベント駆動型で設計する経験則
- 15.4 まとめ
- 15.5 演習問題
- 16章 データメッシュ
- 16.1 分析系データモデルと業務系データモデル
- 16.1.1 事実テーブル
- 16.1.2 特性テーブル
- 16.1.3 分析系モデル
- 16.2 分析系データの管理基盤
- 16.2.1 データウェアハウス
- 16.2.2 データレイク
- 16.2.3 データウェアハウスとデータレイクの課題
- 16.3 データメッシュ
- 16.3.1 データを業務の視点で分割する
- 16.3.2 データをプロダクトと考える
- 16.3.3 自律性を高める
- 16.3.4 エコシステムを構築する
- 16.3.5 データメッシュとドメイン駆動設計を組み合わせる
- 16.4 まとめ
- 16.5 演習問題
- 結びの言葉
- 課題
- 解決方針
- 実現手段
- さらに学ぶために
- より進んだドメイン駆動設計
- アーキテクチャと連係方法
- 既存システムの改善
- イベントストーミング
- 最後に
- 付録A ドメイン駆動設計の実践:事例研究
- A.1 五つの区切られた文脈
- A.1.1 マーケットノバス社の事業活動
- A.1.2 区切られた文脈 その1:販売促進
- A.1.3 区切られた文脈 その2:顧客管理
- A.1.4 区切られた文脈 その3:イベント処理装置
- A.1.5 区切られた文脈 その4: 販売報奨金
- A.1.6 区切られた文脈 その5:マーケティングハブ
- A.2 ふりかえり
- A.2.1 同じ言葉
- A.2.2 業務領域
- A.2.3 区切られた文脈の境界
- A.3 まとめ
- 付録B 演習問題の回答
- 第1章
- 第2章
- 第3章
- 第4章
- 第5章
- 第6章
- 第7章
- 第8章
- 第9章
- 第10章
- 第11章
- 第12章
- 第13章
- 第14章
- 第15章
- 第16章
- 参考文献
- 著者紹介
- 奥付
Product information
- Title: ドメイン駆動設計をはじめよう ―ソフトウェアの実装と事業戦略を結びつける実践技法
- Author(s):
- Release date: July 2024
- Publisher(s): O'Reilly Japan, Inc.
- ISBN: 9784814400737
You might also like
book
プロダクトマネジメント ―ビルドトラップを避け顧客に価値を届ける
本書は、顧客に価値を届けるプロダクトを作り出すプロダクトマネジメントについて学ぶ本です。プロダクトマネジメントを理解することで、企業がビジネス目標を達成しながら、顧客の課題を解決する方法を解説します。はじめにプロダクトマネージャーの役割と責任を定義し、優れた意思決定を促す戦略の立て方を紹介します。実験と最適化によって作るべきプロダクトを決めるプロセスを解説し、最後にプロダクト主導の組織を支えるための文化や方針を紹介します。ビルドトラップを避け、顧客の課題にフォーカスするプロダクトマネジメントの原則を解説する本書は、規模の大小を問わずすべてのプロダクトチーム、マネージャー、プログラマ、アーキテクト、デザイナ、マーケターに必携の一冊です。
book
ハンズオンNode.js
Node.jsの入門書。対象読者は、フロントエンド開発の知識はあってもサーバサイド開発は知らないエンジニアや、他言語の経験はあってもNode.jsは触ったことがないプログラマー。本書ではターミナルのプロンプトにコマンドを入力してその反応を確認したり、簡単なスクリプトをNode.js環境で実行したりしながら、Node.jsプログラミングの基本からWebアプリケーションの開発、テスト、デプロイまでをハンズオン形式で学びます。また、コードの背景にある設計思想や、プログラムの挙動の仕組みについてもしっかり掘り下げます。本書のゴールは、読者がNode.jsの全体像を掴み、業務レベルでのアプリケーション開発に対応可能な知識を身につけることです。
book
プログラミングRust 第2版
次世代ブラウザ開発用にMozillaによって開発されたRustは、C/C++並みのパフォーマンスと低レベルの制御能力に加え、メモリとスレッドの安全性を担保し、さらに並行性にも優れるといった特徴を持つ、優秀な言語です。本書はMozillaで実際にRustを使ってFirefoxを開発している著者らによる、言語の概要と用途について解説する書籍で、Rustのほとんどの機能を詳細にカバーします。Rustのメジャーバージョンアップにより非同期処理が可能となったことに対応し、第2版では新たに非同期処理の章を設け、この機能を詳細に解説しています。Rust 2021対応。
book
PythonによるAIプログラミング入門 ―ディープラーニングを始める前に身につけておくべき15の基礎技術
近年ディープラーニングが爆発的人気となっています。しかし、人工知能の手法はディープラーニングに限りません。過去のAIブームの単純なニューラルネットや論理プログラミングもあれば、遺伝的アルゴリズム、自然言語処理、音声信号処理や、画像からの動物体検出、分類問題、回帰問題、連続データ解析、強化学習といった、古典的なデータ解析や機械学習の手法もあります。これらはディープラーニングを始める前に身につけておくべき基礎技術です。「鶏を割くに焉んぞ牛刀を用いん」の諺のように、読者がデータ収集や計算コストがかかるディープラーニングの他にも適材適所の手法を選択できるよう、本書ではさまざまな人工知能の関連分野を扱いながら、Pythonでよく使われるライブラリの基本的な使い方を解説します。