Slide 1

Slide 1 text

実 践 Dependency Injection PHPメンターズ 後藤 秀宣 @hidenorigoto 1 version 2012.09.15 12೥9݄15೔౔༵೔

Slide 2

Slide 2 text

後藤秀宣(ごとうひでのり) PHPメンターズ 2 12೥9݄15೔౔༵೔

Slide 3

Slide 3 text

後藤秀宣(ごとうひでのり) PHPメンターズ • Symfonyユーザー会 2 12೥9݄15೔౔༵೔

Slide 4

Slide 4 text

後藤秀宣(ごとうひでのり) PHPメンターズ • Symfonyユーザー会 • Symfony Midnight 2 12೥9݄15೔౔༵೔

Slide 5

Slide 5 text

後藤秀宣(ごとうひでのり) PHPメンターズ • Symfonyユーザー会 • Symfony Midnight • 翻訳温泉ツアー 2 12೥9݄15೔౔༵೔

Slide 6

Slide 6 text

後藤秀宣(ごとうひでのり) PHPメンターズ • Symfonyユーザー会 • Symfony Midnight • 翻訳温泉ツアー • WEB+DB PRESS 2 12೥9݄15೔౔༵೔

Slide 7

Slide 7 text

アジェンダ 1.前提 - DIは必要なのか? 2.Symfony DIコンポーネントの特徴など 3.Symfony DIコンポーネントの使い方実例 4.まとめ 5.(プチ懇親会のお知らせ) 3 12೥9݄15೔౔༵೔

Slide 8

Slide 8 text

前提 4 12೥9݄15೔౔༵೔

Slide 9

Slide 9 text

5 12೥9݄15೔౔༵೔

Slide 10

Slide 10 text

5 ソフトウェア開発 での大きな問題 12೥9݄15೔౔༵೔

Slide 11

Slide 11 text

6 変更 (にかかるコスト) 12೥9݄15೔౔༵೔

Slide 12

Slide 12 text

6 変更 (にかかるコスト) バグの修正 12೥9݄15೔౔༵೔

Slide 13

Slide 13 text

6 変更 (にかかるコスト) バグの修正 機能の追加 12೥9݄15೔౔༵೔

Slide 14

Slide 14 text

7 12೥9݄15೔౔༵೔

Slide 15

Slide 15 text

7 変更コスト 12೥9݄15೔౔༵೔

Slide 16

Slide 16 text

7 変更コスト 複雑性 12೥9݄15೔౔༵೔

Slide 17

Slide 17 text

7 変更コスト 複雑性 12೥9݄15೔౔༵೔

Slide 18

Slide 18 text

7 変更コスト 複雑性 依存関係 12೥9݄15೔౔༵೔

Slide 19

Slide 19 text

7 変更コスト 複雑性 依存関係 依存の明確化 12೥9݄15೔౔༵೔

Slide 20

Slide 20 text

7 変更コスト 複雑性 依存関係 依存の明確化 依存を減らす 12೥9݄15೔౔༵೔

Slide 21

Slide 21 text

7 変更コスト 複雑性 依存関係 依存の明確化 依存を減らす 12೥9݄15೔౔༵೔

Slide 22

Slide 22 text

7 依存関係 12೥9݄15೔౔༵೔

Slide 23

Slide 23 text

DIは必要なのか? 8 12೥9݄15೔౔༵೔

Slide 24

Slide 24 text

9 12೥9݄15೔౔༵೔

Slide 25

Slide 25 text

9 ? 12೥9݄15೔౔༵೔

Slide 26

Slide 26 text

9 ? 12೥9݄15೔౔༵೔

Slide 27

Slide 27 text

9 ? 12೥9݄15೔౔༵೔

Slide 28

Slide 28 text

9 ? 12೥9݄15೔౔༵೔

Slide 29

Slide 29 text

9 ? 12೥9݄15೔౔༵೔

Slide 30

Slide 30 text

DIの話? 10 12೥9݄15೔౔༵೔

