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.4k
実践Dependency Injection
PHPカンファレンス2012 実践Dependency Injectionスライド
hidenorigoto
September 15, 2012
Tweet
Share
More Decks by hidenorigoto
See All by hidenorigoto
ドメインと向き合う - 旅行予約編
hidenorigoto
4
900
「ソフトウェア設計」のドメイン - 「データモデリングでドメインを駆動する」を読んで
hidenorigoto
9
3.1k
メルカリ バックエンド領域のこれまでとこれから
hidenorigoto
1
520
メルカリのエンジニアリング組織の変化〜Engineering Managerの視点から〜
hidenorigoto
0
8.3k
The changes of the engineering organization in Mercari - from the view of an engineering manager -
hidenorigoto
0
310
PHPerKaigi 2019 ランチセッション (3/31)
hidenorigoto
1
4.1k
抽象化って何? (What is abstraction?)
hidenorigoto
9
4.6k
抽象化って何? (What is abstraction?)
hidenorigoto
11
6.9k
続・SOLIDの原則ってどんなふうに使うの? 〜オープン・クローズドの原則 センパイのコーディングノート編〜
hidenorigoto
14
6k
Other Decks in Technology
See All in Technology
Geminiとv0による高速プロトタイピング
shinya337
0
180
GitHub Copilot の概要
tomokusaba
1
140
Oracle Audit Vault and Database Firewall 20 概要
oracle4engineer
PRO
3
1.7k
Node-RED × MCP 勉強会 vol.1
1ftseabass
PRO
0
170
Liquid Glass革新とSwiftUI/UIKit進化
fumiyasac0921
0
300
2025-06-26_Lightning_Talk_for_Lightning_Talks
_hashimo2
2
110
事業成長の裏側:エンジニア組織と開発生産性の進化 / 20250703 Rinto Ikenoue
shift_evolve
PRO
1
100
Core Audio tapを使ったリアルタイム音声処理のお話
yuta0306
0
150
監視のこれまでとこれから/sakura monitoring seminar 2025
fujiwara3
11
4k
PHP開発者のためのSOLID原則再入門 #phpcon / PHP Conference Japan 2025
shogogg
4
920
生成AI時代 文字コードを学ぶ意義を見出せるか?
hrsued
1
680
開発生産性を組織全体の「生産性」へ! 部門間連携の壁を越える実践的ステップ
sudo5in5k
0
240
Featured
See All Featured
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.8k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Visualization
eitanlees
146
16k
Java REST API Framework Comparison - PWX 2021
mraible
31
8.7k
The Cult of Friendly URLs
andyhume
79
6.5k
A Modern Web Designer's Workflow
chriscoyier
694
190k
Designing Experiences People Love
moore
142
24k
Facilitating Awesome Meetings
lara
54
6.4k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
940
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
5
230
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.3k
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༵