2013-06-08
オブジェクト指向をちゃんと知った上でオブジェクト指向はクソだと声高に主張する人があと100人は必要
Joe Armstrong (Erlangの作者)
Why OO Sucks
Rich Hickey (Clojureの作者)
The Value of Values
Simple Made Easy
Are We There Yet
寝不足で調子悪いので毒を吐きます。あとあらかじめ言っておくとWeb業界のことを念頭において書いています。
去年はSmalltalkとその派生のオブジェクト指向言語をよく触ったり作ったりしていたのだけど、Schemeと関数型言語大好き人間としてはselfを破壊する度に心が痛んだり、selfの存在そのものに疑問を抱いたりしていて、他にも説明できないもやもやが溜まっていた。それらを今年の2月か3月頃に見たRich Hickeyのプレゼンが全て解決してくれて目が覚めた。
オブジェクト指向はローレベル(機械寄り)すぎて、関数型言語等のもっと宣言的に書ける(思考を表現しやすい)言語を実装する素地としてはいいんだけど、普通のアプリケーションをそれで書くのは不便だし綺麗なコードに貢献しない。トレイトだミックスインだDCIだデザパタだメタプログラミングだとしっちゃかめっちゃかにコンセプトをぶち込んでも、オブジェクトというミュータブルな物(メモリの抽象)を扱っている限り根本的な解決にはならない。最低でもアイデンティティ(同一性)とステート(状態)の分離は必要不可欠。
「オブジェクト指向はクソだと声高に主張する人がいる」という噂だけでもオブジェクト指向プログラマに届くようになれば、日頃抱えるもやもやの原因を調べようという気になってくれるかもしれない。
少なくともオブジェクト指向で書く必要がない(unjustifiedな)プログラムにまでオブジェクト指向を使うという風潮、というよりとりあえずオブジェクト指向やっとけば間違いないという風潮だけは変わって欲しい。現場のプログラマが正しいツールを使うことを提案しやすくなるので、風潮は意外と重要。
オブジェクトを使ってプログラムを組むこと自体が、関数と値を使う方法に対して大きなディスアドバンテージを抱えている*1んだから、オブジェクトの欠点を上回る利点が見いだせるとき以外はオブジェクトなんてよくわからないもの*2使わない方がいいというのが今日の主張。だいたい、メモリとかのことを考えなくて済むようにLLとか使ってるのに「オブジェクトの同一性 = メモリアドレスが同じか否か」なんてどうかしてるよ。
今日言いたいのは「関数型の方がオブジェクト指向よりも良い」という事ではなくて単純に「オブジェクト指向は悪い」という事なんだけど、オブジェクト指向が悪いなら何が良いのかという疑問にはへの答えとしては関数型の名前を出したい。関数型プログラミング*3は勉強が大変て思うかもしれないけど多分思ってるほど難しくもない。なにしろ関数と値の2つしか覚えることはないんだから*4。なるべくこの制約の中で、読みやすさを心がけてコードを書いていればそれは立派な関数型プログラミングですよ。
参考になるかもしれないリンク
LLerのための関数指向入門
関数型JavaScript
他にもおすすめがあれば教えてください。
- 58 http://www.kt.rim.or.jp/~kbk/zakkicho/
- 20 http://www.kt.rim.or.jp/~kbk/zakkicho/index.html
- 12 http://reader.livedoor.com/reader/
- 10 http://practical-scheme.net/wiliki/rssmix.cgi
- 10 http://t.co/vLEnzjaVFm
- 8 http://t.co/U6ZsqLuZuS
- 5 https://www.google.co.jp/
- 3 http://k.hatena.ne.jp/keywordblog/関数型言語
- 2 http://127.0.0.1:4474/top?2196240
- 2 http://d.hatena.ne.jp/keyword/オブジェクト指向
- 2013-06-04 水まんじゅう 3/47 6%
- 2013-06-04 terazzoの日記 3/43 6%