Slide 31

Slide 31 text

DIの話? 10 Dependency Injectionパターン 12೥9݄15೔౔༵೔

Slide 32

Slide 32 text

DIの話? 10 Dependency Injectionパターン DIコンテナ 12೥9݄15೔౔༵೔

Slide 33

Slide 33 text

DIの話? 11 Dependency Injection パターン DIコンテナ 12೥9݄15೔౔༵೔

Slide 34

Slide 34 text

DIの話? 11 Dependency Injection パターン DIコンテナ ソフトウェア開発の現場 で問題解決に繰り返し 使われる有用な手法に命名 12೥9݄15೔౔༵೔

Slide 35

Slide 35 text

DIの話? 11 Dependency Injection パターン DIコンテナ ソフトウェア開発の現場 で問題解決に繰り返し 使われる有用な手法に命名 有用 12೥9݄15೔౔༵೔

Slide 36

Slide 36 text

DIの話? 11 Dependency Injection パターン DIコンテナ ソフトウェア開発の現場 で問題解決に繰り返し 使われる有用な手法に命名 DIパターン を適用するための ツール 有用 12೥9݄15೔౔༵೔

Slide 37

Slide 37 text

DIパターン • 依存オブジェクトは外部から注入される ことを前提とする 12 12೥9݄15೔౔༵೔

Slide 38

Slide 38 text

DIパターン • 依存オブジェクトは外部から注入される ことを前提とする 12 12೥9݄15೔౔༵೔

Slide 39

Slide 39 text

DIパターン • 依存オブジェクトは外部から注入される ことを前提とする 12 注入 12೥9݄15೔౔༵೔

Slide 40

Slide 40 text

DIパターン • 依存オブジェクトは外部から注入される ことを前提とする 12 注入 12೥9݄15೔౔༵೔

Slide 41

Slide 41 text

DIパターン • 依存オブジェクトは外部から注入される ことを前提とする 12 注入 セッター インジェクション 12೥9݄15೔౔༵೔

Slide 42

Slide 42 text

DIパターン • 依存オブジェクトは外部から注入される ことを前提とする 12 注入 mailerの生成には 関与しない 12೥9݄15೔౔༵೔

Slide 43

Slide 43 text

DIコンテナ? 13 12೥9݄15೔౔༵೔

Slide 44

Slide 44 text

DIコンテナ? 13 ファクトリー 12೥9݄15೔౔༵೔

Slide 45

Slide 45 text

DIコンテナ? 13 ファクトリー ライフサイクル 12೥9݄15೔౔༵೔

Slide 46

Slide 46 text

DIコンテナ? 13 ファクトリー ライフサイクル モック 12೥9݄15೔౔༵೔

Slide 47

Slide 47 text

DIコンテナ? 13 ファクトリー ライフサイクル モック Dependency Injector 12೥9݄15೔౔༵೔

Slide 48

Slide 48 text

DIコンテナ? 13 ファクトリー ライフサイクル モック Dependency Injector AOP 12೥9݄15೔౔༵೔

Slide 49

Slide 49 text

DIコンテナ? 14 12೥9݄15೔౔༵೔

Slide 50

Slide 50 text

DIコンテナ? 14 XMLでオブジェクトの構成を 設定するのは面倒 12೥9݄15೔౔༵೔

Slide 51

Slide 51 text

DIコンテナ? 14 XMLでオブジェクトの構成を 設定するのは面倒 DIコンテナはいらない。。? 12೥9݄15೔౔༵೔

Slide 52

Slide 52 text

DIコンテナ? 15 XMLでオブジェクトの構成を 設定するのは面倒 Α͋͘Δצҧ͍ DIコンテナはいらない。。? 12೥9݄15೔౔༵೔

Slide 53

Slide 53 text

DIコンテナ? 15 XMLでオブジェクトの構成を 設定するのは面倒 Α͋͘Δצҧ͍ DIコンテナはいらない。。? ファクトリー 機能の話 12೥9݄15೔౔༵೔

