オブジェクト指向は難しいか

トートツだが、このブログのモットーは「うそ、おおげさ、まぎらわしい」である。
というのはウソだが、実際、思ったことを書きなぐっているので間違ったこともたくさんあるはずだ。
ネットとはそういうもので、読む側がそれを考えて、あるときは笑いのネタにし、あるときは参考にして、うまいこと扱っていくものなのだと思っている。
っていうか、個人のブログに正しさを求めるのは根本的に間違っている。


さて、今回はオブジェクト指向について。
Rubyオブジェクト指向言語ではあるが、手続き型の記述もできるように配慮されているし、Matz氏の紹介文でもRubyの特徴としてそんなふうに書いてあった。今は知らないが。
オブジェクト指向言語なのだからオブジェクト指向的に書かなければならない、ということは全くない、と言い切っておこう。
で、槍玉に上がるのがこの記事。紹介記事だしサンプルも提示しててとてもよい記事であることは先に言っておく。叩きたいわけではなく、俺は自分の主張をしたいだけなのだ。
http://jp.rubyist.net/magazine/?0005-RGSS
なぜかまたRGSS関連になってしまったが、これは偶然だ。
んでもってこれを書いたのはMiyakoの人だ。別に競争心が表れているわけではない。偶然だ。
スタイルの違いは考え方の違いであり、なにをいいと思うかというレベルで食い違う。
どちらも正しく、どちらも間違っていて、量子理論のようにどっちもありで、結論が出たとしても、それはあくまでその状況での結論であって、本質的にどう、ということはない。
こういうことで誤解を受けたくないから弁解に必死である。


話を戻して。
オブジェクト指向というのは、原理的には構造化の理論である、関数と構造体を、もっと高度な概念に取り込んで発展させたものである。
概念的からしてまったく違うものだ、と主張する人もいるみたいだが、単純に考えて、データのみのクラスは構造体だし、グローバルスコープを持つメソッドは関数なのである。言語ごとの実装はさておき、概念として。
高度な概念を持つものは、複雑さが0のものを作ると仮定すれば、もっと低い次元の概念より難しい。
これは、Rubyで言えば手続き型の記述をするよりもオブジェクト指向型の記述のほうが難しい、ということになる。
それらを踏まえて上の記事のサンプルコードを見ると、スプライトを動かすだけの簡単なコードにわざわざクラスを定義してあるわけだ。


俺が作るプログラムは、必要がなければクラスの定義はしない。
クラスを作ったほうが楽だと思ったときのみ、作る。
だから、サンプルのミニレースやテトリスモドキでは使ってないし、ブロック崩しはシンプルなクラスをブロック用に定義してある。
この境目は人それぞれだとは思う。
プロジェクトWikiではクラスの作り方の説明はずっと後になる予定。
だって本質的に必要じゃないんだもの。
そもそもオブジェクト指向がでてきたのは、複雑さが構造化プログラミングの限界にぶちあたったためであって、それを解決するのがもっと高度な概念であるオブジェクト指向設計手法による開発だったわけで、オブジェクト指向のほうが構造化より簡単なためではない。
図で書くとこうだ。

赤い線が構造化設計、青い線がオブジェクト指向設計
つまり、ある一定水準以下の複雑さのプログラムでは、オブジェクト指向設計は難しいだけで無意味である。


今回の話は、クラスを設計し定義する、というところに限定した話で、Rubyそのものが無意味であると言っているわけではない。
シンプルでわかりやすい設計であれば、使うぶんには楽なのだ。MFCだってアプリを作るのは難しいがCStringを使うだけなら簡単だ。
Rubyを使う限り、オブジェクト指向を勉強しなければならない、とか言って、クラスの説明をするのに哺乳類がどうこう馬がどうこうとかいう、妙な説明をする必要などない。だいいち勉強の必要がない。
複雑なプログラムを書く頃にはRubyにも十分慣れているだろうし、その頃にはクラスとは何かという話など、既に感覚的にわかっているはずだからだ。


そんなふうなことを考えながらWikiの記事の展開を悩んでいるわけだが、クラスを作る話はいつ出せばいいのやら。