Slide 1

Slide 1 text

Masanobu Naruse BOTTOM UP DOMAIN DRIVEN DESIGN

Slide 2

Slide 2 text

もくじ • はじめに • 値オブジェクト • エンティティ • ドメインサービス • リポジトリ • アプリケーションサービス • ファクトリ • トランザクション • 集約 • アーキテクチャ • ドメイン駆動設計への誘い 2

Slide 3

Slide 3 text

はじめに 3 読んだ方はいらっしゃいますか

Slide 4

Slide 4 text

はじめに 4 読み切った方はいらっしゃいますか

Slide 5

Slide 5 text

はじめに 5 理解した方はいらっしゃいますか

Slide 6

Slide 6 text

はじめに | 辛さの原因 6 辛さの原因は?

Slide 7

Slide 7 text

はじめに | 辛さの原因 7 ユビキタス言語

Slide 8

Slide 8 text

はじめに | 辛さの原因 8 ユビキタス言語 ドメインエキスパート

Slide 9

Slide 9 text

はじめに | 辛さの原因 9 ユビキタス言語 ドメインエキスパート エンティティ

Slide 10

Slide 10 text

はじめに | 辛さの原因 10 ユビキタス言語 ドメインエキスパート エンティティ 値オブジェクト

Slide 11

Slide 11 text

はじめに | 辛さの原因 11 ユビキタス言語 ドメインエキスパート エンティティ 値オブジェクト ドメインサービス

Slide 12

Slide 12 text

はじめに | 辛さの原因 12 ユビキタス言語 ドメインエキスパート エンティティ 値オブジェクト ドメインサービス アプリケーションサービス

Slide 13

Slide 13 text

はじめに | 辛さの原因 13 ユビキタス言語 ドメインエキスパート エンティティ 値オブジェクト リポジトリ ファクトリ ドメインサービス アプリケーションサービス 集約

Slide 14

Slide 14 text

集約 はじめに | 辛さの原因 14 ユビキタス言語 ドメインエキスパート エンティティ 値オブジェクト ドメインサービス アプリケーションサービス リポジトリ ファクトリ 怖い

Slide 15

Slide 15 text

はじめに | 辛さの原因 15 ドメイン駆動設計 ?

Slide 16

Slide 16 text

はじめに | 辛さの原因 16 ドメイン駆動設計 オブジェクト指向の実践

Slide 17

Slide 17 text

はじめに | 辛さの原因 17 敬遠されるのは勿体ない ドメイン駆動設計 オブジェクト指向の実践

Slide 18

Slide 18 text

はじめに | 辛さの原因 18 怖い ? = 辛さの原因 = ? こと だらけ

Slide 19

Slide 19 text

はじめに | 辛さの原因 19 怖い 知らない = 辛さの原因 = 知らないこと だらけ

Slide 20

Slide 20 text

はじめに | 用語 20 用語

Slide 21

Slide 21 text

はじめに | 用語 21 用語

Slide 22

Slide 22 text

はじめに | 用語 22 マインド パターン 用語

Slide 23

Slide 23 text

はじめに | 用語 23 マインド パターン 感じるしかない 用語

Slide 24

Slide 24 text

はじめに | 用語 24 マインド パターン 感じるしかない 実装できる 用語

Slide 25

Slide 25 text

はじめに | 用語 25 用語と実装がイメージできれば 辛さは半分になるのでは?

Slide 26

Slide 26 text

はじめに | 用語 26 いきなり全容を説明しても 辛いから ボトムアップに解説したら 役に立ちそう

Slide 27

Slide 27 text

はじめに | 用語 27 いきなり全容を説明しても 辛いから ボトムアップに解説したら 役に立ちそう と考えて早一年 書籍化依頼こないかなー・・・ とか漠然と思ってました

Slide 28

Slide 28 text

はじめに | 記事 ボトムアップドメイン駆動設計 28 https://nrslib.com/bottomup-ddd/ https://nrslib.com/bottomup-ddd-2/ というわけで解説記事にしてみた

Slide 29

Slide 29 text

