Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
依存関係 と 依存オブジェクト注入 株式会社ユニクエスト 長谷川広樹 github.com/hiroki-it @Hiroki__IT
Slide 2
Slide 2 text
自己紹介 ▼ お仕事 最近:クラウドインフラ、IaC、CICD、... 以前:DDD ▼ 関心のある技術領域 ・クラウドインフラ ・IaC ・DDD github.com/hiroki-it @Hiroki__IT 長谷川 広樹 (はせがわ ひろき) 株式会社ユニクエスト
Slide 3
Slide 3 text
目次 ■ なぜ,我々は依存関係を理解する必要がある? ■ 依存(Dependency) ■ 依存とは別視点のオブジェクト間関係性 ■ 合成(Composition) ■ 集約(Aggregation) ■ 依存オブジェクト注入(Dependency Injection) ■ 依存オブジェクト注入の種類 ■ 依存オブジェクト注入コンテナ(DIコンテナ) ■ 余談:ドメイン駆動設計のアーキテクチャがわかるぞ! ■ 『依存性逆転の原則』についてはまた今度
Slide 4
Slide 4 text
なぜ,我々は依存関係を理解する必要がある? オブジェクト間の依存関係を 意識しながら 実装されてますでしょうか??
Slide 5
Slide 5 text
なぜ,我々は依存関係を理解する必要がある? 基本的なMVCから始まりアーキテクチャには オブジェクト間の依存関係を工夫して 保守性の高いシステムを開発しようとする思想がある ⇓ 依存関係を理解しなければ アーキテクチャを正しく使えない!(持論)
Slide 6
Slide 6 text
依存(Dependency) ■ 依存とは クラスAがクラスBを引数/返却値として使用 ⇓ 『 A 』は『B 』に依存 ■ クラス図における依存 (例)UserクラスはUserNameクラスを使用 getName(); } }
Slide 7
Slide 7 text
依存から少し離れて補足
Slide 8
Slide 8 text
依存とは別視点のオブジェクト間関係性 ■ 合成と集約 クラスAがクラスBを『データとして保持』. ⇓ 『 A』と『B 』は 合成(Composition)/集約(Aggregation)の関係を持つ ■ 両者の異なる点 クラスAによって,クラスBのインスタンス生成がどのように制限される かで分類
Slide 9
Slide 9 text
合成(Composition) ■ 合成 クラスBはAありきで生成される ■ クラス図における合成 (例)UserNameはUserありきで生成 getName(); } }
Slide 10
Slide 10 text
集約(Aggregation) ■ 集約 クラスBはAと無関係に生成される関係 ■ クラス図における集約 (例)UserNameはUserとは無関係に生成 name = $name; } }
Slide 11
Slide 11 text
依存の話に戻ります
Slide 12
Slide 12 text
依存(Dependency) ■ 依存とは クラスAがクラスBを引数/返却値として使用 ⇓ 『 A 』は『B 』に依存 ■ クラス図における依存 (例)UserクラスはUserNameクラスを使用 getName(); } }
Slide 13
Slide 13 text
依存オブジェクト注入(Dependency Injection) ■ 依存オブジェクト注入とは クラスAに『引数として』クラスBに渡すこと. ■ 依存性注入と訳さないこと 『依存性を注入する』 が概念を適切に説明していないという問題 ⇓ 『依存対象のオブジェクトを注入する』 = 依存オブジェクト注入 https://little-hands.hatenablog.com/entry/2018/05/27/dependency-injection
Slide 14
Slide 14 text
依存オブジェクト注入の種類(1) ■ コンストラクタインジェクション(優勝!!!) constructメソッド経由で依存対象を渡す. ■ メリット constructメソッドはインスタンス生成時のみ有効. ⇓ セッターを完全に無くした場合に インスタンス生成後に状態を変更不可能. ⇓ 不変的な(Immutable)オブジェクト ⇓ より安全なシステム name = $name; } }
Slide 15
Slide 15 text
依存オブジェクト注入の種類(2) ■ セッターインジェクション セッターメソッド経由で依存対象を渡す. ■ デメリット インスタンス生成後にオブジェクトの状態を変更可能 ⇓ 可変的な(Mutable)オブジェクト ⇓ ビジネス上ありえない状態のオブジェクトを作れる. ⇓ セキュリティに穴のあるシステム name = $name; } } setUserName($name); // インジェクション
Slide 16
Slide 16 text
依存オブジェクト注入の種類(3) ■ メソッドインジェクション constructメソッドまたはセッター以外で依存対象 を渡す. ■ デメリット セッターインジェクションと同じ. ■ ただし セッターと同じように使うわけではなければ,用途 によっては問題はない. (コンストラクタインジェクションしか勝たん!) getName(); // 何らかの処理 } } method($name); // インジェクション
Slide 17
Slide 17 text
依存オブジェクト注入の種類(4) インターフェースインジェクションは割愛...
Slide 18
Slide 18 text
依存オブジェクト注入コンテナ(DIコンテナ) ■ DIコンテナとは ・依存オブジェクト注入に特化したデザインパターン. ・多くの言語で必須パターンになっている. ■ PHP ・Pimpleライブラリ ・LaravelのServiceContainer機能 ■ Go(ただしGoでは,DIコンテナが黒魔術扱い) ・Google製のWireライブラリ ・Uber製のDigライブラリ
Slide 19
Slide 19 text
余談:ドメイン駆動設計のアーキテクチャがわかるぞ!(1) ■ オニオンアーキテクチャ(@little_hand_s さんの資料がおすすめ) ・依存関係が,ビジネスロジックを置くドメイン層に向かうように実装. ・ドメイン層は,それ以外のロジック層や外部ライブラリに一切依存しない. little hands' lab(https://little-hands.hatenablog.com/entry/2017/10/11/075634)
Slide 20
Slide 20 text
余談:ドメイン駆動設計のアーキテクチャがわかるぞ!(2) ■ クリーンアーキテクチャ(@nrslib さんの資料がオススメ) ・依存関係が,ビジネスロジックを置くエンティティ層に向かうように実装. ・エンティティ層は,それ以外の層や外部ライブラリに一切依存しない. https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html
Slide 21
Slide 21 text
『依存性逆転の原則』についてはまた今度 『依存性逆転の原則』 抽象(インターフェース)に依存するように実装する思想 話が長くなるのでまた今度...
Slide 22
Slide 22 text
最後に テーマと関係ないけど Gopherくん超かわいい!!! by Takuya Ueda (https://twitter.com/tenntenn) The Gopher character is based on the Go mascot designed by Renée French.