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
650
「ソフトウェア設計」のドメイン - 「データモデリングでドメインを駆動する」を読んで
hidenorigoto
10
2.7k
メルカリ バックエンド領域のこれまでとこれから
hidenorigoto
1
410
メルカリのエンジニアリング組織の変化〜Engineering Managerの視点から〜
hidenorigoto
0
8k
The changes of the engineering organization in Mercari - from the view of an engineering manager -
hidenorigoto
0
250
PHPerKaigi 2019 ランチセッション (3/31)
hidenorigoto
1
3.9k
抽象化って何? (What is abstraction?)
hidenorigoto
9
4.4k
抽象化って何? (What is abstraction?)
hidenorigoto
11
6.5k
続・SOLIDの原則ってどんなふうに使うの? 〜オープン・クローズドの原則 センパイのコーディングノート編〜
hidenorigoto
14
5.8k
Other Decks in Technology
See All in Technology
AIチャットボット開発への生成AI活用
ryomrt
0
170
複雑なState管理からの脱却
sansantech
PRO
1
140
[CV勉強会@関東 ECCV2024 読み会] オンラインマッピング x トラッキング MapTracker: Tracking with Strided Memory Fusion for Consistent Vector HD Mapping (Chen+, ECCV24)
abemii
0
220
B2B SaaS × AI機能開発 〜テナント分離のパターン解説〜 / B2B SaaS x AI function development - Explanation of tenant separation pattern
oztick139
2
220
Exadata Database Service on Dedicated Infrastructure(ExaDB-D) UI スクリーン・キャプチャ集
oracle4engineer
PRO
2
3.2k
DMARC 対応の話 - MIXI CTO オフィスアワー #04
bbqallstars
1
160
dev 補講: プロダクトセキュリティ / Product security overview
wa6sn
1
2.3k
AWS Lambdaと歩んだ“サーバーレス”と今後 #lambda_10years
yoshidashingo
1
170
100 名超が参加した日経グループ横断の競技型 AWS 学習イベント「Nikkei Group AWS GameDay」の紹介/mediajaws202411
nikkei_engineer_recruiting
1
170
Lexical Analysis
shigashiyama
1
150
スクラム成熟度セルフチェックツールを作って得た学びとその活用法
coincheck_recruit
1
140
開発生産性を上げながらビジネスも30倍成長させてきたチームの姿
kamina_zzz
2
1.7k
Featured
See All Featured
Into the Great Unknown - MozCon
thekraken
32
1.5k
Teambox: Starting and Learning
jrom
133
8.8k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
44
2.2k
Fireside Chat
paigeccino
34
3k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5k
Measuring & Analyzing Core Web Vitals
bluesmoon
4
120
[RailsConf 2023] Rails as a piece of cake
palkan
52
4.9k
Building an army of robots
kneath
302
43k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
720
Building Applications with DynamoDB
mza
90
6.1k
Unsuck your backbone
ammeep
668
57k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
27
4.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༵