はじめに | 記事 ボトムアップドメイン駆動設計 29 https://nrslib.com/bottomup-ddd/ https://nrslib.com/bottomup-ddd-2/ というわけで解説記事にしてみた そもそもこの解説記事が辛い

Slide 30

Slide 30 text

はじめに | 記事 ボトムアップドメイン駆動設計 30 https://nrslib.com/bottomup-ddd/ https://nrslib.com/bottomup-ddd-2/ というわけで解説記事にしてみた そもそもこの解説記事が辛い

Slide 31

Slide 31 text

はじめに | 趣旨 31 今回のセミナーの趣旨

Slide 32

Slide 32 text

はじめに | 趣旨 32 イントロダクションはセミナーで 今回のセミナーの趣旨

Slide 33

Slide 33 text

はじめに | 趣旨 33 イントロダクションはセミナーで 細かい部分は記事で 今回のセミナーの趣旨

Slide 34

Slide 34 text

はじめに | 趣旨 34 イントロダクションはセミナーで 細かい部分は記事で マインドは書籍で 今回のセミナーの趣旨

Slide 35

Slide 35 text

はじめに | ゴール 35 ゴール Evans の本を読む下地を作る

Slide 36

Slide 36 text

値オブジェクト VALUE OBJECT

Slide 37

Slide 37 text

値オブジェクト 37 値って何ですか

Slide 38

Slide 38 text

値オブジェクト 38 例えば数値

Slide 39

Slide 39 text

値オブジェクト 39

Slide 40

Slide 40 text

値オブジェクト 40 ここは何していますか

Slide 41

Slide 41 text

値オブジェクト 41 例えば文字列

Slide 42

Slide 42 text

値オブジェクト 42

Slide 43

Slide 43 text

値オブジェクト 43 ここは何していますか

Slide 44

Slide 44 text

値オブジェクト 44 値の変更は代入

Slide 45

Slide 45 text

値オブジェクト 45 値の変更は代入 こんなことはしない

Slide 46

Slide 46 text

値オブジェクト 46 じゃあ 値を示すオブジェクトも 値らしくしよう

Slide 47

Slide 47 text

値オブジェクト 47 じゃあ 値を示すオブジェクトも 値らしくしよう 値オブジェクト

Slide 48

Slide 48 text

値オブジェクト | 値の性質 48 状態を不変に保つ 値同士の比較ができる 完全に交換可能である 値の性質

Slide 49

Slide 49 text

値オブジェクト | 状態を不変に保つ 49 状態を不変に保つ 値同士の比較ができる 完全に交換可能である 値の性質

Slide 50

Slide 50 text

値オブジェクト | 状態を不変に保つ 50 状態とは?

Slide 51

Slide 51 text

値オブジェクト | 状態を不変に保つ 51 状態 フィールド =

Slide 52

Slide 52 text

値オブジェクト | 状態を不変に保つ 52

Slide 53

Slide 53 text

値オブジェクト | 状態を不変に保つ 53 これらがダメなら

Slide 54

Slide 54 text

値オブジェクト | 状態を不変に保つ 54 これらがダメなら

Slide 55

Slide 55 text

値オブジェクト | 状態を不変に保つ 55 これもダメ これらがダメなら

Slide 56

Slide 56 text

値オブジェクト | 状態を不変に保つ 56

Slide 57

Slide 57 text

値オブジェクト | 状態を不変に保つ 57 値の変更は代入で

Slide 58

Slide 58 text

値オブジェクト | 状態を不変に保つ 58 値の変更は代入で

Slide 59

Slide 59 text

値オブジェクト | 状態を不変に保つ 59 メリット 不変であることそれ自体 ・可変な状態は取り扱いが難しい ・並行/並列処理では特に難しい ・キャッシュ可能 etc…

Slide 60

Slide 60 text

値オブジェクト | 値同士の比較ができる 60 値の性質 状態を不変に保つ 値同士の比較ができる 完全に交換可能である

Slide 61

Slide 61 text

値オブジェクト | 値同士の比較ができる 61 値の比較の仕方は?

Slide 62

Slide 62 text

値オブジェクト | 値同士の比較ができる 62 値の比較の仕方は?

Slide 63

Slide 63 text

