読者です 読者をやめる 読者になる 読者になる

標高+1m

A Geometric Cosmonaut on Psychedelic Lisp.

オブジェクト指向をちゃんと知った上でオブジェクト指向はクソだと声高に主張する人があと100人は必要

OOP

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つしか考えることがないんだから。なるべくこの制約の中で、読みやすさを心がけてコードを書いていればそれは立派な関数型プログラミングですよ。

参考になるかもしれないリンク
LLerのための関数指向入門
関数型JavaScript
他にもおすすめがあれば教えてください。

[追記 6/13]

  • >コメントで教えて頂きました。ありがとうございます。

第4回 関数型言語とオブジェクト指向,およびOCamlの"O"について
オブジェクト指向プログラミングは間違いだったか?


[追記 6/13]
ひゃあV*Aの人の影響力すごい。
ブコメ返信とかします。

  1. この記事のメインコンテンツは冒頭に並べたリンクです。特にリッチヒッキーのプレゼンは必見です。
  2. 自分もSmalltalkとかの周辺うろちょろしてたのでOOP歴史的価値は認めています。
  3. 不変指向って言い方いいですね!これから使わせて頂きます。
  4. 値と関数の2つだけと言ったのはHaskellも含めてです。モナドだアプリカティブだと色々コンセプトはありますが全て値と関数(と厳密に言うならシンタクスシュガー)で表現されています。OOPでは新しいコンセプトを導入する度に言語レベルでの改修が行われる事が多くて、これはとてつもなくよろしくないと思っています。
  5. 僕が「関数型」という言葉を使う時は必ず「値と関数を使うプログラミング」という意味で使っています。これに合致する物は普通関数型と呼ばれるパラダイムの他にも論理型や制約プログラミングやfactorなどの連鎖性言語など広い範囲を指していると捉えて頂いて構いません。

批判したいのはミュータビリティなんだけどわかりやすさ重視でオブジェクト指向と言いました。あとクソとか汚い言葉使ったのは反省してます。

燃えついでに徹夜で状態の話書いたので読んで行ってください。Are We There Yetの劣化コピーみたいな内容です。 http://d.hatena.ne.jp/ympbyc/20130611/1370970804

[追記 6/15]

鎮火してきたので補足記事を書きました。
オブジェクト指向批判記事のフォーマルな補足

*1:Value of ValuesとAre We There Yetに詳しい。アイデンティティと状態を混ぜこぜにしている事が諸悪の原因

*2:僕は知らないしあなたも知らないし誰も知らない

*3:関数型に限らず脳に優しい言語全般