オブジェクト指向最高再考

オブジェクト指向は流行った。だからオブジェクト指向はすばらしい!プログラミングはオブジェクトを中心に考えるべき。本当だろうか?関数型言語はブームである。だから関数型の考え方はすばらしい!処理を中心に考えるべき。どっちだろうか?私はどっちも重要だと思う。プログラムはデータも処理も両方含まれてお互い関連しているのだから、どっちかのみ重要ということはない。もちろん、表示関係も重要だが。オブジェクトのみ重要だったらデータをDBで管理してコーディングなんてほとんど必要くなるのではないか…。実際そんなことはあり得ない。


私の独断と偏見からだが、どちらかと言うと処理の方がより重要に思われる。と言うか、プログラミングは処理中心だと思う。私はいつでも処理に合うようにオブジェクトを調整している!また、多くのプログラミングの玄人が心の中でオブジェクト指向は何か分かりづらくしっくりこないと思っているのに対して、関数型の考え方(の一部)は非常にしっくりきているような気がしてならない。関数型言語はリストに関連した機能のイテレータ高階関数などが楽だし。でも関数型言語の考え方ってモジュール化とか設計よりの話って含んでない気がする…。


私はPythonを使い始めてからオブジェクト(の種類)を必要以上に増やさない努力をしている。と言うか、可読性の高いコードを書こうとすると必然的に自分で定義するクラスの個数は非常に少なくなる。Javaみたいに全てをオブジェクトにしないといけなくて、オブジェクト同士の関係性が強制的に必要になるというのは無駄が多すぎる。関数をstaticにすれば良い?でもそれは避けたい!オブジェクトなんて必要な時だけ定義して使えれば良いではないか…。Pythonのように。


いやPythonは全てがオブジェクトだからオブジェクトを多用しているよという意見があるかもしれない。確かにその通りだし、もし文字列やリストなどプリミティブなデータが値型のメモリ配置だったら、それを手軽にソートさえできない…。怖い…。つまり、オブジェクト指向の重要性って、そういったオブジェクトのメモリ管理にある…?いや、デザインパターンなどを見ていると、もっと上側の設計時の考え方こそがオブジェクト指向の重要なところという感じに見える…。だが、実際低レベル(と言ってもハードよりの細かいところではなく)なメモリ管理や、オブジェクトの扱い方の所に日常の仕事では毎日向き合っている。もちろん、JavaにはGCがありメモリ管理からはほぼ解放されるが、低レベルな所ではメモリ管理が必要なので、それを隠しきれていない。というか、何らかの形で影響が現れる。Pythonはそこら辺もかなり隠してくれるが、やはりそこら辺を知ってないと大きいアプリは組めない。例えば、オブジェクトの実体のコピーと参照のコピーの区別を知らないでは本格的なアプリは組めない。


結論としては、私は初心者なら、オブジェクト指向の基本をしっかり覚えれば応用がかなり広がると思っている。というかそれって、オブジェクト指向でなくCの基本である?いやここで言っているのは、Cから少しだけ発展させたオブジェクト指向という範疇に入る知識での基本のこと。デザインパターンなんてとりあえずいらない!初心者の方はJavaじゃなくぜひPythonやってみてください!


追記:
表現を少々修正(2006/12/1)。