値オブジェクト | 値同士の比較ができる 63 値の比較の仕方は? こうは書かない

Slide 64

Slide 64 text

値オブジェクト | 値同士の比較ができる 64 じゃあ値オブジェクトも こう書かない

Slide 65

Slide 65 text

値オブジェクト | 値同士の比較ができる 65 値のように表現すべき

Slide 66

Slide 66 text

値オブジェクト | 値同士の比較ができる 66 比較のための実装

Slide 67

Slide 67 text

値オブジェクト | 値同士の比較ができる 67 比較のための実装

Slide 68

Slide 68 text

値オブジェクト | 値同士の比較ができる 68 Snipet や Resharper などの Tool で生成 比較のための実装

Slide 69

Slide 69 text

値オブジェクト | 値同士の比較ができる 69 メリット 値の変更箇所の集約

Slide 70

Slide 70 text

値オブジェクト | 値同士の比較ができる 70 変更してみよう 属性比較版 比較メソッド版

Slide 71

Slide 71 text

値オブジェクト | 値同士の比較ができる 71 値に属性を追加 変更してみよう 属性比較版 比較メソッド版

Slide 72

Slide 72 text

値オブジェクト | 値同士の比較ができる 72 値に属性を追加 変更してみよう 属性比較版 比較メソッド版

Slide 73

Slide 73 text

値オブジェクト | 値同士の比較ができる 73 値に属性を追加 変更してみよう 属性比較版 比較メソッド版

Slide 74

Slide 74 text

値オブジェクト | 値同士の比較ができる 74 比較する必要ができたら追加でいい

Slide 75

Slide 75 text

値オブジェクト | 値同士の比較ができる 75 状態を不変に保つ 値同士の比較ができる 完全に交換可能である 値の性質

Slide 76

Slide 76 text

値オブジェクト | 完全に交換可能である 76 復習

Slide 77

Slide 77 text

値オブジェクト | 完全に交換可能である 77 Q. 値の変更を行う方法は? 復習

Slide 78

Slide 78 text

値オブジェクト | 完全に交換可能である 78 Q. 値の変更を行う方法は? 復習 A. 代入

Slide 79

Slide 79 text

値オブジェクト | 完全に交換可能である 79 代入って要するに 交換

Slide 80

Slide 80 text

値オブジェクト | 完全に交換可能である 80 代入って要するに 交換 値を不変にしたことで 交換以外の 変更の表現手段がなくなった

Slide 81

Slide 81 text

値オブジェクト | モチベーション 81 値オブジェクトにするモチベーションは?

Slide 82

Slide 82 text

値オブジェクト | モチベーション 82 表現力が増す 存在しない値を存在させない 誤った代入を防ぐ 値オブジェクトのモチベーション

Slide 83

Slide 83 text

値オブジェクト | 表現力が増す 83 表現力が増す 存在しない値を存在させない 誤った代入を防ぐ 値オブジェクトのモチベーション

Slide 84

Slide 84 text

値オブジェクト | 表現力が増す 84 表現力が増します

Slide 85

Slide 85 text

値オブジェクト | 存在しない値を存在させない 85 表現力が増す 存在しない値を存在させない 誤った代入を防ぐ 値オブジェクトのモチベーション

Slide 86

Slide 86 text

値オブジェクト | 存在しない値を存在させない 86 例 ユーザ名の長さは?

Slide 87

Slide 87 text

値オブジェクト | 存在しない値を存在させない 87 仮にユーザ名の長さを 50 文字以下とする

Slide 88

Slide 88 text

値オブジェクト | 存在しない値を存在させない 88

Slide 89

Slide 89 text

値オブジェクト | 存在しない値を存在させない 89 コードで表現

Slide 90

Slide 90 text

値オブジェクト | 存在しない値を存在させない 90 コードで表現 50文字を超えるユーザ名という 本来あり得ないものを存在させない

Slide 91

Slide 91 text

値オブジェクト | 誤った代入を防ぐ 91 表現力が増す 存在しない値を存在させない 誤った代入を防ぐ 値オブジェクトのモチベーション

Slide 92

Slide 92 text

値オブジェクト | 誤った代入を防ぐ 92 代入を間違えたこと ありますか?

