phpでdiする

60
@secret_hamuhamu PHPDIする

Upload: ohasi-yuki

Post on 17-Jan-2017

11.779 views

Category:

Engineering


4 download

TRANSCRIPT

Page 1: PHPでDIする

@secret_hamuhamu

PHPでDIする

Page 2: PHPでDIする

自己紹介①

名前:大橋 勇希

ニックネーム : はむ

アカウント:@secret_hamuhamu

Page 3: PHPでDIする

自己紹介②

お仕事:Webアプリケーションエンジ二ア

使用言語:主にPHP, Perl, R

設計スタイル:なんちゃってTDD / DDD

Page 4: PHPでDIする

今回のテーマ

Page 5: PHPでDIする

DI

Page 6: PHPでDIする

Dependency Injection

Page 7: PHPでDIする

依存性の注入

Page 8: PHPでDIする

依存性とは?

Page 9: PHPでDIする

あるオブジェクトを

使用するには、

別のオブジェクトが

必要なこと

Page 10: PHPでDIする
Page 11: PHPでDIする

必要なCarクラスを使用するために

Page 12: PHPでDIする

必要な依存しているオブジェクトが存在する

Page 13: PHPでDIする

必要なDependency Lookup

Page 14: PHPでDIする

Dependency Lookup

依存性の探索

Page 15: PHPでDIする

Car

Engine

Handle

Pedal

依存の向き

Page 16: PHPでDIする

Car

Engine

Handle

Pedal

Carクラスが依存しているオブジェクトを探索している

Page 17: PHPでDIする

Dependency Lookup

● 結合度が高い● テストしにくい

Page 18: PHPでDIする

DIを使ったパターン

Page 19: PHPでDIする
Page 20: PHPでDIする

依存しているオブジェクトを注入する

Page 21: PHPでDIする

利用側

Page 22: PHPでDIする

Car

Engine

Handle

Pedal

Page 23: PHPでDIする

Car

Engine

Handle

Pedal

Carクラスに依存しているオブジェクトを注入する

Page 24: PHPでDIする

Dependency Injection

● 疎結合● テスタビリティの向上

Page 25: PHPでDIする

Dependency Injection

実現方法3パターン

Page 26: PHPでDIする

Dependency Injection(1) コンストラクタ・インジェクション

Page 27: PHPでDIする

Dependency Injection(1) コンストラクタ・インジェクション

(2) メソッド・インジェクション

Page 28: PHPでDIする

Dependency Injection(1) コンストラクタ・インジェクション

(2) メソッド・インジェクション

(3) セッタ・インジェクション

Page 29: PHPでDIする

Dependency Injection(1) コンストラクタ・インジェクション

(2) メソッド・インジェクション

(3) セッタ・インジェクション

Page 30: PHPでDIする

Dependency Injectionデメリット

● DI対象クラスの生成コストが高い

● 引数の変更に弱い

Page 31: PHPでDIする

DI対象のクラスを生成するのが大変

利用側

Page 32: PHPでDIする

引数が変更された場合

利用側

Page 33: PHPでDIする

Carクラスの利用者が多ければ変更が大変

利用側

Page 34: PHPでDIする

DIの設定を管理することができれば、解決できる

Page 35: PHPでDIする

DIコンテナ

● 依存性の注入

● インスタンスの生成

一元管理

Page 36: PHPでDIする

DIコンテナ

● Pimple● PHP-DI

etc...

Page 37: PHPでDIする

Car

Engine

Handle

PedalDIコンテナ

依存の向き

Page 38: PHPでDIする

Car

Engine

Handle

PedalDIコンテナ

DIコンテナがクラスのインスタンス生成方法を知っている

依存の向き

Page 39: PHPでDIする

Car

Engine

Handle

PedalDIコンテナ

DIコンテナに登録されるクラスはDIコンテナを知らなくてよい

依存の向き

Page 40: PHPでDIする

Car

Engine

Handle

PedalDIコンテナ依存性の注入を

一元管理

依存の向き

Page 41: PHPでDIする

DIコンテナ利用側

依存の向き

Page 42: PHPでDIする

DIコンテナ利用側利用側は、依存性を知らなくてよい

依存の向き

Page 43: PHPでDIする

利用側

Page 44: PHPでDIする

DIコンテナ

Page 45: PHPでDIする

Carクラスの引数を変更したい

Page 46: PHPでDIする

DIコンテナ

Page 47: PHPでDIする

DIコンテナ

HightEngineに変更するだけでよい

Page 48: PHPでDIする

DIコンテナ

HightEngineに変更するだけでよい

引数の変更が簡単

Page 49: PHPでDIする

ただし、Carクラスに手を入れないといけない

Page 50: PHPでDIする

実装に依存している

Page 51: PHPでDIする

抽象に依存すべき

Page 52: PHPでDIする

依存関係逆転の原則(DIP)

Page 53: PHPでDIする
Page 54: PHPでDIする

抽象であるInterfaceに変更

Page 55: PHPでDIする

DIコンテナ+

テスト

Page 56: PHPでDIする

実装への

依存がなくなり

変更に強い

Page 57: PHPでDIする

まとめ

Page 58: PHPでDIする
Page 59: PHPでDIする

DIしようぜ!!!

Page 60: PHPでDIする

ご清聴ありがとうございました