Slide 54

Slide 54 text

DIコンテナ? 15 XMLでオブジェクトの構成を 設定するのは面倒 Α͋͘Δצҧ͍ DIコンテナはいらない。。? ファクトリー 機能の話 エディタ問題 12೥9݄15೔౔༵೔

Slide 55

Slide 55 text

DIコンテナ? 15 XMLでオブジェクトの構成を 設定するのは面倒 Α͋͘Δצҧ͍ DIコンテナはいらない。。? ファクトリー 機能の話 エディタ問題 DSLの問題 12೥9݄15೔౔༵೔

Slide 56

Slide 56 text

DIコンテナ? 15 XMLでオブジェクトの構成を 設定するのは面倒 Α͋͘Δצҧ͍ DIコンテナはいらない。。? ファクトリー 機能の話 エディタ問題 DSLの問題 DIコンテナの 一つの機能 でしかない 12೥9݄15೔౔༵೔

Slide 57

Slide 57 text

DIコンテナ? 16 ファクトリー ライフサイクル モック Dependency Injector AOP 12೥9݄15೔౔༵೔

Slide 58

Slide 58 text

DIコンテナ? 17 12೥9݄15೔౔༵೔

Slide 59

Slide 59 text

DIコンテナ? 17 • DIパターンを適用するためのツールの1つ 12೥9݄15೔౔༵೔

Slide 60

Slide 60 text

DIコンテナ? 17 • DIパターンを適用するためのツールの1つ • DIパターン、SOLID原則等を適用していく 場合・・・・必須 12೥9݄15೔౔༵೔

Slide 61

Slide 61 text

DIコンテナ? 17 • DIパターンを適用するためのツールの1つ • DIパターン、SOLID原則等を適用していく 場合・・・・必須 • 銀の弾丸ではない 12೥9݄15೔౔༵೔

Slide 62

Slide 62 text

DIコンテナ? 17 • DIパターンを適用するためのツールの1つ • DIパターン、SOLID原則等を適用していく 場合・・・・必須 • 銀の弾丸ではない • DIコンテナさえ使っていれば良い、とい うわけではない 12೥9݄15೔౔༵೔

Slide 63

Slide 63 text

DIコンテナ? 17 • DIパターンを適用するためのツールの1つ • DIパターン、SOLID原則等を適用していく 場合・・・・必須 • 銀の弾丸ではない • DIコンテナさえ使っていれば良い、とい うわけではない • 使う側の理解が重要 12೥9݄15೔౔༵೔

Slide 64

Slide 64 text

PHPのDI実装 • Symfony Dependency Injection • Zend\Di • Aura.Di • Ray.Di • Ding • Pimple 18 12೥9݄15೔౔༵೔

Slide 65

Slide 65 text

Symfony DIコンポーネント の特徴 19 12೥9݄15೔౔༵೔

Slide 66

Slide 66 text

Symfony DIコンポーネント 20 12೥9݄15೔౔༵೔

Slide 67

Slide 67 text

Symfony DIコンポーネント • フレームワークSymfonyの基盤として開発 20 12೥9݄15೔౔༵೔

Slide 68

Slide 68 text

Symfony DIコンポーネント • フレームワークSymfonyの基盤として開発 • 2.0 stableが2011年7月28日にリリース 20 12೥9݄15೔౔༵೔

Slide 69

Slide 69 text

Symfony DIコンポーネント • フレームワークSymfonyの基盤として開発 • 2.0 stableが2011年7月28日にリリース • 2.1 stable 2012年9月6日 20 12೥9݄15೔౔༵೔

Slide 70

Slide 70 text

Symfony DIコンポーネント • フレームワークSymfonyの基盤として開発 • 2.0 stableが2011年7月28日にリリース • 2.1 stable 2012年9月6日 • Symfony以外のOSSでも採用されている 20 12೥9݄15೔౔༵೔

Slide 71

Slide 71 text