Slide 93

Slide 93 text

値オブジェクト | 誤った代入を防ぐ 93 こんなクラス

Slide 94

Slide 94 text

値オブジェクト | 誤った代入を防ぐ 94 こんなクラス こんなメソッド と

Slide 95

Slide 95 text

値オブジェクト | 誤った代入を防ぐ 95 こんなクラス こんなメソッド と Id に name を代入してるけど 正しい?

Slide 96

Slide 96 text

値オブジェクト | 誤った代入を防ぐ 96 値オブジェクトで表現したら

Slide 97

Slide 97 text

値オブジェクト | 誤った代入を防ぐ 97 値オブジェクトで表現したら

Slide 98

Slide 98 text

値オブジェクト | 誤った代入を防ぐ 98 値オブジェクトで表現したら

Slide 99

Slide 99 text

値オブジェクト | 誤った代入を防ぐ 99 誤った代入が 発生しづらくなる 値オブジェクトで表現したら

Slide 100

Slide 100 text

値オブジェクト | まとめ 100 プリミティブな値を無理やり利用せず システム固有の値を作り表現力を増す 実装上の安全性を増す

Slide 101

Slide 101 text

エンティティ ENTITY

Slide 102

Slide 102 text

エンティティ 102 次のお題は エンティティ

Slide 103

Slide 103 text

エンティティ 103 エンティティとは 属性ではなく 同一性によって 識別されるモデル

Slide 104

Slide 104 text

エンティティ 104 エンティティとは

Slide 105

Slide 105 text

エンティティ 105 エンティティとは (値オブジェクトの逆)

Slide 106

Slide 106 text

エンティティ 106 可変 同じ属性でも区別される 同一性を持つ エンティティの性質

Slide 107

Slide 107 text

エンティティ | 可変 107 可変 同じ属性でも区別される 同一性を持つ エンティティの性質

Slide 108

Slide 108 text

エンティティ | 可変 108

Slide 109

Slide 109 text

エンティティ | 可変 109 名前を変更できるようにしたい

Slide 110

Slide 110 text

エンティティ | 可変 110

Slide 111

Slide 111 text

エンティティ | 可変 111 属性が可変

Slide 112

Slide 112 text

エンティティ | 可変 112 可変 同じ属性でも区別される 同一性を持つ エンティティの性質

Slide 113

Slide 113 text

エンティティ | 同じ属性でも区別される 113 ユーザ A ユーザ B

Slide 114

Slide 114 text

エンティティ | 同じ属性でも区別される 114 ユーザ A ユーザ B FirstName: taro FamilyName: tanaka FirstName: taro FamilyName: tanaka

Slide 115

Slide 115 text

エンティティ | 同じ属性でも区別される 115 ユーザ A ユーザ B FirstName: taro FamilyName: tanaka FirstName: taro FamilyName: tanaka 同じユーザ?

Slide 116

Slide 116 text

エンティティ | 同じ属性でも区別される 116

Slide 117

Slide 117 text

エンティティ | 同じ属性でも区別される 117 true or false?

Slide 118

Slide 118 text

エンティティ | 同じ属性でも区別される 118 属性が同じでも同姓同名かもしれない

Slide 119

Slide 119 text

エンティティ | 同じ属性でも区別される 119 ユーザを識別する必要がある 属性が同じでも同姓同名かもしれない

Slide 120

Slide 120 text

エンティティ | 同じ属性でも区別される 120 識別子が必要 属性が同じでも同姓同名かもしれない ユーザを識別する必要がある

Slide 121

Slide 121 text

エンティティ | 同じ属性でも区別される 121 ID を示す 値オブジェクトを作って

Slide 122

Slide 122 text

エンティティ | 同じ属性でも区別される 122

Slide 123

Slide 123 text

エンティティ | 同じ属性でも区別される 123 ユーザ A ユーザ B FirstName: taro FamilyName: tanaka Id: A FirstName: taro FamilyName: tanaka Id: B

Slide 124

Slide 124 text

エンティティ | 同じ属性でも区別される 124 ユーザ A ユーザ B FirstName: taro FamilyName: tanaka Id: A FirstName: taro FamilyName: tanaka Id: B IDで識別できるようになった

