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
WACATE2024冬セッション資料(ユーザビリティ)
scarletplover
0
200
非機能品質を作り込むための実践アーキテクチャ
knih
5
1.3k
Wvlet: A New Flow-Style Query Language For Functional Data Modeling and Interactive Data Analysis - Trino Summit 2024
xerial
1
120
ブラックフライデーで購入したPixel9で、Gemini Nanoを動かしてみた
marchin1989
1
530
Amazon SageMaker Unified Studio(Preview)、Lakehouse と Amazon S3 Tables
ishikawa_satoru
0
150
5分でわかるDuckDB
chanyou0311
10
3.2k
re:Invent をおうちで楽しんでみた ~CloudWatch のオブザーバビリティ機能がスゴい!/ Enjoyed AWS re:Invent from Home and CloudWatch Observability Feature is Amazing!
yuj1osm
0
120
組織に自動テストを書く文化を根付かせる戦略(2024冬版) / Building Automated Test Culture 2024 Winter Edition
twada
PRO
13
3.7k
ガバメントクラウドのセキュリティ対策事例について
fujisawaryohei
0
530
ゼロから創る横断SREチーム 挑戦と進化の軌跡
rvirus0817
2
270
統計データで2024年の クラウド・インフラ動向を眺める
ysknsid25
2
840
Oracle Cloud Infrastructure:2024年12月度サービス・アップデート
oracle4engineer
PRO
0
180
Featured
See All Featured
Navigating Team Friction
lara
183
15k
Imperfection Machines: The Place of Print at Facebook
scottboms
266
13k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
44
9.3k
We Have a Design System, Now What?
morganepeng
51
7.3k
Typedesign – Prime Four
hannesfritz
40
2.4k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
2
290
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
1.9k
A better future with KSS
kneath
238
17k
Building Adaptive Systems
keathley
38
2.3k
For a Future-Friendly Web
brad_frost
175
9.4k
Optimising Largest Contentful Paint
csswizardry
33
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༵