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

本当は怖い情報科学

情報系大学院生の趣味&実益ブログ。

個人的にはオブジェクト指向には違和感があって

雑談

以下は、主観的な問題だし結局は「適材適所」「プログラムの構造次第」だってのを重々承知で書きます。あと、プログラムを記述する「テクニック」と、プログラムの「意味論的なモデル」は違うものだという認識です。


ちょっとオブジェクト指向に違和感があって、コードがぐちゃぐちゃになるような気がしている。

大学に戻る前にいた職場ではRubyのコードを書きまくっていたが、自分がコードを書くとArray + mapを多用した作りになる。僕の頭の中では、たぶん「プログラム=データ構造+写像」という感じなのだと思う。プログラムは、できる限り副作用のない「写像」を使って定義し、その写像をsequentialに適用していくことで目的の出力を得るような構造になるべきだ。つまり、それらの写像の合成写像=プログラムというのが理想という感じ。

だから、Javaのように、「全部はクラスです。オブジェクト指向です。」みたいな雰囲気を見ると、なんか違うなーという感覚にとらわれる。僕がC++でプログラムを組む時は、データ構造はクラスで作りつつも、全部の処理をクラスに入れる必要は全く感じない。Javaのライブラリとかを見ても、オブジェクト指向と言いつつ名前空間に毛が生えたようなものとして使っているケースが多いし。

オブジェクト同士が相互作用するっていうモデルは、現実にピタリと当てはまる場合はいいけれど、それ以外の場合は無理に使うようなモデルではないと思う。現実に合わせてモデルは選べばいいのだけれど、一番適用のチャンスが多いのは「データ構造+写像*1」だという気がしている。

「違和感がある」とは書いたが、別にオブジェクト指向が嫌いなわけではない。その「写像」(サブルーチンまで合わせて数百行程度)の中を記述する方法論(テクニック)としては非常に重宝している。僕の中でのオブジェクト指向のイメージは、言語自体をリッチにしてくれる機能であり、「組み込み型を増やす」機能だ。決してプログラムの設計に普遍的に適用する機能ではない*2

と言いつつも、少数派なのだろうなあという感覚をぬぐえない。たぶん、injectなんて、「なんでこんなメソッドがあるんだよ」とか思われてると思う。

かといって、「純」関数型言語Haskellとか)が好きかといわれると微妙なんだよなぁ…。難しい年頃です。今こそScalaを勉強するとき(と言いつつやってない)。

今のところは MatzLisp(=Ruby) と ShiroLisp(=Gauche) を半々くらいで使ってます。特にGauche(というかLisp)は楽。何が楽かというと、名前の付け方が非常に自由なので、string->integer とか、output-w/o-flush (w/o = without)とか、好き放題に記号が使えるのが楽しい。関数名が非常にわかりやすくなる。

*1:別に写像といっても、データを完全に複製する必要もなくて、適宜破壊的にデータを更新するように作ればいいと思う。

*2:言語自体が全体的にオブジェクト指向なのは別に構わない。要は自分で言語をリッチにできる・あたかも言語組み込みの機能を自分で増やせるということが重要。なんかポール・グレアムかぶれみたいな言い方だな

【広告】