Slide 125

Slide 125 text

エンティティ | 可変 125 可変 同じ属性でも区別される 同一性を持つ エンティティの性質

Slide 126

Slide 126 text

エンティティ | 同一性を持つ 126 FirstName: taro FamilyName: tanaka

Slide 127

Slide 127 text

エンティティ | 同一性を持つ 127 FirstName: taro FamilyName: tanaka FirstName: taro FamilyName: sato

Slide 128

Slide 128 text

別人? エンティティ | 同一性を持つ 128 FirstName: taro FamilyName: tanaka FirstName: taro FamilyName: sato

Slide 129

Slide 129 text

別人? エンティティ | 同一性を持つ 129 FirstName: taro FamilyName: tanaka FirstName: taro FamilyName: sato 同一人物

Slide 130

Slide 130 text

別人? エンティティ | 同一性を持つ 130 FirstName: taro FamilyName: tanaka Id: A FirstName: taro FamilyName: sato Id: A 同一人物

Slide 131

Slide 131 text

エンティティ | 同一性を持つ 131 ID で比較をする ※これはツールによる実装

Slide 132

Slide 132 text

エンティティ | 同一性を持つ 132 結果

Slide 133

Slide 133 text

エンティティ | まとめ 133 属性ではなく 同一性によって 識別されるモデル ライフサイクルを持っている

Slide 134

Slide 134 text

サービス(ドメインサービス) SERVICE (DOMAIN SERVICE)

Slide 135

Slide 135 text

ドメインサービス 135 全ての混乱の原因

Slide 136

Slide 136 text

ドメインサービス 136 サービスという言葉 全ての混乱の原因

Slide 137

Slide 137 text

ドメインサービス 137 Web サービス サービス指向アーキテクチャ アプリケーションサービス ドメインサービス マイクロサービス Saas Paas Iaas

Slide 138

Slide 138 text

ドメインサービス 138 サービスという言葉の付く単語は 世の中にごまんとある

Slide 139

Slide 139 text

ドメインサービス 139 ドメインサービスは

Slide 140

Slide 140 text

ドメインサービス 140 ドメインサービスは エンティティや値オブジェクトに 実装するのが自然でない処理を 実装するオブジェクト

Slide 141

Slide 141 text

ドメインサービス 141 例えばユーザ登録で 「ユーザ名の重複を許さない」 というケース

Slide 142

Slide 142 text

ドメインサービス 142 エンティティに定義してみよう

Slide 143

Slide 143 text

ドメインサービス 143 エンティティに定義してみよう

Slide 144

Slide 144 text

ドメインサービス 144 エンティティに定義してみよう 使ってみる

Slide 145

Slide 145 text

ドメインサービス 145 使ってみる 自分に問い合わせ?? エンティティに定義してみよう

Slide 146

Slide 146 text

ドメインサービス 146 チェック専用オブジェクトを作る

Slide 147

Slide 147 text

ドメインサービス 147 チェック専用オブジェクトを作る

Slide 148

Slide 148 text

ドメインサービス 148 チェック専用オブジェクトを作る ‘forcheck’ さんって誰?

Slide 149

Slide 149 text

ドメインサービス 149 つまりこれは エンティティに 実装するのが自然でない処理

Slide 150

Slide 150 text

ドメインサービス 150 つまりこれは エンティティに 実装するのが自然でない処理 ドメインサービス

Slide 151

Slide 151 text

ドメインサービス 151 ドメインサービス 実装は後程

Slide 152

Slide 152 text

ビジネスロジックを組み立てよう 152 最小限のモデリング要素は学んだので ロジックを組み立ててみよう

Slide 153

Slide 153 text

ビジネスロジックを組み立てよう 153 最小限のモデリング要素は学んだので ロジックを組み立ててみよう お題はユーザ登録

Slide 154

Slide 154 text

ビジネスロジックを組み立てよう 154

Slide 155

Slide 155 text

ビジネスロジックを組み立てよう 155 MySQL を使うとしたら

Slide 156

Slide 156 text