Symfony DIコンポーネント 21 12೥9݄15೔౔༵೔

Slide 72

Slide 72 text

Symfony DIコンポーネント • ドキュメント http://symfony.com/doc/current/components/ dependency_injection/index.html 21 12೥9݄15೔౔༵೔

Slide 73

Slide 73 text

Symfony DIコンポーネント • ドキュメント http://symfony.com/doc/current/components/ dependency_injection/index.html • GitHub https://github.com/symfony/DependencyInjection 21 12೥9݄15೔౔༵೔

Slide 74

Slide 74 text

Symfony DIコンポーネント • ドキュメント http://symfony.com/doc/current/components/ dependency_injection/index.html • GitHub https://github.com/symfony/DependencyInjection • Packagist symfony/dependency-injection 21 12೥9݄15೔౔༵೔

Slide 75

Slide 75 text

Symfony DIコンポーネント 22 12೥9݄15೔౔༵೔

Slide 76

Slide 76 text

Symfony DIコンポーネント • DIコンテナの基本機能 • オーソドックスなインジェクション 22 12೥9݄15೔౔༵೔

Slide 77

Slide 77 text

Symfony DIコンポーネント • DIコンテナの基本機能 • オーソドックスなインジェクション • エクステンション機構 • コンテナのダンプ機能 • コンパイルプロセス 22 12೥9݄15೔౔༵೔

Slide 78

Slide 78 text

Symfony DIコンポーネント • DIコンテナの基本機能 • オーソドックスなインジェクション • エクステンション機構 • コンテナのダンプ機能 • コンパイルプロセス 22 12೥9݄15೔౔༵೔

Slide 79

Slide 79 text

Symfony DIコンポーネント • DIコンテナの基本機能 • オーソドックスなインジェクション • エクステンション機構 • コンテナのダンプ機能 • コンパイルプロセス 22 コンポーネントの 粒度で拡張ポイン トを扱う 12೥9݄15೔౔༵೔

Slide 80

Slide 80 text

Symfony DIコンポーネント • DIコンテナの基本機能 • オーソドックスなインジェクション • エクステンション機構 • コンテナのダンプ機能 • コンパイルプロセス 22 コンポーネントの 粒度で拡張ポイン トを扱う パフォーマンス 向上 12೥9݄15೔౔༵೔

Slide 81

Slide 81 text

Symfony DIコンポーネント • DIコンテナの基本機能 • オーソドックスなインジェクション • エクステンション機構 • コンテナのダンプ機能 • コンパイルプロセス 22 コンポーネントの 粒度で拡張ポイン トを扱う パフォーマンス 向上 ʂ 12೥9݄15೔౔༵೔

Slide 82

Slide 82 text

Symfony DIコンポーネント の使い方実例 23 12೥9݄15೔౔༵೔

Slide 83

Slide 83 text

インストール 24 12೥9݄15೔౔༵೔

Slide 84

Slide 84 text

インストール • Composer 24 12೥9݄15೔౔༵೔

Slide 85

Slide 85 text

インストール • Composer 24 12೥9݄15೔౔༵೔

Slide 86

Slide 86 text

準備 25 12೥9݄15೔౔༵೔

Slide 87

Slide 87 text

準備 25 12೥9݄15೔౔༵೔

Slide 88

Slide 88 text

DIコンテナ利用例1 • 一番シンプルな例 26 12೥9݄15೔౔༵೔

Slide 89

Slide 89 text

DIコンテナ利用例1 • 一番シンプルな例 26 DIコンテナ インスタンス化 12೥9݄15೔౔༵೔

Slide 90

Slide 90 text

DIコンテナ利用例1 • 一番シンプルな例 26 コンテナに サービスを登録 12೥9݄15೔౔༵೔

Slide 91

Slide 91 text

DIコンテナ利用例1 • 一番シンプルな例 26 コンテナから サービスインスタ ンスを取得 12೥9݄15೔౔༵೔

Slide 92

Slide 92 text

