オブジェクト指向回顧録
タイトル画像は生成AIに「オブジェクト指向プログラミング」で生成させた画像ですが、なんだかよく分かりませんね。記事の方もこれくらいよくわからない昔話です。
今の人はどうやってオブジェクト指向を学ぶの?
この春からとある企業の新人研修の補助講師の職を紹介されたので足掛け3ヶ月、実質2ヶ月限定でやってます。まだ払い込まれてないのですが。
その実質2ヶ月でITの基本から、データベースやウェブ、そしてプログラミングをやるのだから大変です。新人さんのプログラミング経験の情報はないので分かりませんが、単純に理系文系で言えば文系率も結構高いです(ただし、一部情報系を文系扱いするケースもあるとかないとか)。それで2ヶ月でお題に沿ったシステム開発の体験までするのですから。なんと1ヶ月で一通りの座学と演習を終えてしまいます。今はちょうどその佳境。
言語はJavaなのでまずはJavaをやりますが、一通りプログラミングとは何かをしてからオブジェクト指向(Object Oriented:OO)とは?みたいな流れ。Javaなので構造体はないし、そこでいきなりクラスとは?なんです。
そんなの当たり前と思うかもしれませんが、非OOからプログラミングに入った世代としては、まずは構造体というものがあり、そこからOOを学びました。それはそれで、分かりやすかった気がします。
OOとはパラダイムの逆転だった
あくまで個人の主観ですし、同世代や同じようなコースを辿った人でも「それは違うんじゃない」という意見はあるかと思います。
OOとは個人的にはプログラム(ロジック)ありきからオブジェクト(データ)ありきへのパラダイムの逆転です。
非OO時代のプログラミング
自分の場合、マイクロソフトBASICから入り、機械語(8080/Z80やx86系)を多少齧りつつ、TurboPASCALやTurboC、ひいてはBorlandC++やVisuallC++へと流れて、Javaに辿り着いた口です。
大昔、大型コンピュータの時代はハードありきでソフトはおまけでした。
そのソフトの世界でもメインはプログラム。アルゴリズムやロジックと呼ばれる手順の方が重視されていました。データはおまけ扱い。データ構造とかが注目されるようになったのは結構後の世代の話です。アルゴリズムやロジックについての方法論は語られてましたが、データについての話はあまりありませんでした。
もっとも、当時はリソースが今と比べてとても狭かった時代。データはいかに切り詰めるかが至上命題だったので、仕方ない話でもありました。
本来のOOとは
今はOOの中でもクラスベースOOが主流っぽい感じで、その典型例がJavaという感じ。でも、80年台以前のOOと言えばSmalltalkなんですよね。Smalltalk自体は当時雑誌の連載で記事を読んだくらいなので詳細を語ることはできません。ただ、ロジックありきではなくて、すべてはオブジェクトでできており、そのオブジェクト同士がメッセージを送り合うという考え方が斬新だったのを覚えています。
それがC++やJavaではメンバ関数とかメソッドというものになってしまい、ちょっとなんだかなという感じはします。ただ、あくまでデータがメインというのがOOの肝と考えてます。
それまではロジックがあって、そのためにデータがあるというロジックが主、データが従という考え方。それが、OOではオブジェクト(データ)が主で、それを扱うためのロジックが従。本当はそこがメッセージングなのですが。
そのパラダイムの逆転こそがOOの妙だと思ってるのですが、そういう話をしないですよね?
それでいて、現実のものはすべてオブジェクトです。それをプログラムに落とし込むのがオブジェクト指向です、みたいな概念的な話に終始する。
まあ、頭の出来の良い人はそういう概念の話で理解できるのでしょう。
しかし、自分は五流大学出の末端プログラマなので、そういう概念よりも具体的な話の方が理解しやすいのです。今の新人さんは優秀なので、そういう概念的な話でも理解できるのでしょうね。
嫌われるOO
もっとも、最近はOOもやや嫌われ気味。モダンな言語はすでに「オブジェクト指向」と冠することが減ってきています。非OOということでクラスという概念を導入していない言語も増えてきています。
とは言え、調査によってはまだまだ人気というか、使用される事例も多いJava言語。オブジェクト指向やクラスという概念との付き合いはまだまだ続きそうです。
ただ、オブジェクト指向があまり主流ではなくなっても、データ構造やその扱いが重要だというのは変わりません。そういう意味での「オブジェクト(=データ)指向」は変わらないのかなと思います。
拙い記事でございますが、サポートしてもよいよという方はよろしくお願いします。著者のやる気アップにつながります。