PHPerKaigi 2023 day2 TrackA 12:10〜のセッションスライドです。 https://fortee.jp/phperkaigi-2023/proposal/afd2bc66-c65c-40e2-be51-ac2ad4c5a26d
オブジェクト指向に基づいたユニットテストのメリットPHPerKaigi 2023 伊神誠人(Makoto Ikami)
View Slide
自己紹介● 伊神 誠人● 株式会社カルテットコミュニケーションズ● 開発部○ バックエンドエンジニア(PHP, Symfony)○ 最近はWeb広告のAPIをPHPで叩いている● Webマーケターの経験(広告運用・サイト分析)● SNS○ GitHub:@mako5656○ Twitter:@mako5656_i
本発表の構成オブジェクト指向とユニットテスト12 デザインパターンDependency Injectin(DI)3まとめ4
話すこと/話さないこと● 話すこと○ テストを書くにあたってオブジェクト指向・デザインパターン・DIを使用しているとそれぞれどのようなメリットがあるか● 話さないこと○ 各用語についての詳細○ Web広告について
オブジェクト指向とユニットテスト
オブジェクト指向とユニットテストの概要● オブジェクト指向プログラムを構成する部品(オブジェクト)という単位に分割する方法● ユニットテストプログラムの小さな部品を自動的にテストする方法
参考:http://objectclub.jp/technicaldoc/object-orientation/OO_redefine/redefine07分割した場合分割しない場合オブジェクトごとに分割しない/した場合
オブジェクトごとに分割した場合のメリット『保守性』 と 『拡張性』 が向上オブジェクトごとが疎結合になり『責務』が明確になるテストとしても変更や追加に伴って修正が必要な箇所を特定しやすくなる
デザインパターン
デザインパターンの概要ソフトウェア開発の共通の課題を解決するための設計手法を集めたもの経験則に基づく知識を体系化したもので、ソフトウェア開発における設計の問題を解決する際に利用される
デザインパターンを使用しない場合FizzBuzz問題● 1からNまでの数字を繰り返し処理● 3で割り切れる場合は「Fizz」● 5で割り切れる場合は「Buzz」● 3でも5でも割り切れる場合は「FizzBuzz」● それ以外はその数字
今回使用するデザインパターン● Strategyパターン複数の解決策を用意して必要に応じて切り替えることで柔軟性を持たせるデザインパターン実行時にストラテジーを切り替えることができ、メンテナンス性も高くなる
デザインパターン(Strategyパターン)を使用した場合
デザインパターン(Strategyパターン)を使用した場合インターフェースを定義文字列を生成するために実行されるアルゴリズムをカプセル化するために使用
デザインパターン(Strategyパターン)を使用した場合FizzStrategyクラス:3で割り切れる場合BuzzStrategyクラス:5で割り切れる場合
デザインパターン(Strategyパターン)を使用した場合引数として渡された数字に対する出力を生成
デザインパターン(Strategyパターン)を使用した場合ループを使用して指定された値までルールに従って文字列を生成
デザインパターンを使用しない/した場合の比較● 使用しない場合 ● 使用した場合
デザインパターンを使用しない/した場合の比較● 使用しない場合 ● 使用した場合より多くのテストを書く必要がでてきたり、出力が大量になった場合テストが困難になる
デザインパターンを使用しない/した場合の比較● 使用しない場合 ● 使用した場合FizzStrategyとBuzzStrategyクラスは独自にテストすることができ、FizzBuzzクラスのテストも簡単
デザインパターンを使用しない/した場合の比較● 使用しない場合 ● 使用した場合FooStrategyの追加とFizzBuzzクラスに追加するだけで簡単に拡張可能
デザインパターンを使用することによるメリット● 柔軟性と再利用性の向上新たなルールの追加する場合に既存のコードの影響を与えず追加可能機能の追加、変更、削除が容易になることから、開発プロセスが迅速になる● コードの可読性を高める設計や実装が一貫性を持つためコードの理解がしやすくなる
Dependency Injection (DI)
Dependency Injection (DI)の概要依存関係のあるオブジェクトを外部から注入することにより、オブジェクトの結合度を低くし柔軟性を高める手法DIは制御の反転の一種で、オブジェクトの作成と利用について関心の分離を行い、疎結合なプログラムを実現することを目的としている
DIを使用しない/した場合● 使用しない場合 ● 使用した場合
DIを使用しない/した場合● 使用しない場合 ● 使用した場合テストコード
DIを使用しない/した場合● 使用しない場合 ● 使用した場合実装コード
DIを使用しない場合
DIを使用しない場合Calculatorクラスを直接インスタンス化して、addメソッドを呼び出し外部依存を持つ場合は、テストが困難になることがある
DIを使用しない/した場合の比較● 使用しない場合 ● 使用した場合
DIを使用した場合
DIを使用した場合CalculatorクラスがLoggerクラスに依存していると仮定し、コンストラクタでLoggerオブジェクトを受け取っている
DIを使用した場合TestLoggerクラスを作成して、それをCalculatorクラスのコンストラクタに渡すテストをより疎結合にし、外部依存によるテストの困難さを解決することができる
DIを使用することによるメリット● コードの保守性や拡張性が向上依存関係が柔軟になることで、コンポーネントを簡単に交換できるようになるコードの記述量も減り可読性も向上する● テストのしやすさが向上テスト時に依存するコンポーネントをモックオブジェクトに置き換えることができるようになるこれにより、テストコードが単純化しテストの作成や実行が容易になる
まとめ
まとめ● テストを書くにあたってオブジェクト指向・デザインパターン・DIを使用しているとそれぞれどのようなメリットがあるか⇛ 効率的かつ品質の高いコードを実現⇛ テストとしても書きやすくなり効率性が向上● テストはあくまで品質を担保するための手段
サービス紹介
ご清聴ありがとうございました