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
860
「ソフトウェア設計」のドメイン - 「データモデリングでドメインを駆動する」を読んで
hidenorigoto
9
3k
メルカリ バックエンド領域のこれまでとこれから
hidenorigoto
1
490
メルカリのエンジニアリング組織の変化〜Engineering Managerの視点から〜
hidenorigoto
0
8.2k
The changes of the engineering organization in Mercari - from the view of an engineering manager -
hidenorigoto
0
300
PHPerKaigi 2019 ランチセッション (3/31)
hidenorigoto
1
4k
抽象化って何? (What is abstraction?)
hidenorigoto
9
4.5k
抽象化って何? (What is abstraction?)
hidenorigoto
11
6.9k
続・SOLIDの原則ってどんなふうに使うの? 〜オープン・クローズドの原則 センパイのコーディングノート編〜
hidenorigoto
14
6k
Other Decks in Technology
See All in Technology
DynamoDB のデータを QuickSight で可視化する際につまづいたこと/stumbling-blocks-when-visualising-dynamodb-with-quicksight
emiki
0
150
ソフトウェアテスト 最初の一歩 〜テスト設計技法をワークで体験しながら学ぶ〜 #JaSSTTokyo / SoftwareTestingFirstStep
nihonbuson
PRO
1
150
製造業向けIoTソリューション提案資料.pdf
haruki_uiru
0
250
ユーザーコミュニティが海外スタートアップのDevRelを補完する瞬間
nagauta
0
180
事業と組織から目を逸らずに技術でリードする
ogugu9
4
150
猫でもわかるS3 Tables【Apache Iceberg編】
kentapapa
2
190
非root化Androidスマホでも動く仮想マシンアプリを試してみた
arkw
0
120
Part1 GitHubってなんだろう?その2
tomokusaba
2
750
Docker Compose で手軽に手元環境を実現する / Simplifying Local Environments with Docker Compose #CinemaDeLT
nabeo
0
110
CARTA HOLDINGS エンジニア向け 採用ピッチ資料 / CARTA-GUIDE-for-Engineers
carta_engineering
0
27k
OPENLOGI Company Profile for engineer
hr01
1
26k
genspark_presentation.pdf
haruki_uiru
1
250
Featured
See All Featured
The Cost Of JavaScript in 2023
addyosmani
49
7.8k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.2k
YesSQL, Process and Tooling at Scale
rocio
172
14k
Raft: Consensus for Rubyists
vanstee
137
6.9k
Building Better People: How to give real-time feedback that sticks.
wjessup
368
19k
Building an army of robots
kneath
305
45k
The Cult of Friendly URLs
andyhume
78
6.3k
Being A Developer After 40
akosma
91
590k
Scaling GitHub
holman
459
140k
Git: the NoSQL Database
bkeepers
PRO
430
65k
The Pragmatic Product Professional
lauravandoore
33
6.6k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
34
2.2k
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༵