DIコンテナ利用例2 27 12೥9݄15೔౔༵೔

Slide 93

Slide 93 text

27 12೥9݄15೔౔༵೔

Slide 94

Slide 94 text

27 コンストラクタで 依存オブジェクト を受け取る 12೥9݄15೔౔༵೔

Slide 95

Slide 95 text

27 コンストラクタの引 数でサービスを渡す 定義 12೥9݄15೔౔༵೔

Slide 96

Slide 96 text

27 12೥9݄15೔౔༵೔

Slide 97

Slide 97 text

DIコンテナ利用例3 28 12೥9݄15೔౔༵೔

Slide 98

Slide 98 text

DIコンテナ利用例3 28 セッターで 依存オブジェクト を受け取る 12೥9݄15೔౔༵೔

Slide 99

Slide 99 text

DIコンテナ利用例3 28 セッターを呼び出 すよう定義 12೥9݄15೔౔༵೔

Slide 100

Slide 100 text

サービス定義をYAMLで 29 12೥9݄15೔౔༵೔

Slide 101

Slide 101 text

30 12೥9݄15೔౔༵೔

Slide 102

Slide 102 text

30 ここまでは ランタイムのみの話 12೥9݄15೔౔༵೔

Slide 103

Slide 103 text

31 すべてがランタイム では破綻する 12೥9݄15೔౔༵೔

Slide 104

Slide 104 text

32 コンテナのダンプ・キャッシュ 12೥9݄15೔౔༵೔

Slide 105

Slide 105 text

• サービス定義などの読み込みが完了し、 サービスを取り出す準備が完了したコン テナ 32 コンテナのダンプ・キャッシュ 12೥9݄15೔౔༵೔

Slide 106

Slide 106 text

• サービス定義などの読み込みが完了し、 サービスを取り出す準備が完了したコン テナ • PHPのクラスとしてダンプされる 32 コンテナのダンプ・キャッシュ 12೥9݄15೔౔༵೔

Slide 107

Slide 107 text

コンテナのダンプ・キャッシュ 33 12೥9݄15೔౔༵೔

Slide 108

Slide 108 text

34 12೥9݄15೔౔༵೔

Slide 109

Slide 109 text

34 12೥9݄15೔౔༵೔

Slide 110

Slide 110 text

コンパイル 35 12೥9݄15೔౔༵೔

Slide 111

Slide 111 text

コンパイル 35 12೥9݄15೔౔༵೔

Slide 112

Slide 112 text

コンパイル • 完成形のDIコンテナに変換する処理 • エクステンションやタグなどの処理 • 複数の処理用CompilerPassオブジェクト (CompilerPassInterfaceを実装したクラ ス)へ委譲 • 独自のCompilerPassを用意して処理を差 し込むことが可能 36 12೥9݄15೔౔༵೔

Slide 113

Slide 113 text

CompilerPass 37 12೥9݄15೔౔༵೔

Slide 114

Slide 114 text

CompilerPass • コンパイル処理のステージ (CompilerPassの登録時に指定) 38 TYPE_BEFORE_OPTIMIZATION 最適化処理前 TYPE_OPTIMIZE 最適化処理 TYPE_BEFORE_REMOVING 削除処理前 TYPE_REMOVE 削除処理 TYPE_AFTER_REMOVING 削除処理後 12೥9݄15೔౔༵೔

Slide 115

Slide 115 text

CompilerPass • 例:Symfony/Twigのtwig.extension • サービス定義にタグとして登録 39 12೥9݄15೔౔༵೔

Slide 116

Slide 116 text

CompilerPass • 例:Symfony/Twigのtwig.extension • サービス定義にタグとして登録 39 12೥9݄15೔౔༵೔

Slide 117

Slide 117 text

CompilerPass • 例:Symfony/Twigのtwig.extension • サービス定義にタグとして登録 39 12೥9݄15೔౔༵೔

Slide 118

Slide 118 text

