関数型プログラミングを実践した結果

はじめに

こんにちは、竹田です。

今回は、「なっとく!関数型プログラミング」を読んでみて、実際に実務で実践した内容と、感じたメリットデメリットをお伝えしようと思います。言語はPHPを使いました。

関数型プログラミングとは

関数型プログラミングについての主張は様々ありますが、重要な点は純粋関数を用いることだと言って良いと思います。純粋関数とは、「引数が決まれば、その関数の返値が必ず一つに定まる」関数のことを言います。

以下は純粋関数の例ですが、aとbの値が決まれば必ず一つの返値が定まります。

function sum(a,b){
  return a+b
}

以下のような関数はaを渡したとしても、毎回異なる返値になります。このような関数は純粋関数ではありません

function rundum(a){
  return a * rand()
}

なぜ純粋関数でないと困るのか

例えば以下のような、ショッピングカートクラスの場合getItems()は$itemsに何が格納されているかによって返値が変わってしまいます。これはとても単純な例なため問題にはなりません。しかし、実際にはいくつもクラスが依存しているような作りになっていることがあります。依存先のクラスの変更が、依存元のクラスに悪影響してしまう可能性に常に不安になりながら作業を行う必要があります。これは作業者としては非常に苦しいです。

class ShoppingCart {
    private $items = [];

    public function addItem($item) {
        $this->items[] = $item;
    }

    public function getItems() {
        return $this->items;
    }
}

実践した内容一覧

今回主に実践した内容は以下になります。

  • 全ての関数をpublic static 関数にする。
  • 全ての関数を純粋関数にする。
  • クラスに状態を持たせない。

全ての関数をpublic static 関数にする。

参考書でクラスを作る際に注意することの一つに、できるだけ外部に向けて公開しないような設計でprivate 関数を用いて安全性を保つ方法があります。このルールを守らず全ての関数をpublic static関数にします。

class sample{
    public static sample_function1(){
        ~~~~
    }
    public static sample_function2(){
        ~~~~
    }
}

全ての関数を純粋関数にする。

最初に述べましたように、常に引数に対して返値が一意に決定される作りを意識することでシンプルな作りの関数にします。

クラスに状態を持たせない。

関数を全てpublic staticにする以上プロパティ(状態)は持たせないようにします。privateなプロパティもpublicなプロパティも作らないようにします。

メリット

以下は今回関数型プログラミングを実践してみて感じたメリットです。

  • プログラムが簡潔になる。
  • テストコードが書きやすい。
  • レビューがやりやすい。
  • リファクタリングしやすい。
  • 修正する時の不安感が少ない。
  • 途中参加の人に説明しやすい。

上4つの項目に関しては単純にプログラムが単純明快な状態になることで当初の想定したメリットが得られました。特にテストコードに関してはオブジェクト指向で作られているものに関してとても苦労しましたので、今はとても作業が楽になっています。

下2つに関しては、心理的なストレス軽減と仕事の引継ぎの簡易さのメリットが得られました。仕事の引継ぎに関しては作業担当者が変わる事はよくあると思いますので、なかなか良いメリットだと思います。

デメリット

  • とくになし

今の所、特に弊害は出ていません。

結果

1年ほど関数型プログラミングを行ってみて一番懸念点だった全てpublic staticにすることで、使ってはいけない場所で関数が使われる可能性があるという事もありませんでした。ほぼメリットだけを享受することができたと思います。

終わりに

関数型プログラミングも完璧な仕組みではないと思いますので、弊害がそのうち出てくるかもしれません。その弊害が出るまではこのまま関数型プログラミングを進めてみようと思っています。