実践Dependency Injection

Ba8ecb9f1d269e44056ff4e7dca4c5e0?s=47 hidenorigoto
September 15, 2012

実践Dependency Injection

PHPカンファレンス2012 実践Dependency Injectionスライド

Ba8ecb9f1d269e44056ff4e7dca4c5e0?s=128

hidenorigoto

September 15, 2012
Tweet

Transcript

  1. 実 践 Dependency Injection PHPメンターズ 後藤 秀宣 @hidenorigoto 1 version

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

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

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

  5. 後藤秀宣(ごとうひでのり) PHPメンターズ • Symfonyユーザー会 • Symfony Midnight • 翻訳温泉ツアー 2

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

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

    3 12೥9݄15೔౔༵೔
  8. 前提 4 12೥9݄15೔౔༵೔

  9. 5 12೥9݄15೔౔༵೔

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

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

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

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

  14. 7 12೥9݄15೔౔༵೔

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

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

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

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

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

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

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

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

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

  24. 9 12೥9݄15೔౔༵೔

  25. 9 ? 12೥9݄15೔౔༵೔

  26. 9 ? 12೥9݄15೔౔༵೔

  27. 9 ? 12೥9݄15೔౔༵೔

  28. 9 ? 12೥9݄15೔౔༵೔

  29. 9 ? 12೥9݄15೔౔༵೔

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

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

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

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

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

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

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

    を適用するための ツール 有用 12೥9݄15೔౔༵೔
  37. DIパターン • 依存オブジェクトは外部から注入される ことを前提とする 12 12೥9݄15೔౔༵೔

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    DIコンテナの 一つの機能 でしかない 12೥9݄15೔౔༵೔
  57. DIコンテナ? 16 ファクトリー ライフサイクル モック Dependency Injector AOP 12೥9݄15೔౔༵೔

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

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

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

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

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

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

    DIコンテナさえ使っていれば良い、とい うわけではない • 使う側の理解が重要 12೥9݄15೔౔༵೔
  64. PHPのDI実装 • Symfony Dependency Injection • Zend\Di • Aura.Di •

    Ray.Di • Ding • Pimple 18 12೥9݄15೔౔༵೔
  65. Symfony DIコンポーネント の特徴 19 12೥9݄15೔౔༵೔

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

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

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

  69. Symfony DIコンポーネント • フレームワークSymfonyの基盤として開発 • 2.0 stableが2011年7月28日にリリース • 2.1 stable

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

    2012年9月6日 • Symfony以外のOSSでも採用されている 20 12೥9݄15೔౔༵೔
  71. Symfony DIコンポーネント 21 12೥9݄15೔౔༵೔

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

  73. Symfony DIコンポーネント • ドキュメント http://symfony.com/doc/current/components/ dependency_injection/index.html • GitHub https://github.com/symfony/DependencyInjection 21

    12೥9݄15೔౔༵೔
  74. 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೔౔༵೔
  75. Symfony DIコンポーネント 22 12೥9݄15೔౔༵೔

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

  77. Symfony DIコンポーネント • DIコンテナの基本機能 • オーソドックスなインジェクション • エクステンション機構 • コンテナのダンプ機能

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

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

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

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

    • コンパイルプロセス 22 コンポーネントの 粒度で拡張ポイン トを扱う パフォーマンス 向上 ʂ 12೥9݄15೔౔༵೔
  82. Symfony DIコンポーネント の使い方実例 23 12೥9݄15೔౔༵೔

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

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

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

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

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

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

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

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

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

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

  93. 27 12೥9݄15೔౔༵೔

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

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

  96. 27 12೥9݄15೔౔༵೔

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

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

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

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

  101. 30 12೥9݄15೔౔༵೔

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

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

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

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

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

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

  108. 34 12೥9݄15೔౔༵೔

  109. 34 12೥9݄15೔౔༵೔

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

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

  112. コンパイル • 完成形のDIコンテナに変換する処理 • エクステンションやタグなどの処理 • 複数の処理用CompilerPassオブジェクト (CompilerPassInterfaceを実装したクラ ス)へ委譲 •

    独自のCompilerPassを用意して処理を差 し込むことが可能 36 12೥9݄15೔౔༵೔
  113. CompilerPass 37 12೥9݄15೔౔༵೔

  114. CompilerPass • コンパイル処理のステージ (CompilerPassの登録時に指定) 38 TYPE_BEFORE_OPTIMIZATION 最適化処理前 TYPE_OPTIMIZE 最適化処理 TYPE_BEFORE_REMOVING

    削除処理前 TYPE_REMOVE 削除処理 TYPE_AFTER_REMOVING 削除処理後 12೥9݄15೔౔༵೔
  115. CompilerPass • 例:Symfony/Twigのtwig.extension • サービス定義にタグとして登録 39 12೥9݄15೔౔༵೔

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

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

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

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

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

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

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

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

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

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

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

    コンパイルにより固定化する • コンパイル時に決定できる情報はできるだけコンパイル時に寄せ る • パフォーマンス向上 • Configコンポーネントなどと組み合わせ、ジェネレーティブプログラ ミングへの道筋となる 40 12೥9݄15೔౔༵೔
  127. まとめ 41 12೥9݄15೔౔༵೔

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

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

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

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

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

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