スタイル・エッジ技術ブログ

士業集客支援/コンサルティングのスタイル・エッジのエンジニアによるブログです。

Laravelでファットコントローラーを防ぎたい

はじめに

こんにちは!スタイル・エッジLABOのZNです。
2022年が始まったと思えば、もう2ヶ月が経ってしまいました。
エンジニアLIFEは、時間の流れが早いように感じます。

私は約8ヶ月前に未経験でエンジニアとして「スタイル・エッジLABO」に入社しました。
未経験でのエンジニアへの挑戦だったので、面接にはポートフォリオを持参し挑みました。
ポートフォリオはLaravelというフレームワークを使用して、チャットのようなものを作成したのを覚えています。
入社から8ヶ月経った今、そのポートフォリオの中身を見ると「ザ・ファットコントローラー」だったので、Laravelでファットコントローラーを防ぐ秘訣について少し紹介できればと思います!

そもそもファットコントローラーとは何...?

Laravelなどのフレームワークで用いられているコントローラーに様々な処理を任せてしまい、1つのコントローラー内、1つのメソッド内の行数が多くなってしまって肥大化していることを指します。

では、何が問題なのかをいくつか挙げてみます。

はじめに、「どこに処理を記述したかが分かりにくく、コードを追いにくい」 ということが挙げられます。
実装した本人でさえ後から処理を追おうとすると、どこに記述したか・どういった経緯でDBから値を持ってきたかが分かりにくくなります。ましてや、実装者以外がコードを見たときは言うまでもなく、処理を追うのがとても大変になります。
そのため、複数人の開発では大きな問題になります。

次に、「改修漏れが生じやすい」ことが考えられます。
ファットコントローラーでは同じ処理を至るところに書いている場合が多く、仕様変更などがあった場合は同じ処理のところを全て変更しなければならなくなり、改修漏れが生じやすくなってしまいます。

ファットコントローラーにはこのような問題が挙げられ、 私のポートフォリオでもよく起こっていました。

それでは、ファットコントローラーにならないためにはどうしたら良いのか、いくつか秘訣を紹介します。

ファットコントローラーを防ぐ秘訣

その壱:バリデーションは FormRequest にまとめる

これはファットコントローラーと言われたら一番に思いつく内容ではないでしょうか。

Laravelには、独自のバリデーションおよび認可ロジックをカプセル化するカスタムリクエストクラスで、標準の機能として FormRequest が用意されています。
バリデーションをコントローラー内に記述する際、入力パラメータや条件が複数ある場合や仕様変更により入力パラメータが増えた場合は、コントローラー内の行数は確実に増え、読みにくくなってしまいます。
そのため、バリデーションは FormRequest にまとめてしまい、バリデーションによる肥大化を防ぎます。
仕様変更があった際や、入力パラメータが増えた場合にも FormRequest のみを変更するだけで済むようになります。

その弍:DBの処理はRepositoryに任せる

LaravelなどのMVCフレームワークを使用している場合、コントローラーにSQLを直接記述してしまうことで、どんどん肥大化していってしまいます。
おそらく、これが見た目の部分で見づらいなと思う大きな要因になっているのではないでしょうか。
扱うテーブルやカラムが多くなればなるほど、コントローラー内の行数は多くなってきてしまいます。
FormRequest のようにLaravel標準の機能ではない為に少しレベルは上がりますが、DBの処理はRepositoryにまとめることで、コントローラー内をスッキリさせることができます。

その参:コントローラーやメソッド間で重複している処理は共通化する

コントローラーやメソッド間で重複している処理は、共通のメソッドを作成してそのメソッドを呼び出すようにします。

私はポートフォリオを作成中に、ほとんど同じデータで結果も似たようなものだったのにもかかわらず、何度も同じ処理を書いていたので手間がかかりましたし、とても読みにくいコードになっていました。
もし仕様変更などでDBの内容に変更が生じた場合には、その処理を書いているところは全て修正しなくてはならなくなります。
通化しておけば修正箇所は1つで済みますし、プロジェクトに新規参画したメンバーにも分かりやすいコードになります。
しかしながら、共通化できそうなコードを無理に共通化しようとすると、意図しない値の置き換えが生じる場合があるので注意も必要です。

おわりに

いかがだったでしょうか。今回は実体験を元にファットコントローラーを防ぐ方法を幾つか紹介しました。

Laravelは自由度が高いことから、レベル感が異なるメンバー同士での開発ではコーディングにバラつきが出てしまったり、勉強したての頃はコードが煩雑になりやすいです。
個人開発では好きなところに好きにコードをかけましたが、共同開発ではいかに読みやすいコードにするかがポイントになってくると思います。

今回紹介した内容だけでファットコントローラーが解消される訳ではなく、より良い方法や対策案はいくつもあると思います。
また、Laravelは奥が深く、私もまだまだ理解が追いついていない部分も多くありますが、日々勉強し少しずつ前進しています!
スタイル・エッジLABOの一員としてより良いシステムを開発していけるように、これからも全力を尽くします!!!

☆スタイル・エッジLABOでは、一緒に働く仲間を募集しています☆ もし興味を持っていただけましたら、採用サイト↓も覗いてみてください!

recruit.styleedge-labo.co.jp