Laravelにおける関数型プログラミングの活用と設計思想について

こんにちは、エンジニアの鵜川です。

最近、業務にも慣れてきて言語やフレームワーク毎にどういった思想で開発を行なっていくのが良いのかについて考えるようになってきました。

Laravelといえば オブジェクト指向 のフレームワークですが、Collection型やエロクアントモデルなどのメソッドチェーンの一部が 関数型プログラミング の特徴を持っているため、その点で 関数型プログラミング に近い側面を持っています。

これはLaravelが柔軟性を提供するための意図的な設計上の選択です。

関数型プログラミングで書くと何が良いのか

関数型プログラミングの思想を強く受けているといえば React を思い浮かべる人は多いかと思います。

個人的な感想ですがLaravelの一部に関数型プログラミングの思想を取り込むことによってコードの 可読性 及び 再利用性 を向上させることができると思っています。また 純粋関数不変性 を重視するようになるため、テストコードの作成が容易になります。

どこに取り込むべきなのか

Laravelの一部に関数型プログラミングの思想を取り込むとすればサービスクラスのメソッド内が一番おすすめです。本来サービスクラスはファットコントローラーを避ける為に一部の機能を切り出すようなもので関数型プログラミングとかなり相性が良いと思っています。

各メソッドがどのような機能を果たしているか不要なコメントを書かなくても理解できるようになりますし、色々な箇所でメソッドの再利用がしやすくなります。

何より機能単一での品質が高くなりバグの発生を抑制することができます。

意識していること

Laravelには Collection型 エロクアントビルダー など一部、関数型プログラミングの思想を受けているものが存在しますのでサービスメソッドを実装する際はできる限り配列はCollection型に変換して扱うようにし生SQLを多様し過ぎずにエロクアントビルダーを使用するようにしてます。

Collection型を使用することによって本来foreach分でループしないといけない箇所にmap関数やeach関数を使用できコードがコンパクトになりコードを読む際に開発者のやりたかったことを理解するのが楽になります。

両者ともメソッドチェーンをつなげて行くところが関数型プログラミングっぽいですよね。

また、メソッドを実装する際は渡ってきた変数に影響を与えず(不変性)、渡ってくる変数によって出力や処理を変える(純粋関数)ように実装することによってそのメソッドに対するユニットテストの作成が容易になります。

とはいってもLaravel自体が強く関数型プログラミングの思想を受けているわけではないですし開発者によって何を重きに置いているかによって実装の方針は異なってくると思います。

まとめ

Laravelは良くも悪くも柔軟に設計されているフレームワークですので機能毎にどのような思想で機能を実装するかをしっかり考えながら開発を進めることでアプリケーションの品質が向上していくのではないかなと思っています。

これからもLaravelに触れながら設計思想を学びより良いアプリケーション開発を進めていこうと思っています。

Related article

おすすめ関連記事