オブジェクト指向ができたわけ

出典: YKAwiki

なんでオブジェクト指向なの? という問いに対して

  • 再利用性が高まります
  • 現実世界を模してプログラミングできます

という答えが世間では一般的です。これは、本当のことですが、実は嘘です。というのも、実際にオブジェクト指向言語を使い初めてすぐにこれらのことが理解できるわけないからです。

「再利用性」ということに目が行くようになるのは、それなりに大規模なプログラムを書いたり、多人数でプログラミングプロジェクトを転がしたり、同じようなクラスを別々のプログラムで何度も使うハメになった後のことです。「JAVA? C++? なにそれおいしいの?」なんてピヨピヨ言ってるしんまいアマチュアプログラマーにとっては、どーでもいいことなのです。はっきり言って、意味ないです。

「現実世界を模して設計できる」ということも、同じことです。「オブジェクト同士が連携することでプログラムができるんだよ。これって現実と同じでしょ?」なんて言われても、「プログラミングができればゲーム作れるんスよね!?」なんてピヨピヨ言ってるしんまいアマチュアプログラマーは「ハァ?」ってなるだけです。大体、オブジェクト同士が連携しているように”考えている”のはプログラマーだけで、実際にRUNしたときにメモリの中にあるオブジェクトの実体が連携なんてしているわけないです。そういったことを抜きにいきなり哲学的なことを教えるからしんまいアマチュアプログラマーたちは意味不明地獄に陥るのです。

ついでに言うと、「Carクラスがあって、そこにはHandleとかWheelという変数があり……」なんていうクソみたいな説明もヤリ玉にあげたいのですが、それはまた別の機会に……。

世にあふれているプログラミング指南本は、プロの、企業プログラマーが書いていることが多いため、そういう思想・哲学的な部分を学生が読んでも、かなり視点が違っているために理解に苦しみます。「再利用性」や「OOP(オブジェクト指向プログラミングの略)な設計思想」が間違っているわけではありません。それはとても正しい考え方で、使うべきです。が、オブジェクト指向を学ぼう、と最初に触れるには敷居が高すぎるのです。

以前にこれらの説明を読んで「ハァ?」ってなったしんまいアマチュアプログラマー諸君。安心して良い。

「再利用性」や「OOPの設計思想」なんてわからなくて当然です。

で、は。

かく言う私がしんまいアマチュアプログラマーに送る「なぜオブジェクト指向か?」という問いに対する答えは, ただひとつ。

「そのほうがラクだから」です。

正確に言えば「OOPの方がラクにメモリ管理ができるから」です。

もともと、コンンピュータを利用しようとしてプログラミングが始まったのは、衛星の軌道計算しようとして体育館一個分くらいのデカい”電子計算機”を使っていたころからで、そのときはマジでコンピュータ内部の配線を手でつなぎ変えてプログラミングしていたのです。それがパンチカードに変わり、アセンブリ言語に変わり、手続き型言語になり、そしてオブジェクト指向言語が生まれました。この間に変わったことといえば、言語的には、制御文がだいぶ読みやすくなったのと、メモリ管理、つまりメモリの抽象化度合いが変わっただけと言っても過言ではないのです(だって、いまだにコンパイル途中で中間コード(アセンブリ言語)生成してるでしょ? 実はバイナリレベル、CPUから見たら何も変わっちゃいなかったりするんでないの?)。

では、その、言語の進化はなぜ起こったのか? なぜオブジェクト指向言語が生まれるにいたったのか?

それは

プログラマがラクをするために言語を作り変えてきたから

に他なりません。

私のオヤジの時代はプログラミングというと「パンチカードにパンチで穴を開ける作業」だったそうですが、それはもうヒサンな世界だったそうです。紙のカードにミスして一個穴を開けただけでプログラムは動かず、カードは交換。もちろんそんな穴の列なんて読みやすいものではありません。それが3番地コードに代表されるようなアセンブリ言語になり、ちょっとはマシになりましたが、相変わらずレジスタ(CPUが計算に使う領域のこと。命令もデータも全部ここから読み取られる.一般的なコンピュータにおいてデータの流れは「メモリ→キャッシュ→レジスタ」となっている.アセンブリ言語では演算とメモリ操作の時にいちいち書かないといけないのでわずらわしい)を直接指定しないといけませんでした。今のようなint型とかdouble型なんてなかったんですよ? 信じられますか? それが、だいぶたってからFORTRANみたいな手続き型言語が生まれてようやくfor文とかint型とかが生まれ、C言語になるともう皆さんご存知のプログラミング言語の機能が全部そろうわけです。

ようするに、苦労したくないから新しい便利な道具(言語)をこしらえてきた、っていう タ ダ そ れ だ け 。

高級なプログラミング言語は、実は堕落と怠惰の象徴みたいなものだったのです! 衝撃! ってのは茶化しすぎですが、人間の歴史って割とそんなものです。というか、そうしてきたからこそ今は便利な言語がたくさんあって幸せに暮らせる(プログラミングできる)のです。先人に感謝しましょう。

ではここで本筋に戻って、オブジェクト指向に引っ掛けたC++の話をしましょう。例えば、今までC言語をやってきて、構造体を作ったりして、そんでもってその構造体をいっぱい作って一個ずつ関数に渡す、みたいなことをやったことはありませんか? ついでにリスト作っちゃったりとか。それって結構苦労したでしょ?

それが、オブジェクト指向言語になったら、クラスという「変数と関数の構造体」が作れるようになります。そうすると、今まで別々に構造体を関数に渡していた操作が減ったんじゃないですか? クラスの関数を呼ぶだけで変数の指定なんかしなくて済むようになりませんでしたか?

それが、実はOOPの本質なのです。ラク、できますよね? メモリの管理でわずらわしい思いをしなくて済みますよね? そう、それでいいのです。さぁ、オブジェクト指向のありがたみがわかったら、ゲームでも作ってみましょうか。「再利用性」や「設計思想」なんてものは、必要な時が来たらまた勉強すればいいのです。ま、ガッツがあるなら勉強するのもひとつの考え方ですので、絶対するな! とは言いません。

ちなみに、他にもあるオブジェクト指向のよいところは、publicとprivateというスコープに関する概念が使えるところなのですが、それは、また、別の話。