Chapter 03

純粋関数は最高だ

とっくり
とっくり
2022.09.02に更新

前置きが長くなりました。主題に入ります。

純粋関数には純粋でない関数と比べていくつかのわかりやすい利点があります。どれもぱっと考えれば当たり前のことばかりですが。

単体テストが書きやすい

ファイルも、DBも、ネットワークも、一定の状態に準備されたオブジェクトも、何も準備がいりません。ただ単に、ある引数を与えて関数を呼び、返り値をチェックするだけです。

単体テストが速い

ファイルやDBやネットワークのI/Oやロック、DOMの参照更新などの副作用をできるだけ隅っこに押し込めて、アプリケーションの本質であるロジックをできるだけ純粋関数で書こうというのが関数型プログラミングです。上に挙げた(実行が遅い)副作用を持たない純粋関数はたいてい実行が速いです。したがって、アプリケーションの本質的なロジックの単体テストが高速に実行できるということです。

並列実行でも安定

複数スレッドからスレッド外の変数やオブジェクトを変更したり、ファイルやDBを扱うようなプログラムは、一見動いてるようでもたまにおかしな挙動になったり、デッドロックが起こったり、とにかく書くのもテストも難しいです。

「共有の一つの変数を変更する」「ファイルやDBを扱う」のは副作用の一種です。副作用を持たない純粋関数は、引数さえ同じであればマルチスレッドでどう呼ばれようが結果が常に一定になります。

できるだけ増やしたい!

アプリケーション全体の中に占める純粋関数の割合が増えれば増えるほど、上記の利点がたくさん享受できます。

関数型プログラミングでは副作用を狭い範囲に閉じ込めることを目指します。それにより

・単体テストの品質も量も向上する
・バグの起こりやすい範囲を限定する
・性能の劣化しやすい範囲を限定する

といった効果があり、ひいては仕様変更に強く、再利用性が高く、読みやすくて書きやすく、プログラマーが残業しなくてイケてるアプリケーションがどんどんリリースされる、幸せな世界を目指します。