学習時間 | 10時間 |
---|---|
難易度 | 中級 |
質問投稿 | 可 |
Laravel で Fat Controller をリファクタリングしよう
あらかじめFat Controllerで開発されたソースコードをリファクタリングしながら、実践的なクラス設計を学べる教材です。ユースケースの実装から始めてMiddlewareやFormRequestといったLaravelの機能の活用、サービスコンテナの理解と応用、テストコードの実装と自動化までカバー
✍️ 更新情報
2022年12月 M1 Macに対応した環境構築手順について追記
2021年10月 【FAQ】Modelごとにユースケースを作るのはだめですか? を追記しました
2021年7月 【FAQ】処理を移行したらどのような処理が行われているかわからなくなりました... を追記しました
ソースコードの品質、おろそかにしていませんか?
Laravel や AWS、React といった技術を次々学ぶことに夢中になって、肝心のソースコードの品質を上げることがおろそかになっていませんか?
新しい技術を学ぶことや、とりあえずポートフォリオとして完成させることを目的として開発すると、「動けば良い状態」でリリースしてしまいがちです。
しかし、実務で開発するときは「チーム開発を意識した品質で」ソースコードを書く必要があります。
筆者はスタートアップで CTO を務めており、エンジニア採用に関わることも多いです。エンジニア採用においても、いかにソースコードの品質を高く、実務で複雑な要件をチーム開発で実装できるかを見る傾向にあるように感じています。
実際にコーディングテストと題して、低品質なソースコードをリファクタリングしていくような課題が出されているケースも見受けられます。
低品質なソースコードの代表的な例として、Fat Controllerが挙げられます。
Fat Controller とは、Laravel 等の Web フレームワークに用意されている Controller に、要件を満たすためのあらゆる実装を書き込んでいる状態です。
筆者自身もスタートアップに転職した当初はソースコードの質を意識せずに実装していたため、半年を経過した頃にはカオスな状態になっていました。
- Controller に全部処理を詰め込んだFat Controllerを始め、どんなクラスに何を実装すべきか統一されていなかった
- そのため、新しい機能を実装したときに、関係なさそうな別の機能に悪影響(デグレ)が起きたり、逆に意図したように動かないこともあった
- テストコードを書いていなかったので、既存のソースコードの動作や仕様を確認するのが大変で、漏れもあった
品質を上げる、って具体的にどういうこと?
ソースコードの品質を上げると言われても、具体的にどういうことかイメージがわかない方も多いと思います。
筆者が前節で挙げたカオスな状態を改善するためにやったことは、例えば以下のような内容でした。
- Controller や Model といった Laravel 標準で用意されるクラス以外に、要件ごとの処理を書くためのクラスを作った
- 外部サービスやデータベースへのアクセスを Interface を用いて抽象化した
- テストコードを必ず書くようにして、テストコードを書きやすい設計に移行していった
これらの改善を通して、Web とアプリで共通して使われる API の開発や、多様なパターンの決済ロジックの実装といったさまざまな要件を保守性を保ったまま実装できました。
本教材では、そんな筆者がわざと Fat Controller で実装したアプリケーションをリファクタリングしていきながら、最終的にはテストコードの自動化まで行います。
品質を上げるための手法として「クラスの切り分け」「Laravel の機能の活用」、そして品質を保つための手法として「テストコードの実装」まで一気通貫で解説しています。
もちろんただ正解を示すだけではありません。その都度、実装されているコードの問題点を提示し、解決策によってどのような利点が得られるかを説明しますので、何が問題なのかしっかり理解して進めることができます。
ソースコードの設計手法は事業や組織体制に応じて柔軟に選ばれるべきであり、唯一の正解はありません。そのため本教材では最低限これを知っていると Fat Controller に立ち向かえる Tips を詰め込みました。本教材の内容をマスターすれば以前の筆者と同じ道をたどることはないでしょう。
本教材の特長
実際にソースコードをリファクタリングできる
本教材の一番の特長は、実際にソースコードをリファクタリングできるところです。大半の既存の教材では、完成されたソースコードを見ることしかありません。本教材では Fat Controller なソースコードとリファクタリング後のソースコードを見比べることができるため、より理解が深まると考えていますし、これまで筆者が実務でよく見たパターンを効率的に解説することができました。
順を追って実務レベルに近いところまでステップアップできる
最初は Controller からシンプルに処理を別のクラスに切り出すところからスタートします。そこから順を追ってサービスコンテナを活用したモック化、PHPUnit を用いたテストコードの実装と GitHub Actions による自動化といった実務でも頻出のテクニックまで解説します。かなり高いレベルの内容まで学べて、順に解説しているのでさまざまなレベルの方に楽しんで頂ける教材です。
学習内容
- Fat Controller について理解しよう
- リファクタリングするソースコード
- Fat Controller の特徴と問題点
- ユースケースを作って処理を引っ越ししよう
- ユースケースを実装する目的
- ディレクトリ(namespace)の決め方
- 実装内容と Controller からの引っ越し
- Laravel の機能を使ってリファクタリングしよう
- Fat な Controller が抱えている責任の多さについて
- FormRequest と Middleware を使ったリファクタリング
- リファクタリングの Before/After を比較する
- インターフェースとサービスコンテナについて理解しよう
- 外部サービスへアクセスする処理のテスタビリティ
- 既存処理に対するインターフェースの実装
- サービスコンテナを通して”バインド”する
- モック用のクラスの実装
- テストコードを実装しよう
- PHPUnit を用いたテストコードの実装
- サービスコンテナを使ったモック化
- GitHub Actions による自動化
- 【総集編】テストコードを書きながらリファクタリングしよう
作成物のイメージ
本教材の対象者
- Laravel で1,2個アプリケーションを開発したことがある方
- リファクタリングしたりテストコードを実装する必要性がよくわからない方
- Laravel の基本的な機能は知っているが、サービスコンテナを自分で使いこなしたことはない方
- クラスは扱ったことはあるが、インターフェースや抽象クラスについては、よくわからない方
受講における必要条件
本教材は、以下のような技術レベルの方を対象読者としています。
- PHP の基本的な文法を理解している(if 文、for 文、配列、関数の宣言の仕方、コンストラクタの書き方などは知っている)
- Laravel を用いて個人または実務でアプリケーション開発の経験がある(blade ファイルの書き方、routes/web.php 等の書き方、Model を使ってデータベースからデータを取得する方法などを知っている)
学ばないこと
- HTML や CSS の書き方(サンプルアプリケーションはそれなりに CSS を当てていますが、解説は特にしません)
- SQL の書き方(Laravel が提供するクエリビルダを使って SQL を実行します)
- サービスのデプロイ、公開方法(本教材のアプリケーションはローカル環境でしか動作しません)
- ドメイン駆動設計やクリーンアーキテクチャ(それらのアーキテクチャを学ぶ前段階として、責務ごとにクラスを切り分けること、テストコードを書くことを徹底して学びます)
本教材の対応バージョン
- Laravel 6 系
- PHP 7.4 系
※Dockerにて環境構築します
※リファクタリングをテーマとした教材のため、普段お使いのLaravelやPHPのバージョンと違っていても問題のない内容となっております
本教材で質問対応可能な OS や環境
- Mac OS
- Docker for Mac
- Chrome
本教材は Mac OS でのみ動作確認をしております。
Docker で環境構築をしますので、Docker for Mac のインストールは必須です。詳細は対応する章にて解説します。
また、本教材で扱っていないフレームワークや言語におけるリファクタリングについての質問や、実務などソースコードや詳細な要件を開示できない状況、および本教材で解説した範囲以外での質問にはお答えできません。
カリキュラム
- 1-1 今回リファクタリングする Fat Controller の処理を読んでみよう
- 1-2 「ユースケース」を作る目的
- 1-3 「ユースケース」を置くディレクトリを作ろう
- 1-4 「ユースケース」クラスを作ろう
- 1-5 「ユースケース」に処理を引っ越ししよう
- 1-6 【FAQ】Modelごとにユースケースを作るのはだめですか?