phpでdiする
TRANSCRIPT
@secret_hamuhamu
PHPでDIする
自己紹介①
名前:大橋 勇希
ニックネーム : はむ
アカウント:@secret_hamuhamu
自己紹介②
お仕事:Webアプリケーションエンジ二ア
使用言語:主にPHP, Perl, R
設計スタイル:なんちゃってTDD / DDD
今回のテーマ
DI
Dependency Injection
依存性の注入
依存性とは?
あるオブジェクトを
使用するには、
別のオブジェクトが
必要なこと
必要なCarクラスを使用するために
必要な依存しているオブジェクトが存在する
必要なDependency Lookup
Dependency Lookup
依存性の探索
Car
Engine
Handle
Pedal
依存の向き
Car
Engine
Handle
Pedal
Carクラスが依存しているオブジェクトを探索している
Dependency Lookup
● 結合度が高い● テストしにくい
DIを使ったパターン
依存しているオブジェクトを注入する
利用側
Car
Engine
Handle
Pedal
Car
Engine
Handle
Pedal
Carクラスに依存しているオブジェクトを注入する
Dependency Injection
● 疎結合● テスタビリティの向上
Dependency Injection
実現方法3パターン
Dependency Injection(1) コンストラクタ・インジェクション
Dependency Injection(1) コンストラクタ・インジェクション
(2) メソッド・インジェクション
Dependency Injection(1) コンストラクタ・インジェクション
(2) メソッド・インジェクション
(3) セッタ・インジェクション
Dependency Injection(1) コンストラクタ・インジェクション
(2) メソッド・インジェクション
(3) セッタ・インジェクション
Dependency Injectionデメリット
● DI対象クラスの生成コストが高い
● 引数の変更に弱い
DI対象のクラスを生成するのが大変
利用側
引数が変更された場合
利用側
Carクラスの利用者が多ければ変更が大変
利用側
DIの設定を管理することができれば、解決できる
DIコンテナ
● 依存性の注入
● インスタンスの生成
一元管理
DIコンテナ
● Pimple● PHP-DI
etc...
Car
Engine
Handle
PedalDIコンテナ
依存の向き
Car
Engine
Handle
PedalDIコンテナ
DIコンテナがクラスのインスタンス生成方法を知っている
依存の向き
Car
Engine
Handle
PedalDIコンテナ
DIコンテナに登録されるクラスはDIコンテナを知らなくてよい
依存の向き
Car
Engine
Handle
PedalDIコンテナ依存性の注入を
一元管理
依存の向き
DIコンテナ利用側
依存の向き
DIコンテナ利用側利用側は、依存性を知らなくてよい
依存の向き
利用側
DIコンテナ
Carクラスの引数を変更したい
DIコンテナ
DIコンテナ
HightEngineに変更するだけでよい
DIコンテナ
HightEngineに変更するだけでよい
引数の変更が簡単
ただし、Carクラスに手を入れないといけない
実装に依存している
抽象に依存すべき
依存関係逆転の原則(DIP)
抽象であるInterfaceに変更
DIコンテナ+
テスト
実装への
依存がなくなり
変更に強い
まとめ
DIしようぜ!!!
ご清聴ありがとうございました