CompilerPass • 例:Symfony/Twigのtwig.extension • サービス定義にタグとして登録 39 12೥9݄15೔౔༵೔

Slide 119

Slide 119 text

コンパイル 40 12೥9݄15೔౔༵೔

Slide 120

Slide 120 text

コンパイル • PHPでは意識する必要がなかった「コンパイル」を、再び開発者の手 に 40 12೥9݄15೔౔༵೔

Slide 121

Slide 121 text

コンパイル • PHPでは意識する必要がなかった「コンパイル」を、再び開発者の手 に • DIコンテナの持つ機能、抽象的なコンパイル 40 12೥9݄15೔౔༵೔

Slide 122

Slide 122 text

コンパイル • PHPでは意識する必要がなかった「コンパイル」を、再び開発者の手 に • DIコンテナの持つ機能、抽象的なコンパイル • フレームワークの持つ可変性・柔軟性は、ランタイムで動的に必要な わけではない 40 12೥9݄15೔౔༵೔

Slide 123

Slide 123 text

コンパイル • PHPでは意識する必要がなかった「コンパイル」を、再び開発者の手 に • DIコンテナの持つ機能、抽象的なコンパイル • フレームワークの持つ可変性・柔軟性は、ランタイムで動的に必要な わけではない • コンパイルにより固定化する 40 12೥9݄15೔౔༵೔

Slide 124

Slide 124 text

コンパイル • PHPでは意識する必要がなかった「コンパイル」を、再び開発者の手 に • DIコンテナの持つ機能、抽象的なコンパイル • フレームワークの持つ可変性・柔軟性は、ランタイムで動的に必要な わけではない • コンパイルにより固定化する • コンパイル時に決定できる情報はできるだけコンパイル時に寄せ る 40 12೥9݄15೔౔༵೔

Slide 125

Slide 125 text

コンパイル • PHPでは意識する必要がなかった「コンパイル」を、再び開発者の手 に • DIコンテナの持つ機能、抽象的なコンパイル • フレームワークの持つ可変性・柔軟性は、ランタイムで動的に必要な わけではない • コンパイルにより固定化する • コンパイル時に決定できる情報はできるだけコンパイル時に寄せ る • パフォーマンス向上 40 12೥9݄15೔౔༵೔

Slide 126

Slide 126 text

コンパイル • PHPでは意識する必要がなかった「コンパイル」を、再び開発者の手 に • DIコンテナの持つ機能、抽象的なコンパイル • フレームワークの持つ可変性・柔軟性は、ランタイムで動的に必要な わけではない • コンパイルにより固定化する • コンパイル時に決定できる情報はできるだけコンパイル時に寄せ る • パフォーマンス向上 • Configコンポーネントなどと組み合わせ、ジェネレーティブプログラ ミングへの道筋となる 40 12೥9݄15೔౔༵೔

Slide 127

Slide 127 text

まとめ 41 12೥9݄15೔౔༵೔

Slide 128

Slide 128 text

まとめ 42 12೥9݄15೔౔༵೔

Slide 129

Slide 129 text

まとめ • DIは、変更に強いクラスを設計するために必須の技術 42 12೥9݄15೔౔༵೔

Slide 130

Slide 130 text

まとめ • DIは、変更に強いクラスを設計するために必須の技術 • 実践で使われているDIコンテナ実装はすでにある 42 12೥9݄15೔౔༵೔

Slide 131

Slide 131 text

まとめ • DIは、変更に強いクラスを設計するために必須の技術 • 実践で使われているDIコンテナ実装はすでにある • 過去から蓄積されてきた汎用的な知見を学び、自分のソフトウェ ア開発に取り入れよう 42 12೥9݄15೔౔༵೔

Slide 132

Slide 132 text

参考 43 アジャイルソフトウェア 開発の奥義(第2版) WEB+DB PRESS vol 71 12೥9݄15೔౔༵೔

Slide 133

Slide 133 text

44 ありがとうございました http://phpmentors.jp/ 12೥9݄15೔౔༵೔