はじめに
ここでは、私がオブジェクト指向プログラミング(以下、「OOP」とする)について学んだことを、少しずつまとめていきます。
全てを書くと長くなってしまいそうなので、小分けにして書いていきます。
(自分自身の投稿ハードルを下げるためといのうも理由の一つ)
なぜOOPを勉強したのか
OOPについいて書き出す前に、初回なので勉強し始めたきっかけにも軽く触れておこうと思います。
私は専門学校でゲームプログラミングを勉強している身なのですが、共同制作の際、己の力不足により、メインプログラマーの方にご迷惑をおかけしてしまいました。
「汎用性があり、再利用可能なコード」を目指してほしいと言われていたのですが、要求された水準に達するものは作れませんでした。
この時の反省から、汎用性のある再利用可能なコードを書けるようになるため、C++を扱う上で避けては通れないOOPについて理解を深めようという考えにいたりました。
OOPとは何か
「モノ毎に変数と関数をまとめ、プログラミングを行うという考え方」
これが現在の、C++におけるOOPに対する私の認識です。
この「モノ」というのはオブジェクトの事で、目的のオブジェクト毎にデータと処理を分けましょうね、というお話です。
ゲーム的に考えるのであれば、マ〇オはチビなのか、デカいのか、炎とかを投げられるのか、といった状態を表すデータと、その状態毎の処理は同じところにまとめておきましょうね、というお話になるのだと思います。(逆にまとまってないと困りそう)
この考え方でプログラミングを行う際、大切になるのが「継承、ポリモーフィズム、カプセル化、(抽象)」です。
抽象に関しては、人によっては取り上げていたり取り上げていなかったりするので、解釈が分かれる項目なんだと思います。
ただ、個人的には抽象は結構大事な項目だと考えているので、取り上げていきます。
しかし、これらの項目一つ一つに時間を割いていると、えげつない文章量になりそうなので、次回以降に順次取り上げていきます。
C++とOOP
先の項目でOOPについて端的にまとめた際、
「C++におけるOOPに対する私の認識」であると明言させていただいたのには理由がございます。
OOPって人によって解釈が色々違うんですね、これが。
なんで?って思うじゃないですか。
あまりにも人によって言ってることが異なるの、なんで?
これに関しては、OOPのルーツに原因らしきものがありました。
OOPという考え方は、誰によって提唱されたものなのか?
という質問をされれば、恐らくそれなりの方が、アラン・ケイ氏だと答えるのではないかと思います。
勿論、アラン・ケイ氏がOOPを提唱したのは事実です。
SmallTalkというプログラミング言語を開発している際には、「オブジェクト指向プログラミング」という単語を使っていたそうです。
ユタ州にいた 1966 年 11 月の少し後、Sketchpad、Simula、ARPAnet の設計、Burroughs B5000、そして生物学と数学のバックグラウンドに影響されて、プログラミングのアーキテクチャを思いつきました。
おそらく 1967 年に、誰かが私に何をしているのか尋ねたので、私は「オブジェクト指向プログラミングです」と答えました。
引用:Dr. Alan Kay on the Meaning of “Object-Oriented Programming”
※こちらの文章は英文をGoogle翻訳で日本語に直したものなので、一部おかしなところがあるかもしれません。
しかし、このSmallTalkはSimulaよりも後に開発されたものなんですね。
Simulaというのは最初のOOP言語と考えられているプログラミング言語で、SmallTalkもその影響を受けています。
影響こそ受けていますが、Sumilaよりも厳格な印象を受ける言語になっています。
そして、Simulaの影響を受けたプログラミング言語は他にもあります。
C++です。
C言語にSimulaの特性を引き継がせたものを作りましょうよ、という経緯で開発されたらしく、無事開発され、今もなお使われている言語の一つとなっています。
ややこしいのはここからです。
面倒なので箇条書きにします。
・Simulaの影響を受け、SmallTalk誕生
・SmallTalkの影響を受け、Objectiv-C誕生
・Simulaの影響を受け、C++誕生
・C++やObjectiv-Cの影響を受け、JAVA誕生
JAVAはもう皆さんご存知だと思われます。
非常に人気な言語ですね。
よりにもよってSimulaとSmallTalkの性質どっちも引き継いでいますね。
人気な言語であれば当然勉強する方は多く、OOPへの理解を深めようとする方も少なくないはずです。
当然、知名度があるアラン・ケイ氏のOOPに対する考え方は様々な方の目に触れます。
JAVAはSmallTalkの性質を引き継いでいるため、彼の考えに従うことは正しいです。
結果として、アラン・ケイ氏の考え方を解説した記事がたくさん出るようになります。
勿論正しいのでこれを正解だと認識する方が増えます。実際に正解なのだと思います。
しかし、C++ユーザーをやっている私がOOPについて勉強しようとすると、アラン・ケイ氏の名前が出てくる記事が大量に出てきます。
それをもとに勉強しようとすると、学校で習った内容と噛み合わない部分が出てきます。
そりゃそうです。C++には、SmallTalkの考え方が開発経緯的に採用されていないわけですから。(できないわけではないらしい)
なんてややこしいのでしょうか…
まとめ
何故、噛み合わない箇所が出てくるのかをあれこれ調べた結果、今回執筆している内容にたどり着きました。(長い道のりでした…)
この内容をもとに更に色々調べた結果、なんか言語によって取り扱いだの解釈だのが若干違うらしい事も分かりました。
無理です。C++でも手一杯なのに他言語のOOPまで把握できる気がしません。助けてください。マジで。
次回以降、OOPについて少しずつ掘り下げていく予定ですが、SmallTalkの方のOOPについてはあえて触れません。今回だけです。
あくまでも私はC++を勉強している身。C++に必要な知識だけに一旦とどめないとキャパが足りません。
専門学校に通い始め、まだ一年と半年程度の学習量しかない段階で触れていい代物でもないような気もします。
ですので、私が書くOOPまとめの記事では、そちらに触れないことをご了承いただければ幸いです。
PS
もし、OOPを解説している書籍、サイトでお勧めのものがございましたら、教えてくださると幸いです。