Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
実践Dependency Injection
Search
hidenorigoto
September 15, 2012
Technology
6
4.3k
実践Dependency Injection
PHPカンファレンス2012 実践Dependency Injectionスライド
hidenorigoto
September 15, 2012
Tweet
Share
More Decks by hidenorigoto
See All by hidenorigoto
ドメインと向き合う - 旅行予約編
hidenorigoto
4
700
「ソフトウェア設計」のドメイン - 「データモデリングでドメインを駆動する」を読んで
hidenorigoto
10
2.8k
メルカリ バックエンド領域のこれまでとこれから
hidenorigoto
1
430
メルカリのエンジニアリング組織の変化〜Engineering Managerの視点から〜
hidenorigoto
0
8.1k
The changes of the engineering organization in Mercari - from the view of an engineering manager -
hidenorigoto
0
270
PHPerKaigi 2019 ランチセッション (3/31)
hidenorigoto
1
3.9k
抽象化って何? (What is abstraction?)
hidenorigoto
9
4.4k
抽象化って何? (What is abstraction?)
hidenorigoto
11
6.6k
続・SOLIDの原則ってどんなふうに使うの? 〜オープン・クローズドの原則 センパイのコーディングノート編〜
hidenorigoto
14
5.8k
Other Decks in Technology
See All in Technology
LINE Developersプロダクト(LIFF/LINE Login)におけるフロントエンド開発
lycorptech_jp
PRO
0
120
あの日俺達が夢見たサーバレスアーキテクチャ/the-serverless-architecture-we-dreamed-of
tomoki10
0
470
Snykで始めるセキュリティ担当者とSREと開発者が楽になる脆弱性対応 / Getting started with Snyk Vulnerability Response
yamaguchitk333
2
190
宇宙ベンチャーにおける最近の情シス取り組みについて
axelmizu
0
110
株式会社ログラス − エンジニア向け会社説明資料 / Loglass Comapany Deck for Engineer
loglass2019
3
32k
事業貢献を考えるための技術改善の目標設計と改善実績 / Targeted design of technical improvements to consider business contribution and improvement performance
oomatomo
0
100
Amazon Kendra GenAI Index 登場でどう変わる? 評価から学ぶ最適なRAG構成
naoki_0531
0
120
NilAway による静的解析で「10 億ドル」を節約する #kyotogo / Kyoto Go 56th
ytaka23
3
380
Amazon VPC Lattice 最新アップデート紹介 - PrivateLink も似たようなアップデートあったけど違いとは
bigmuramura
0
200
10個のフィルタをAXI4-Streamでつなげてみた
marsee101
0
170
Google Cloud で始める Cloud Run 〜AWSとの比較と実例デモで解説〜
risatube
PRO
0
110
コンテナセキュリティのためのLandlock入門
nullpo_head
2
320
Featured
See All Featured
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
2
170
BBQ
matthewcrist
85
9.4k
Speed Design
sergeychernyshev
25
670
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
0
98
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.3k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
Navigating Team Friction
lara
183
15k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
66k
Faster Mobile Websites
deanohume
305
30k
The Cost Of JavaScript in 2023
addyosmani
45
7k
Transcript
実 践 Dependency Injection PHPメンターズ 後藤 秀宣 @hidenorigoto 1 version
2012.09.15 129݄15༵
後藤秀宣(ごとうひでのり) PHPメンターズ 2 129݄15༵
後藤秀宣(ごとうひでのり) PHPメンターズ • Symfonyユーザー会 2 129݄15༵
後藤秀宣(ごとうひでのり) PHPメンターズ • Symfonyユーザー会 • Symfony Midnight 2 129݄15༵
後藤秀宣(ごとうひでのり) PHPメンターズ • Symfonyユーザー会 • Symfony Midnight • 翻訳温泉ツアー 2
129݄15༵
後藤秀宣(ごとうひでのり) PHPメンターズ • Symfonyユーザー会 • Symfony Midnight • 翻訳温泉ツアー •
WEB+DB PRESS 2 129݄15༵
アジェンダ 1.前提 - DIは必要なのか? 2.Symfony DIコンポーネントの特徴など 3.Symfony DIコンポーネントの使い方実例 4.まとめ 5.(プチ懇親会のお知らせ)
3 129݄15༵
前提 4 129݄15༵
5 129݄15༵
5 ソフトウェア開発 での大きな問題 129݄15༵
6 変更 (にかかるコスト) 129݄15༵
6 変更 (にかかるコスト) バグの修正 129݄15༵
6 変更 (にかかるコスト) バグの修正 機能の追加 129݄15༵
7 129݄15༵
7 変更コスト 129݄15༵
7 変更コスト 複雑性 129݄15༵
7 変更コスト 複雑性 129݄15༵
7 変更コスト 複雑性 依存関係 129݄15༵
7 変更コスト 複雑性 依存関係 依存の明確化 129݄15༵
7 変更コスト 複雑性 依存関係 依存の明確化 依存を減らす 129݄15༵
7 変更コスト 複雑性 依存関係 依存の明確化 依存を減らす 129݄15༵
7 依存関係 129݄15༵
DIは必要なのか? 8 129݄15༵
9 129݄15༵
9 ? 129݄15༵
9 ? 129݄15༵
9 ? 129݄15༵
9 ? 129݄15༵
9 ? 129݄15༵
DIの話? 10 129݄15༵
DIの話? 10 Dependency Injectionパターン 129݄15༵
DIの話? 10 Dependency Injectionパターン DIコンテナ 129݄15༵
DIの話? 11 Dependency Injection パターン DIコンテナ 129݄15༵
DIの話? 11 Dependency Injection パターン DIコンテナ ソフトウェア開発の現場 で問題解決に繰り返し 使われる有用な手法に命名 129݄15༵
DIの話? 11 Dependency Injection パターン DIコンテナ ソフトウェア開発の現場 で問題解決に繰り返し 使われる有用な手法に命名 有用
129݄15༵
DIの話? 11 Dependency Injection パターン DIコンテナ ソフトウェア開発の現場 で問題解決に繰り返し 使われる有用な手法に命名 DIパターン
を適用するための ツール 有用 129݄15༵
DIパターン • 依存オブジェクトは外部から注入される ことを前提とする 12 129݄15༵
DIパターン • 依存オブジェクトは外部から注入される ことを前提とする 12 129݄15༵
DIパターン • 依存オブジェクトは外部から注入される ことを前提とする 12 注入 129݄15༵
DIパターン • 依存オブジェクトは外部から注入される ことを前提とする 12 注入 129݄15༵
DIパターン • 依存オブジェクトは外部から注入される ことを前提とする 12 注入 セッター インジェクション 129݄15༵
DIパターン • 依存オブジェクトは外部から注入される ことを前提とする 12 注入 mailerの生成には 関与しない 129݄15༵
DIコンテナ? 13 129݄15༵
DIコンテナ? 13 ファクトリー 129݄15༵
DIコンテナ? 13 ファクトリー ライフサイクル 129݄15༵
DIコンテナ? 13 ファクトリー ライフサイクル モック 129݄15༵
DIコンテナ? 13 ファクトリー ライフサイクル モック Dependency Injector 129݄15༵
DIコンテナ? 13 ファクトリー ライフサイクル モック Dependency Injector AOP 129݄15༵
DIコンテナ? 14 129݄15༵
DIコンテナ? 14 XMLでオブジェクトの構成を 設定するのは面倒 129݄15༵
DIコンテナ? 14 XMLでオブジェクトの構成を 設定するのは面倒 DIコンテナはいらない。。? 129݄15༵
DIコンテナ? 15 XMLでオブジェクトの構成を 設定するのは面倒 Α͋͘Δצҧ͍ DIコンテナはいらない。。? 129݄15༵
DIコンテナ? 15 XMLでオブジェクトの構成を 設定するのは面倒 Α͋͘Δצҧ͍ DIコンテナはいらない。。? ファクトリー 機能の話 129݄15༵
DIコンテナ? 15 XMLでオブジェクトの構成を 設定するのは面倒 Α͋͘Δצҧ͍ DIコンテナはいらない。。? ファクトリー 機能の話 エディタ問題 129݄15༵
DIコンテナ? 15 XMLでオブジェクトの構成を 設定するのは面倒 Α͋͘Δצҧ͍ DIコンテナはいらない。。? ファクトリー 機能の話 エディタ問題 DSLの問題
129݄15༵
DIコンテナ? 15 XMLでオブジェクトの構成を 設定するのは面倒 Α͋͘Δצҧ͍ DIコンテナはいらない。。? ファクトリー 機能の話 エディタ問題 DSLの問題
DIコンテナの 一つの機能 でしかない 129݄15༵
DIコンテナ? 16 ファクトリー ライフサイクル モック Dependency Injector AOP 129݄15༵
DIコンテナ? 17 129݄15༵
DIコンテナ? 17 • DIパターンを適用するためのツールの1つ 129݄15༵
DIコンテナ? 17 • DIパターンを適用するためのツールの1つ • DIパターン、SOLID原則等を適用していく 場合・・・・必須 129݄15༵
DIコンテナ? 17 • DIパターンを適用するためのツールの1つ • DIパターン、SOLID原則等を適用していく 場合・・・・必須 • 銀の弾丸ではない 129݄15༵
DIコンテナ? 17 • DIパターンを適用するためのツールの1つ • DIパターン、SOLID原則等を適用していく 場合・・・・必須 • 銀の弾丸ではない •
DIコンテナさえ使っていれば良い、とい うわけではない 129݄15༵
DIコンテナ? 17 • DIパターンを適用するためのツールの1つ • DIパターン、SOLID原則等を適用していく 場合・・・・必須 • 銀の弾丸ではない •
DIコンテナさえ使っていれば良い、とい うわけではない • 使う側の理解が重要 129݄15༵
PHPのDI実装 • Symfony Dependency Injection • Zend\Di • Aura.Di •
Ray.Di • Ding • Pimple 18 129݄15༵
Symfony DIコンポーネント の特徴 19 129݄15༵
Symfony DIコンポーネント 20 129݄15༵
Symfony DIコンポーネント • フレームワークSymfonyの基盤として開発 20 129݄15༵
Symfony DIコンポーネント • フレームワークSymfonyの基盤として開発 • 2.0 stableが2011年7月28日にリリース 20 129݄15༵
Symfony DIコンポーネント • フレームワークSymfonyの基盤として開発 • 2.0 stableが2011年7月28日にリリース • 2.1 stable
2012年9月6日 20 129݄15༵
Symfony DIコンポーネント • フレームワークSymfonyの基盤として開発 • 2.0 stableが2011年7月28日にリリース • 2.1 stable
2012年9月6日 • Symfony以外のOSSでも採用されている 20 129݄15༵
Symfony DIコンポーネント 21 129݄15༵
Symfony DIコンポーネント • ドキュメント http://symfony.com/doc/current/components/ dependency_injection/index.html 21 129݄15༵
Symfony DIコンポーネント • ドキュメント http://symfony.com/doc/current/components/ dependency_injection/index.html • GitHub https://github.com/symfony/DependencyInjection 21
129݄15༵
Symfony DIコンポーネント • ドキュメント http://symfony.com/doc/current/components/ dependency_injection/index.html • GitHub https://github.com/symfony/DependencyInjection •
Packagist symfony/dependency-injection 21 129݄15༵
Symfony DIコンポーネント 22 129݄15༵
Symfony DIコンポーネント • DIコンテナの基本機能 • オーソドックスなインジェクション 22 129݄15༵
Symfony DIコンポーネント • DIコンテナの基本機能 • オーソドックスなインジェクション • エクステンション機構 • コンテナのダンプ機能
• コンパイルプロセス 22 129݄15༵
Symfony DIコンポーネント • DIコンテナの基本機能 • オーソドックスなインジェクション • エクステンション機構 • コンテナのダンプ機能
• コンパイルプロセス 22 129݄15༵
Symfony DIコンポーネント • DIコンテナの基本機能 • オーソドックスなインジェクション • エクステンション機構 • コンテナのダンプ機能
• コンパイルプロセス 22 コンポーネントの 粒度で拡張ポイン トを扱う 129݄15༵
Symfony DIコンポーネント • DIコンテナの基本機能 • オーソドックスなインジェクション • エクステンション機構 • コンテナのダンプ機能
• コンパイルプロセス 22 コンポーネントの 粒度で拡張ポイン トを扱う パフォーマンス 向上 129݄15༵
Symfony DIコンポーネント • DIコンテナの基本機能 • オーソドックスなインジェクション • エクステンション機構 • コンテナのダンプ機能
• コンパイルプロセス 22 コンポーネントの 粒度で拡張ポイン トを扱う パフォーマンス 向上 ʂ 129݄15༵
Symfony DIコンポーネント の使い方実例 23 129݄15༵
インストール 24 129݄15༵
インストール • Composer 24 129݄15༵
インストール • Composer 24 129݄15༵
準備 25 129݄15༵
準備 25 129݄15༵
DIコンテナ利用例1 • 一番シンプルな例 26 129݄15༵
DIコンテナ利用例1 • 一番シンプルな例 26 DIコンテナ インスタンス化 129݄15༵
DIコンテナ利用例1 • 一番シンプルな例 26 コンテナに サービスを登録 129݄15༵
DIコンテナ利用例1 • 一番シンプルな例 26 コンテナから サービスインスタ ンスを取得 129݄15༵
DIコンテナ利用例2 27 129݄15༵
27 129݄15༵
27 コンストラクタで 依存オブジェクト を受け取る 129݄15༵
27 コンストラクタの引 数でサービスを渡す 定義 129݄15༵
27 129݄15༵
DIコンテナ利用例3 28 129݄15༵
DIコンテナ利用例3 28 セッターで 依存オブジェクト を受け取る 129݄15༵
DIコンテナ利用例3 28 セッターを呼び出 すよう定義 129݄15༵
サービス定義をYAMLで 29 129݄15༵
30 129݄15༵
30 ここまでは ランタイムのみの話 129݄15༵
31 すべてがランタイム では破綻する 129݄15༵
32 コンテナのダンプ・キャッシュ 129݄15༵
• サービス定義などの読み込みが完了し、 サービスを取り出す準備が完了したコン テナ 32 コンテナのダンプ・キャッシュ 129݄15༵
• サービス定義などの読み込みが完了し、 サービスを取り出す準備が完了したコン テナ • PHPのクラスとしてダンプされる 32 コンテナのダンプ・キャッシュ 129݄15༵
コンテナのダンプ・キャッシュ 33 129݄15༵
34 129݄15༵
34 129݄15༵
コンパイル 35 129݄15༵
コンパイル 35 129݄15༵
コンパイル • 完成形のDIコンテナに変換する処理 • エクステンションやタグなどの処理 • 複数の処理用CompilerPassオブジェクト (CompilerPassInterfaceを実装したクラ ス)へ委譲 •
独自のCompilerPassを用意して処理を差 し込むことが可能 36 129݄15༵
CompilerPass 37 129݄15༵
CompilerPass • コンパイル処理のステージ (CompilerPassの登録時に指定) 38 TYPE_BEFORE_OPTIMIZATION 最適化処理前 TYPE_OPTIMIZE 最適化処理 TYPE_BEFORE_REMOVING
削除処理前 TYPE_REMOVE 削除処理 TYPE_AFTER_REMOVING 削除処理後 129݄15༵
CompilerPass • 例:Symfony/Twigのtwig.extension • サービス定義にタグとして登録 39 129݄15༵
CompilerPass • 例:Symfony/Twigのtwig.extension • サービス定義にタグとして登録 39 129݄15༵
CompilerPass • 例:Symfony/Twigのtwig.extension • サービス定義にタグとして登録 39 129݄15༵
CompilerPass • 例:Symfony/Twigのtwig.extension • サービス定義にタグとして登録 39 129݄15༵
コンパイル 40 129݄15༵
コンパイル • PHPでは意識する必要がなかった「コンパイル」を、再び開発者の手 に 40 129݄15༵
コンパイル • PHPでは意識する必要がなかった「コンパイル」を、再び開発者の手 に • DIコンテナの持つ機能、抽象的なコンパイル 40 129݄15༵
コンパイル • PHPでは意識する必要がなかった「コンパイル」を、再び開発者の手 に • DIコンテナの持つ機能、抽象的なコンパイル • フレームワークの持つ可変性・柔軟性は、ランタイムで動的に必要な わけではない 40
129݄15༵
コンパイル • PHPでは意識する必要がなかった「コンパイル」を、再び開発者の手 に • DIコンテナの持つ機能、抽象的なコンパイル • フレームワークの持つ可変性・柔軟性は、ランタイムで動的に必要な わけではない •
コンパイルにより固定化する 40 129݄15༵
コンパイル • PHPでは意識する必要がなかった「コンパイル」を、再び開発者の手 に • DIコンテナの持つ機能、抽象的なコンパイル • フレームワークの持つ可変性・柔軟性は、ランタイムで動的に必要な わけではない •
コンパイルにより固定化する • コンパイル時に決定できる情報はできるだけコンパイル時に寄せ る 40 129݄15༵
コンパイル • PHPでは意識する必要がなかった「コンパイル」を、再び開発者の手 に • DIコンテナの持つ機能、抽象的なコンパイル • フレームワークの持つ可変性・柔軟性は、ランタイムで動的に必要な わけではない •
コンパイルにより固定化する • コンパイル時に決定できる情報はできるだけコンパイル時に寄せ る • パフォーマンス向上 40 129݄15༵
コンパイル • PHPでは意識する必要がなかった「コンパイル」を、再び開発者の手 に • DIコンテナの持つ機能、抽象的なコンパイル • フレームワークの持つ可変性・柔軟性は、ランタイムで動的に必要な わけではない •
コンパイルにより固定化する • コンパイル時に決定できる情報はできるだけコンパイル時に寄せ る • パフォーマンス向上 • Configコンポーネントなどと組み合わせ、ジェネレーティブプログラ ミングへの道筋となる 40 129݄15༵
まとめ 41 129݄15༵
まとめ 42 129݄15༵
まとめ • DIは、変更に強いクラスを設計するために必須の技術 42 129݄15༵
まとめ • DIは、変更に強いクラスを設計するために必須の技術 • 実践で使われているDIコンテナ実装はすでにある 42 129݄15༵
まとめ • DIは、変更に強いクラスを設計するために必須の技術 • 実践で使われているDIコンテナ実装はすでにある • 過去から蓄積されてきた汎用的な知見を学び、自分のソフトウェ ア開発に取り入れよう 42 129݄15༵
参考 43 アジャイルソフトウェア 開発の奥義(第2版) WEB+DB PRESS vol 71 129݄15༵
44 ありがとうございました http://phpmentors.jp/ 129݄15༵