ビジネスロジックを組み立てよう 156 こんな感じ?

Slide 157

Slide 157 text

ビジネスロジックを組み立てよう 157 きっとドメインサービスも

Slide 158

Slide 158 text

ビジネスロジックを組み立てよう 158 こうなる きっとドメインサービスも

Slide 159

Slide 159 text

ビジネスロジックを組み立てよう 159 データベースは大事

Slide 160

Slide 160 text

ビジネスロジックを組み立てよう 160 だけど

Slide 161

Slide 161 text

ビジネスロジックを組み立てよう 161 ユーザ登録処理という ロジックの大半を 占めるべき内容か

Slide 162

Slide 162 text

リポジトリ REPOSITORY

Slide 163

Slide 163 text

リポジトリ 163 リポジトリは

Slide 164

Slide 164 text

リポジトリ 164 リポジトリは データの永続化を担う オブジェクト

Slide 165

Slide 165 text

リポジトリ 165 リポジトリは データの永続化を担う オブジェクト 永続化の対象 =

Slide 166

Slide 166 text

リポジトリ 166 リポジトリは データの永続化を担う オブジェクト 永続化の対象 = エンティティ

Slide 167

Slide 167 text

リポジトリ 167 リポジトリを作ってみよう

Slide 168

Slide 168 text

リポジトリ 168

Slide 169

Slide 169 text

リポジトリ 169 永続化装置からの再構築(検索)

Slide 170

Slide 170 text

リポジトリ 170 永続化装置からの再構築(検索) 永続化

Slide 171

Slide 171 text

リポジトリ 171

Slide 172

Slide 172 text

リポジトリ 172 すっきり

Slide 173

Slide 173 text

リポジトリ 173 きっとドメインサービスも

Slide 174

Slide 174 text

リポジトリ 174 きっとドメインサービスも こうなる

Slide 175

Slide 175 text

リポジトリ 175 結果として こうなる

Slide 176

Slide 176 text

リポジトリ | テスト 176 ところでテストって好きですか?

Slide 177

Slide 177 text

リポジトリ | テスト 177 どうやってテストする?

Slide 178

Slide 178 text

リポジトリ | テスト 178 どうやってテストする?

Slide 179

Slide 179 text

リポジトリ | テスト 179 どうやってテストする? データベースに接続

Slide 180

Slide 180 text

リポジトリ | テスト 180 どうやってテストする? データベースにデータを用意する・・・ データベースに接続

Slide 181

Slide 181 text

リポジトリ | テスト 181 ここからがリポジトリの 本領発揮です

Slide 182

Slide 182 text

リポジトリ | テスト 182 まずはリポジトリの インターフェースを用意 ※インターフェースがない言語は完全抽象クラスで

Slide 183

Slide 183 text

リポジトリ | テスト 183 本番用リポジトリはインターフェースを実装

Slide 184

Slide 184 text

リポジトリ | テスト 184 テストのためのリポジトリを用意

Slide 185

Slide 185 text

リポジトリ | テスト 185 さっきのロジックは

Slide 186

Slide 186 text

リポジトリ | テスト 186 こうなる

Slide 187

Slide 187 text

リポジトリ | テスト 187

Slide 188

Slide 188 text

リポジトリ | テスト 188

Slide 189

Slide 189 text

リポジトリ | テスト 189 InMemoryUserRepository or UserRepository

Slide 190

Slide 190 text

リポジトリ | テスト 190 InMemoryUserRepository or UserRepository

Slide 191

Slide 191 text

リポジトリ | テスト 191 InMemoryUserRepository or UserRepository

Slide 192

Slide 192 text

リポジトリ | テスト 192 このロジックは依存がなくなった

Slide 193

Slide 193 text

リポジトリ | テスト 193 このロジックは依存がなくなった 依存 =

Slide 194

Slide 194 text

リポジトリ | テスト 194 このロジックは依存がなくなった UserRepository への依存 特定のインフラへの依存 依存 =

Slide 195

Slide 195 text

リポジトリ | 純粋なロジックとして 195 InMemoryUserRepository に 再現したいデータを用意しておけば テストができる

Slide 196

Slide 196 text

