関数型とオブジェクト指向の話

やあやあ。

この記事はポエムだから肩の力を抜いて欲しい。

 

最近話題の関数型

最近巷で関数型ポエムの話をよく聞いたね。

あのポエムが良いか悪いかの論争はこの場は論じないでおこうと思うけど、そもそも関数型ってなんなんだろうね。

 

関数型プログラミングについて書いてある本を読むと、先ず最初に目に飛び込んでくるのが、「数学でいう『関数』と同様に、一意の値を与えると、常に同じ答えが返ってくる、副作用がないもの」という表現である。

 

語り始めると宗教論争が生じるし、この表現でもまだ突っ込みどころはあると思うので深入りはしまいと考えているが、要はそういう表現型ばかりを使ってプログラミングを書いていくと、副作用を排して手堅いコードになっていきますよねと言う事らしいのだ。

 

関数型の発想が与えるオブジェクト指向への影響

関数型は、ある種の思想であると、私はここ数年捉えるようにしている。

これも色々宗教論争を呼びそうではあるが、聖書に書かれた教えの解釈は宗派によりけりなのである程度は目をつぶって頂きたい。

 

オブジェクト指向でプログラミングを書いているとよく陥るのが、プログラムが実行中に「状態」を持ってしまい、それによって「タイミング」が生じ、時によって「結果が異なる」挙動を示す場合がある。

これを関数型の教義では「副作用がある」と表現するらしいのだが、そんな表現を知らなくともよくある経験だと思う。そこでよく使う方法が、条件分けや例外処理である。私はこれらを、「副作用を分類している」のだと解釈している。

 

私は今までの仕事柄、副作用を生む処理を記述すると、不具合によっては私の睡眠時間や空実が失われていくという「副作用」を齎すと言う事を知っていたので、関数型という思想に触れる前から、関数的に処理を書こうと試行錯誤をしていた経験がある。

 

ある日、Scalaと出会い、その後Haskellと出会った。

正直に告白すると、そのどちらの言語も満足に書ける自信はないのだが、それらの一片に触れ、考え方を覗き見たという経験は非常に役に立ったと思っている。

 

関数的に書くという意識を持つだけで、純粋な関数言語ではない他のオブジェクト指向言語においても、1メソッドを起こすだけにしてもよく考えるようになった。

真に副作用を排する事は極めて困難であっても、「副作用はこの場合何を齎すのだろうか」と考えるだけでも、やはり関数型言語に学ぶところは多いのである。

 

平々凡 々なオブジェクト指向エンジニアが
関数型とどのように向かい合うべきか

自身の業務や現実と向き合ったうえで、学んだ分だけ可能な範囲で取り入れていけばよい「教義」と捉えると幸せになれるんじゃないかなと思います。

関数型の信徒になって、その世界に閉じこもりたいと思うようになれば、そういう人はそれを専門に使っている世界へ進むと幸せになると思います。

ファン程度であれば、教義に倣う程度でにわか関数型エッセンシャル使いを名乗ると幸せなんじゃないのかな。

 

真剣に学ぼうと思うのであれば、先人の教義に従い、古の専門書から手を伸ばすのが吉であると、私は思います。

 

ではでは。