オブジェクト指向は、シンプルできれいだが脆い。関数型プログラミングは、強く美しいが複雑。F#はいろいろな書き方が混ぜこぜになるよ。楽しいよ。
オブジェクト指向プログラミングが好きだ。関数型プログラミングが好きだ。
オブジェクト指向プログラミング
オブジェクト指向プログラミングは、コンテナの一般性を確保している点で優れている。データと振る舞いをコンテナとしてまとめることで、プログラムをわかりやすく整理するという特徴がある。
特定のコンテナ自体を値として別のコンテナに収めたり、操作に対してパラメータ(引数)として受け渡すことでプログラムを表現する。
そのコンテナをオブジェクトって呼んでいる。
データと操作をオブジェクトとしてまとめる利点は、オブジェクトそのものに責務を定義できるからだ。
オブジェクトはそもそも自身の型を知っているので、オブジェクト内のデータによってその状態を識別できる。
カプセル化された実装によって、果たすべき機能が適切に表現される。ただし、オブジェクトで状態を扱うと
必ず副作用を巻き込んでしまうので「脆さ」が見え隠れする。そこで考え出されたのが不変オブジェクト。
不変オブジェクトの利用はオブジェクト指向プログラミングにおいて重要な要素のひとつだ。
オブジェクト指向プログラミングは、シンプルできれいだが脆いプログラミングスタイル。好きだ。
関数型プログラミング
関数型プログラミングは、関数を一人前の値(ファーストクラスオブジェクト)として扱える点で優れいている。より高いレベルで操作を抽象化できるので新らたな制御構造を構築しやすい。
つまり、関数(計算)を連鎖させる(組み合わせる)ことで、あらゆる操作を柔軟に表現できる。
そこには本当の意味でのプログラムの再利用性と拡張性がある。関数型プログラミングの発想においては、操作はデータ(状態)を変更するのではなく、
入力を出力にマップ(写像)する考え方が基本となる。これ言うのは簡単で、やるのは少し頭をつかう。
いや、少しとは言い難い複雑さ難解さを伴うことも少なくないのが関数型だ。だがそれがいい。
モナドを勉強すると、関数型プログラミングを理解する大きな助けになる。時間はかかってもいい。勉強したい。
上手に関数を一般化できるようになると、表現力が格段に上がるので
簡潔で読みやすく美しいプログラムを書くことができる。副作用に対する心配が軽減されて、テスト容易性、保守性も抜群だ。
関数型プログラミングは、強く美しいが複雑なプログラミングスタイル。好きだ。
F#でオブジェクト指向プログラミングをすることはやぶさかではない。
F#は関数型言語だ。でもハイブリッドでイケてる言語なのでオブジェクト指向もできる。F#は.NET Framework上にある関数型言語。実のところ関数だってその正体はオブジェクトだ。
.NET Framework上にあるので、容易にそのライブラリの恩恵を享受することができる。
VB.NETユーザーやC#ユーザーにとって、これはかなりうれしいアドバンテージだ。
現役.NETerが関数型言語を学ぶなら、何も迷う必要なんてない間違いなくF#だ。F#をおすすめする。
.NET Frameworkはオブジェクト指向で実装されている。であるからして、
F#で利用する場合は、その恩恵を受けると同時に「状態」という名の副作用の相手をしなければならないことが往々にしてある。
多くの「状態」を扱うのであれば、オブジェクト指向を採用すればシンプルに表現することができる。
F#はそれができる。したがって、F#でオブジェクト指向プログラミングをすることはやぶさかではない。
VB.NETやC#などで経験してきた、オブジェクト指向の設計パターンやアーキテクチャを再利用したいことがある。
F#はそれができる。したがって、最適解ではないかもしれないが、
F#でオブジェクト指向プログラミングをすることはやぶさかではない。
さまざまなトレードオフとの葛藤。混ぜこぜ楽しい
F#は関数型言語だよ。でもハイブリッドでイケてる言語なのでオブジェクト指向もできるよ。じゃあF#でどう書く?
基本的には関数型プログラミングのスタイルで書くことが推奨される。なぜなら、強く美しいから。
でもね。.NET Frameworkとお友達である以上、いろいろと難しいことも出てくる。
F#でWPFやSilverlightを扱おうとすると、大小含めていろいろな副作用と付き合う羽目になる。
脳が自然とオブジェクト指向したくなっちゃう*1。オブ脳発動は自然な流れ。これはもうある意味仕方がないことだ。
だからF#でプログラムを書くと、さまざまトレードオフと葛藤しながら、いろいろな書き方が混ぜこぜになるよ。
これはね。最初はどことなく気持ち悪さも感じたんだけど、今では結構しっくり来る。混ぜこぜ楽しい。
「オブジェクト指向プログラミングしているコードは美しい」そう思っていた時期が俺にもありました。
まぁ間違いってわけじゃないんだけど、適切な表現か?というと今はなんか微妙に違う気がしている。
オブジェクト指向プログラミングってのは「美しい」というよりかは、「きれい」なんだよね。
整理整頓されているね的な意味で。関数型プログラミングしているコードは強く美しい。かっこいい。
もちろんアート的な意味でね。どちらもプログラミングに必要な要素だと思う。
まとめ
F#でプログラミングをすると、いろいろな書き方が混ぜこぜになるよ。それは決して悪いことではないよ。F#によるマルチパラダイムなプログラミングはとても楽しいよ。
F#しようよ!