リポジトリ | 純粋なロジックとして 196 InMemoryUserRepository に 再現したいデータを用意しておけば テストができる 特定の具象オブジェクトに依存しないので 本番と同じロジックを使ってテストができる

Slide 197

Slide 197 text

アプリケーションサービス 197 次のテーマは アプリケーションサービス

Slide 198

Slide 198 text

アプリケーションサービス 198 アプリケーションサービスは ビジネスロジックの API

Slide 199

Slide 199 text

アプリケーションサービス 199 アプリケーションサービスは ビジネスロジックの API 何ができるかを表現

Slide 200

Slide 200 text

アプリケーションサービス 200 ユースケースを表現

Slide 201

Slide 201 text

アプリケーションサービス 201

Slide 202

Slide 202 text

アプリケーションサービス 202 どこかで見たことが ありませんか

Slide 203

Slide 203 text

アプリケーションサービス 203 これまで出てきた Program クラスは 実はアプリケーションサービス

Slide 204

Slide 204 text

アプリケーションサービス 204 アプリケーションサービスは

Slide 205

Slide 205 text

アプリケーションサービス 205 エンティティ 値オブジェクト ドメインサービス リポジトリ アプリケーションサービスは

Slide 206

Slide 206 text

アプリケーションサービス 206 エンティティ 値オブジェクト ドメインサービス リポジトリ これらを協調させて ユースケースを達成する アプリケーションサービスは

Slide 207

Slide 207 text

アプリケーションサービス 207 ユースケースが達成できる

Slide 208

Slide 208 text

アプリケーションサービス 208 ユースケースが達成できる アプリが作れる

Slide 209

Slide 209 text

アプリケーションサービス | MVC 209 MVC フレームワークに組み込もう

Slide 210

Slide 210 text

アプリケーションサービス | MVC 210

Slide 211

Slide 211 text

アプリケーションサービス | MVC 211 Dependency Injection

Slide 212

Slide 212 text

アプリケーションサービス | DI 212 Dependency Injection

Slide 213

Slide 213 text

アプリケーションサービス | DI 213 Dependency Injection 依存しているオブジェクトを コンストラクタ等から引き渡す(注入)する

Slide 214

Slide 214 text

アプリケーションサービス | DI 214 Dependency Injection 依存しているオブジェクトを コンストラクタ等から引き渡す(注入)する

Slide 215

Slide 215 text

アプリケーションサービス | DI 215 MVC フレームワークでは Controller のコンストラクタは フレームワークが呼び出しを行うので IoC Container (DI Container) を利用して 依存を設定する

Slide 216

Slide 216 text

アプリケーションサービス | DI 216 こんな感じ

Slide 217

Slide 217 text

アプリケーションサービス | セパレートインターフェース 217 ところでこんな風に interface を 用意する場合もあります

Slide 218

Slide 218 text

アプリケーションサービス | セパレートインターフェース 218 ところでこんな風に interface を 用意する場合もあります セパレートインターフェース と言われます

Slide 219

Slide 219 text

アプリケーションサービス | セパレートインターフェース 219 ところでこんな風に interface を 用意する場合もあります

Slide 220

Slide 220 text

アプリケーションサービス | セパレートインターフェース 220 ところでこんな風に interface を 用意する場合もあります

Slide 221

Slide 221 text

アプリケーションサービス | セパレートインターフェース 221 なんのために?

Slide 222

Slide 222 text

アプリケーションサービス | セパレートインターフェース 222 例えば例外が発生したときの動作を チェックしたい

Slide 223

Slide 223 text

アプリケーションサービス | セパレートインターフェース 223 例えば例外が発生したときの動作を チェックしたい インメモリのリポジトリでも 例外を起こすような 整合性のあるデータを 用意するのは大変・・・

Slide 224

Slide 224 text

アプリケーションサービス | セパレートインターフェース 224 セパレートインターフェースにしておけば

Slide 225

Slide 225 text

アプリケーションサービス | セパレートインターフェース 225 データを準備しなくても 例外を投げるオブジェクトに差し替えれる セパレートインターフェースにしておけば

Slide 226

Slide 226 text

後半へ続く To be continued on the latter half