#author("2020-09-09T04:15:44+00:00","default:sagasite","sagasite")
#author("2020-09-09T04:20:04+00:00","default:sagasite","sagasite")
[[Program]] > [[設計]] > [[ドメイン駆動設計]]

RIGHT:2020-09-07 (月) 公開
RIGHT:2020-09-09 (水) 更新

//----- ----- ----- ----- ----- ----- ----- -----
ドメイン駆動設計について学びましょう!
//----- ----- ----- ----- ----- ----- ----- -----

#contents

//===== ===== ===== ===== ===== ===== ===== ===== ===== =====
* ドメイン駆動設計入門 [#book]

#html{{
<table border="0" cellpadding="5"><tr><td valign="top"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/479815072X/vertex9-22/" target="_blank"><img src="https://images-fe.ssl-images-amazon.com/images/I/51E%2BhPktiQL._SL160_.jpg" border="0"></a></td><td> </td><td valign="top"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/479815072X/vertex9-22/" target="_blank">ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本</a><br>成瀬 允宣<br>翔泳社<br>2020-02-13<br>¥ 3,520</td></tr></table>
}}

//===== ===== ===== ===== ===== ===== ===== ===== ===== =====
* 目次 [#contents]

 はじめに
 謝辞
 本書の対象読者
 取り扱うC#特有の構文
 本書のサンプルの動作環境とサンプルプログラムについて

** Chapter 1 ドメイン駆動設計とは [#f8fc9734]

 1.1 ドメイン駆動設計とは何か
 1.2 ドメインの知識に焦点をあてた設計手法
  1.2.1 ドメインモデルとは何か
 1.2.2 知識をコードで表現するドメインオブジェクト
 1.3 本書解説事項と目指すゴール
  COLUMN|ドメイン駆動設計の実践を難しくするもの
 1.4 本書で解説するパターンについて
  1.4.1 知識を表現するパターン
  1.4.2 アプリケーションを実現するためのパターン
  1.4.3 知識を表現する、より発展的なパターン
  COLUMN|なぜいま、ドメイン駆動設計か

** Chapter 2 システム固有の値を表現する「値オブジェクト」 [#uaa5112c]

 2.1 値オブジェクトとは
 2.2 値の性質と値オブジェクトの実装
  2.2.1 不変である
  COLUMN|不変のメリット
  2.2.2 交換が可能である
  2.2.3 等価性によって比較される
 2.3 値オブジェクトにする基準
 2.4 ふるまいをもった値オブジェクト
  2.4.1 定義されないからこそわかること
 2.5 値オブジェクトを採用するモチベーション
  2.5.1 表現力を増す
  2.5.2 不正な値を存在させない
  2.5.3 誤った代入を防ぐ
  2.5.4 ロジックの散在を防ぐ
 2.6 まとめ

** Chapter 3 ライフサイクルのあるオブジェクト「エンティティ」 [#v2e7ff24]

 3.1 エンティティとは
 3.2 エンティティの性質について
  3.2.1 可変である
  COLUMN|セーフティネットとしての確認
  3.2.2 同じ属性であっても区別される
  3.2.3 同一性をもつ
 3.3 エンティティの判断基準としてのライフサイクルと連続性
 3.4 値オブジェクトとエンティティのどちらにもなりうるモデル
 3.5 ドメインオブジェクトを定義するメリット
  3.5.1 コードのドキュメント性が高まる
  3.5.2 ドメインにおける変更をコードに伝えやすくなる
 3.6 まとめ

** Chapter 4 不自然さを解決する「ドメインサービス」 [#s9a9ca84]

 4.1 サービスが指し示すもの
 4.2 ドメインサービスとは
  4.2.1 不自然なふるまいを確認する
  4.2.2 不自然さを解決するオブジェクト
 4.3 ドメインサービスの濫用が行き着く先
  4.3.1 可能な限りドメインサービスを避ける
 4.4 エンティティや値オブジェクトと共にユースケースを組み立てる
  4.4.1 ユーザエンティティの確認
  4.4.2 ユーザ作成処理の実装
  COLUMN|ドメインサービスの基準
 4.5 物流システムに見るドメインサービスの例
  4.5.1 物流拠点のふるまいとして定義する
  4.5.2 輸送ドメインサービスを定義する
  COLUMN|ドメインサービスの命名規則
 4.6 まとめ

** Chapter 5 データにまつわる処理を分離する「リポジトリ」 [#lc813d01]

 5.1 リポジトリとは
  COLUMN|リポジトリはドメインオブジェクトを際立たせる
 5.2 リポジトリの責務
 5.3 リポジトリのインターフェース
  COLUMN|nullの是非とOption型
 5.4 SQLを利用したリポジトリを作成する
 5.5 テストによる確認
  5.5.1 テストに必要な作業を確認する
  5.5.2 祈り信者のテスト理論
  5.5.3 祈りを捨てよう
 5.6 テスト用のリポジトリを作成する
 5.7 オブジェクトリレーショナルマッパーを用いたリポジトリを作成する
 5.8 リポジトリに定義されるふるまい
  5.8.1 永続化に関するふるまい
  5.8.2 再構築に関するふるまい
 5.9 まとめ

** Chapter 6 ユースケースを実現する「アプリケーションサービス」 [#k6c4554b]

 6.1 アプリケーションサービスとは
  COLUMN|アプリケーションサービスという名前
 6.2 ユースケースを組み立てる
  6.2.1 ドメインオブジェクトから準備する
  6.2.2 ユーザ登録処理を作成する
  6.2.3 ユーザ情報取得処理を作成する
  COLUMN|煩わしさを減らすために
  6.2.4 ユーザ情報更新を作成する
  COLUMN|エラーかそれとも例外か
  6.2.5 退会処理を作成する
 6.3 ドメインのルールの流出
 6.4 アプリケーションサービスと凝集度
  6.4.1 凝集度が低いアプリケーションサービス
 6.5 アプリケーションサービスのインターフェース
 6.6 サービスとは何か
  6.6.1 サービスは状態をもたない
 6.7 まとめ

** Chapter 7 柔軟性をもたらす依存関係のコントロール [#ec817567]

 7.1 技術要素への依存がもたらすもの
 7.2 依存とは
 7.3 依存関係逆転の原則とは
  7.3.1 抽象に依存せよ
  7.3.2 主導権を抽象に
 7.4 依存関係をコントロールする
  7.4.1 Service Locatorパターン
  7.4.2 IoC Containerパターン
 7.5 まとめ

** Chapter 8 ソフトウェアシステムを組み立てる [#ae092f2b]

 8.1 ソフトウェアに求められるユーザーインターフェース
  COLUMN|ソフトウェアとアプリケーションの使い分け
 8.2 コマンドラインインターフェースに組み込んでみよう
  COLUMN|シングルトンパターンと誤解
  8.2.1 メインの処理を実装する
 8.3 MVCフレームワークに組み込んでみよう
  8.3.1 依存関係を設定する
  8.3.2 コントローラを実装する
  COLUMN|コントローラの責務
 8.4 ユニットテストを書こう
  8.4.1 ユーザ登録処理のユニットテスト
 8.5 まとめ
  COLUMN|本当に稀な怪談話

** Chapter 9 複雑な生成処理を行う「ファクトリ」 [#z878e3da]

 9.1 ファクトリの目的
 9.2 採番処理をファクトリに実装した例の確認
  COLUMN|ファクトリの存在に気づかせる
  9.2.1 自動採番機能の活用
  9.2.2 リポジトリに採番用メソッドを用意する
 9.3 ファクトリとして機能するメソッド
 9.4 複雑な生成処理をカプセル化しよう
  COLUMN|ドメイン設計を完成させるために必要な要素
 9.5 まとめ

** Chapter 10 データの整合性を保つ [#o8383086]

 10.1 整合性とは
 10.2 致命的な不具合を確認する
 10.3 ユニークキー制約による防衛
  10.3.1 ユニークキー制約を重複確認の主体としたときの問題点
  10.3.2 ユニークキー制約との付き合い方
 10.4 トランザクションによる防衛
  10.4.1 トランザクションを取り扱うパターン
  10.4.2 トランザクションスコープを利用したパターン
  10.4.3 AOPを利用したパターン
  10.4.4 ユニットオブワークを利用したパターン
  COLUMN|結局どれを使うべきか
  10.4.5 トランザクションが引き起こすロックについて
 10.5 まとめ

** Chapter 11 アプリケーションを1から組み立てる [#b6e4de6f]

 11.1 アプリケーションを組み立てるフロー
 11.2 題材とする機能
  11.2.1 サークル機能の分析
 11.3 サークルの知識やルールをオブジェクトとして準備する
 11.4 ユースケースを組み立てる
  11.4.1 言語との齟齬が引き起こす事態
  11.4.2 漏れ出したルールがもたらすもの
 11.5 まとめ

** Chapter 12 ドメインのルールを守る「集約」 [#y256ec2b]

 12.1 集約とは
  12.1.1 集約の基本的構造
  COLUMN|集約を保持するコレクションを図に表すか
  12.1.2 オブジェクトの操作に関する基本的な原則
  12.1.3 内部データを隠蔽するために
  COLUMN|よりきめ細やかなアクセス修飾子(Scala)
 12.2 集約をどう区切るか
  12.2.1 IDによるコンポジション
  COLUMN|IDのゲッターに対する是非
 12.3 集約の大きさと操作の単位
  COLUMN|結果整合性
 12.4 言葉との齟齬を消す
 12.5 まとめ

** Chapter 13 複雑な条件を表現する「仕様」 [#d35c0db6]

 13.1 仕様とは
  13.1.1 複雑な評価処理を確認する
  13.1.2 「仕様」による解決
  13.1.3 リポジトリの使用を避ける
 13.2 仕様とリポジトリを組み合わせる
  13.2.1 お勧めサークルに見る複雑な検索処理
  13.2.2 仕様による解決法
  13.2.3 仕様とリポジトリが織りなすパフォーマンス問題
  13.2.4 複雑なクエリーは「リードモデル」で
  COLUMN|遅延実行による最適化
 13.3 まとめ

** Chapter 14 アーキテクチャ [#l0e56a31]

 14.1 アーキテクチャの役目
  14.1.1 アンチパターン:利口なUI
  14.1.2 ドメイン駆動設計がアーキテクチャに求めること
 14.2 アーキテクチャの解説
  14.2.1 レイヤードアーキテクチャとは
  14.2.2 ヘキサゴナルアーキテクチャとは
  14.2.3 クリーンアーキテクチャとは
 14.3 まとめ

** Chapter 15 ドメイン駆動設計のとびらを開こう [#rc789556]

 15.1 軽量DDDに陥らないために
  COLUMN|パターンの濫用とパターンを捨てるとき
 15.2 ドメインエキスパートとモデリングをする
  15.2.1 本当に解決すべきものを見つけよう
  15.2.2 ドメインとコードを結びつけるモデル
 15.3 ユビキタス言語
  15.3.1 深い洞察を得るために
  15.3.2 ユビキタス言語がコードの表現として使われる
  COLUMN|ユビキタス言語と日本語の問題
 15.4 境界付けられたコンテキスト
 15.5 コンテキストマップ
  15.5.1 テストがチームの架け橋に
 15.6 ボトムアップドメイン駆動設計
 15.7 まとめ

** Appendix ソリューション構成 [#f85e8692]

 A.1 ソフトウェア開発の最初の一歩
  COLUMN|C#特有のプロジェクト管理用語
  A.1.1 ドメインレイヤーのパッケージ構成
  A.1.2 アプリケーションレイヤーのパッケージ構成
  A.1.3 インフラストラクチャレイヤーのパッケージ構成
 A.2 ソリューション構成
  A.2.1 すべてを別のプロジェクトにする
  A.2.2 アプリケーションとドメインだけ同じプロジェクトにする
  A.2.3 言語機能が与える影響
 A.3 まとめ

参考文献
INDEX

//===== ===== ===== ===== ===== ===== ===== ===== ===== =====
* 出版社情報 [#publisher]

-ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本(成瀬 允宣)|翔泳社の本 
https://www.shoeisha.co.jp/book/detail/9784798150727

//===== ===== ===== ===== ===== ===== ===== ===== ===== =====
* 著者紹介 [#author]

-成瀬 允宣について:CodeZine(コードジン) 
https://codezine.jp/author/1879/

>成瀬 允宣(ナルセ マサノブ)
岐阜県出身。プログラマ。プログラミングにはじめて触れたのは25 歳のとき。
業務システム開発からキャリアをはじめ、ゲーム、Web と業種を変えながらも
アプリケーション開発全般に従事。好きな原則はDRY原則。趣味は車輪の再開発。

-nrsさん (@nrslib) / Twitter 
https://twitter.com/nrslib

-なるセミ - YouTube 
https://www.youtube.com/c/narusemi

-nrslib.com│Programming 
https://nrslib.com/



//===== ===== ===== ===== ===== ===== ===== ===== ===== =====
* 書評 [#review]

-これまで読んできたDDD書籍からおすすめを紹介する【ドメイン駆動設計】 | manichannel 
https://manichannel.com/ddd-books/

-ドメイン駆動設計を勉強するときのオススメ資料 - Qiita 
https://qiita.com/dora56/items/db8495fac3fbc6cd2569

//===== ===== ===== ===== ===== ===== ===== ===== ===== =====
//* 学習メモ [#memo]

//|頁+行|章節|項目|日付|h
//| [[書名_p_L]] | | | |



//----- ----- ----- ----- ----- ----- ----- -----
// A8 Ads - sakura VPS banner
~
#html{{
<center><a href="http://px.a8.net/svt/ejp?a8mat=1O73NW+3B2PRM+D8Y+BXB8X" target="_blank"><img border="0" width="468" height="60" alt="" src="http://www21.a8.net/svt/bgt?aid=101108300200&wid=001&eno=01&mid=s00000001717002003000&mc=1"></a><img border="0" width="1" height="1" src="http://www18.a8.net/0.gif?a8mat=1O73NW+3B2PRM+D8Y+BXB8X" alt=""></center>
}}
//----- ----- ----- ----- ----- ----- ----- -----

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