OOPが何かとかで盛り上がってる

このあたりで盛り上がっていますね。
http://blog.goo.ne.jp/viscuit/e/8ea0ce6d1d3aab0f95d92fd42c473558
http://qiita.com/shibukawa/items/2698b980933367ad93b4
https://twitter.com/yukihiro_matz/status/730032023163691009


個人的には、OOPってメモリとその操作を一体化する、というだけだと思う。
こういうのは何故生まれたか? Cのような手続き型から考えるのが手っ取り早い。
(適当のコードを書いているでのバグっていても許して貰えれば嬉しい)

OOPが無い時代の代表的な言語はCで、こんな操作になるだろう。

int a;

a = 3;

twice(a); //3 * 2 = 6
minus(a, 1); // 3 - 1 = 2

別に不思議な操作ではないんだが、twiceやminusの引数の型はintになるはずだ。
これをlongでもやりたいとなると、関数の型を変えるしかない。
でも、intでもlongでも動かしたいとなると、twice_int、twice_longが必要となるだろう(longの方でintの計算もできるという話は分かっているし、置いておく。そこが目的では無いので)。

これが2,3回程度なら良いが汎用的なことを考えると大変だ。
ましてや、関数の種類が増えるとさらに厳しいし、間違えた関数を呼ぶこともあるだろう。


さて、Cだと構造体で自前の型を作って開発するのが当たり前だ。
慣れてくると、この関数と型が本質的に別なので、めんどくさくなり構造体に関数も定義するようになるのは珍しくない。
こんな具合だ。

struct Hoge {
  int x;
  int  (*twice)(int);
};

struce Hoge hoge;

hoge.twice(2); //めんどくさいので、twiceは別に設定済みだとしておく


これだと、構造体と関数が一体になっている。
呼び出しも一体化できる。C++に近いし、OOPといって良いと思う。


OOPの良さはここにある、と個人的には思っている。
継承や、カプセル化がどうのや、メッセージだはどうでも良い。
上記のCでのOOPも含めて、そこは実装の話だ。
そうじゃあなくて、上記のようにデータと関数、つまりメモリと操作が一体になっている部分だ。

データ部分は別にプロセスでも良い。
OSはプロセスという実行部分とメモリをセットにした単位だ。
かなり強引だが大きな目で見るとこれもOOだし、Shellのパイプはプロセスからプロセスへとデータを渡しているので、これもOOPだろう(通常はそうは言わないが)。

ようは、それだけでOOPは非常に単純なんだといつも自分は思っている。
極論すぎるのかなぁ。