Slide 1

Slide 1 text

クラス間の依存関係を無くすメ リット PR TIMES 開発本部 永井陽也

Slide 2

Slide 2 text

自己紹介 永井陽也(ながい はるや) ・好きな言語 PHP(最近の研修でめっちゃ触ってます) ・得意領域 バックエンド ・趣味 ドライブ、Netflix、

Slide 3

Slide 3 text

アジェンダ ・クラス間の依存関係を無くすメリット ・依存関係について ・依存関係の逆転について ・依存性の注入について ・LaravelのFortifyのコードを例にメリットを見ていく ・テストのしやすさについて ・再利用性と保守性が上がることについて ・結論(クラス間の依存関係を無くすメリット)

Slide 4

Slide 4 text

クラス間の依存関係を無くすメリット        ・テストがしやすくなる ・再利用性と保守性が上がる

Slide 5

Slide 5 text

 依存関係・依存関係の逆転・依存性の注入に ついて

Slide 6

Slide 6 text

依存関係について

Slide 7

Slide 7 text

依存関係 クラスAがクラスBに依存している クラスBが ・getMessage()という名前に変更したら ・getMessage()の戻り値の型をstringではなく intにしたら クラスAが求めるものはクラスBによって左右され る

Slide 8

Slide 8 text

依存関係の逆転

Slide 9

Slide 9 text

依存関係の逆転→インターフェースを定義する クラスAが求めるメソッドを定義

Slide 10

Slide 10 text

依存関係の逆転→インターフェースの実装 ・クラスBはインターフェースに依存している ・クラスAはインターフェースによって、抽象化された 依存の向きが クラスA→クラスBから クラスB→インターフェース(クラスA)      依存関係の逆転

Slide 11

Slide 11 text

依存性の注入

Slide 12

Slide 12 text

依存性の注入 呼び出し元からは、 インターフェースを実装したクラスならク ラスAに何でも渡せるように インターフェースによる、クラスAの抽 象化の結果    依存性の注入

Slide 13

Slide 13 text

  LaravelのFortifyというライブラリを例に見ていく

Slide 14

Slide 14 text

Fortifyのユーザ登録機能について ユーザ登録を行うControllerのメソッド →store() ・ユーザをDBに登録する処理 ・ログインする処理 ・レスポンスを生成する処理 今回注目するのは ユーザ情報をDBに登録する処理について →create()

Slide 15

Slide 15 text

依存関係と依存関係の逆転について

Slide 16

Slide 16 text

インターフェースの使用 「ユーザをDBに登録する処理」をインターフェースによって、抽象化している

Slide 17

Slide 17 text

CreateNewUser クラス CreatesNewUsers インターフェース CreateNewUser クラス CreatesNewUsers インターフェース CreateNewUser クラス CreatesNewUsers インターフェース ユーザ登録を行う Controllerクラスの store() ユーザをDBへ登録 するクラス ユーザをDBへ登録 するクラス CreatesNewUsers インターフェース ユーザ登録を行う Controllerクラスの store() インターフェースによって依存関係の逆転

Slide 18

Slide 18 text

テストのしやすさについて

Slide 19

Slide 19 text

ユーザ登録機能のテストについて ユーザー登録ができるかどうかのテス ト (Controllerのstore()のテスト) インターフェースを定義しているからこそmockができます

Slide 20

Slide 20 text

依存関係の逆転をしていないと。。

Slide 21

Slide 21 text

インターフェースを使って依存関係を逆転させていないと もしある特定のクラスに依存している場 合 つまり、store()のテストを書く際に意識しなく て良い部分も意識することに。。 振る舞いを自由に定義できない mock化できない テストのしやすさ↓ CreateNewUserというクラ スに依存している 依存性の注入できない

Slide 22

Slide 22 text

インターフェースを使って依存関係を逆転させ、 依存性の注入を使うと。。

Slide 23

Slide 23 text

依存関係を無くすことで、テストがしやすくなる インターフェースを使うことでstore()は、 store()のテストでユーザをDBに登録する処理を意 識せずにstore()のテストだけに集中できるように テストのしやすさ↑ 「ユーザをDBに登録する処理」ついて依存関係 を無くすことができた →依存関係の逆転 振る舞いを自由に決めmockにすることができる →依存性の注入

Slide 24

Slide 24 text

再利用性と保守性について

Slide 25

Slide 25 text

Fortifyのユーザ登録機能について(再喝) ユーザ登録を行うControllerのメソッド →store() ・ユーザをDBに登録する処理 ・ログインする処理 ・レスポンスを生成する処理 今回注目するのは ユーザ情報をDBに登録する処理について →create()

Slide 26

Slide 26 text

依存関係の逆転をしていないと。。

Slide 27

Slide 27 text

インターフェースを使って依存関係を逆転させていないと もしある特定のクラスに依存してい る場合 依存しているクラス以外を使う際は毎 回store()にまで変更を加える必要ある store()は常に依存しているクラスの 変更を意識しなければならない 再利用性↓ 保守性↓ CreateNewUserというクラ スに依存している 依存性の注入もできない

Slide 28

Slide 28 text

インターフェースを使って依存関係を逆転させ、 依存性の注入を使うと

Slide 29

Slide 29 text

依存関係を無くすことで、再利用性と保守性が上がる インターフェースがあることで、 store()が求めるものが変更されない限り、影響を受け ることがなくなった →依存関係の逆転 ・変更の影響範囲については インターフェースだけ意識すれば良い 保守性↑ 再利用性↑ ・「ユーザをDBに登録する処理」について、 インターフェースを実装するクラスなら何でも注入 (依存性の注入)できるようになった store()は

Slide 30

Slide 30 text

クラス間の依存関係を無くすメリット(再喝) ・テストがしやすくなる ・再利用性と保守性が上がる インターフェースを使って依存関係を逆転させ、 依存性の注入を使うと

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

参考文献 イラストで理解するSOLID原則 https://qiita.com/baby-degu/items/d058a62f145235a0f007 猿でも分かる! Dependency Injection: 依存性の注入 https://qiita.com/hshimo/items/1136087e1c6e5c5b0d9f 依存性の逆転のいちばんわかりやすい説明 https://zenn.dev/naas/articles/c743a3d046fa78 Fortifyのリポジトリ(Git Hub) https://github.com/laravel/fortify/tree/07fb77dc2a0a1c9dee9612ad61c3d9901f87ba71 依存性の注入(DI)とは?決済機能で活用してみた https://juno-engineer.com/article/laravel-dependency-injection/ 保守性と再利用性 https://banpeisya.com/2021/06/16/%E4%BF%9D%E5%AE%88%E6%80%A7%E3%81%A8%E5%86%8D%E5%88%A9%E7%94%A8%E6%80%A7% E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E8%80%83%E3%81%88%E3%81%A6%E3%81%BF%E3%82%8B/