神っぽい視点からなんとなく理解するオブジェクト指向世界

はじめに

 皆さんこんにちは!私は文学部出身で現在プログラマーぽいものをしています。

 未経験(ここでは工学部情報学部出身ではなく、授業等で全くプログラミングをやったことがないという意)でいきなりJava(の研修)をしました。何言ってんのか意味不明すぎて苦しみ、3年働いてようやくJavaを初めとする「オブジェクト指向」の考え方がなんとなーく把握できてきたので記そうと思います。

 「オブジェクト指向」を理解するとき、結構神っぽいなこれ畢竟神っぽいなこれと思いました。最古のオブジェクト指向言語を作ったのはアメリカ人なので、キリスト教の影響が少なからずあるんやろなあと思いました!

 私は宗教が好きで、特に東洋西洋で分けたときの西洋の宗教であるユダヤ・キリスト・イスラム教、通称アブラハムの宗教について趣味で調べてました。行った大学に宗教学専門の教授がいなかったので、特に宗教学について専門的に勉強したわけではありません。なので、素人の知識でなんとなーく書こうと思います。正確性は担保できないけど80%くらいは合ってると思います!

 文系未経験だけど神大好きだよー◎て方が少しでもIT系に進むお手伝いができたらいいなと思います!

 

★注意★

 ここではあくまで概念の理解について記します。神っぽいなこれだけでは仕事できません。配列とかリストとかfor文とかメソッドとか、そういうルール・書き方的なのはきちんと勉強してください。

 同じオブジェクト指向言語でも言語によって書き方や捉え方が微妙に違ったりします。私がやったことあるのはJava、FlatterのDart(Javaっぽいなこれ)、UnityのC#(Javaっぽいなこれ)です。UnityばっかしてるからJavaのことあんまわかんない!ごめんね~ん

 

オブジェクト指向とは何?

 頭の中に架空の3D空間を作ってそこに世界を創造しようという考えです。オブジェクト=物体を具体的に想像しながらプログラムを書けるという極めて西洋的考えのもと発足したなという感じです。デカルトが座標とか作ったせいで、世界を精密に正確に認識できるようになったのかな?知らんけど。西洋の細かい精神が表れてるなと感じます。

 ちなみにオブジェクト指向の反対を調べたら手続き型指向というものが出てきました。手続き型指向の代表的なものはCOBOLとかの結構古めの言語っぽいです。分かりやすいもので言えば、学生のみなさんが情報の授業で習うフローチャートとか多分そうだと思います!やりたいことをそのままベタ書きしたらなんとなく動くみたいな感じ?どうでもいいので触れません。

 

オブジェクト指向のここがすごい!

 オブジェクト指向言語しかやったことないから知らん。検索したらクラスを再利用できるとか書いてました!

 

オブジェクト指向の登場人物

クラス

 オブジェクト指向では、クラスをインスタンス化してインスタンスを生成します。クラス=設計書とよく言われます。

 創世記で例えると、クラスとは神が土塊を集めて自らと同じ形にすることです。もしくは、神が光あれ!と言うことです。クラスの内容として、「土塊を神型にする」「光と名付ける」と書きます。それです。

 クラスの内容によって人間が生まれたり鹿が生まれたり光が生まれたりします。逆に言うと、何が生まれるかはクラスの内容次第ということです。

インスタンス

 たまごっちでいうみくす、神でいう「アダマに息を吹き入れる」「光あれ!と宣言する」ことです。クラスはstatic(後述するけど、聖書で言う神)なもの以外は外的に生み出してやらないと生まれません。神以外は妊娠出産を経たり、人が材料を組み立てないとこの世に生まれませんよね?神じゃない奴らを使いたいときはインスタンス化(この世に産み落とすこと)をお忘れなく。私もよく産まれる前にこき使おうとしてエラー吐かれました。

 

インスタンス(≒オブジェクト)

 インスタンスとオブジェクトは大体同じですが厳密には違うと言われています。インスタンス化して生まれたものはインスタンスですが、オブジェクトの一種です。

 哲学チックですが、英語のaとtheの違いみたいなもんです。インスタンスはtheで、オブジェクトはaです。要は、今そこで生まれた人間という個体(インスタンス)を指すか、ニンゲンという種族一般(オブジェクト)を指すかみたいなもんだと解釈してます。逆だったらゴメン!どうでもいいってことです。

 

static

 Javaのはじまりの呪文でpublic static void main(string[] arg)というものがありますが、そのstaticです。余談ですが私は研修時にJavaの呪文で引っかかり先に進めない落伍者でした。

 staticとは静的なものという意味です。静的って何やねんというと、超越神です。staticなクラスからはみくす(インスタンス化)せずとも物体が生まれるのです。現在の世界はYHWHが創世記で作りましたが、じゃあYHWHはいつから存在するんだ?というと世界がまだ混沌としてる時代とともに生まれているわけです。

 staticなクラスは、YHWHのように世界の始まりから存在します。そのため、世界の全てを俯瞰して見通すことができるのです。最強です。YHWHはstaticクラスなので、イスラエルからも欧州からもアメリカからも同じYHWHが呼び出せるわけです(※ただし、YHWHはstaticなだけでなくシングルトンでもあります。YHWHはシングルトンでない!と言ってるのが三位一体論を掲げるキリスト教です)

シングルトン

 Singletonという言葉の通り、唯一という意味です。シングルトンなクラスは何度みくす(インスタンス化)しても必ず共通の自我を持った物体が呼び出されます。Fate/zeroでランサーを呼んで自害させます。後にFGOでランサーを召喚したとき、ランサーが死んだ!この人でなし!の記憶をランサーが持っていたら、それは共通の自我を持っているシングルトンランサーということです。逆に、ランサーが自害したことを覚えてなければシングルトンではないランサーです。

 先程キリスト教の神はシングルトンではないと言いました。キリスト教の三位一体論では、父なる神・子なるイエス聖霊の3つの存在が同じものと見なされています。しかし、聖書を読んでいるとイエスは父なる神の意図を知ることができなかった描写があります(処刑のとき、イエスは神に何でや!?とキレてます)。これは、イエスと神はあくまで同じクラス(神クラス)から生まれてますが自我が完全に一致では無いということの証明だと思います。

 綾波のクローンが前の綾波の記憶を受け継いでいないのも、綾波という存在はシングルトンではないということになります。

 

継承(抽象クラス)とインターフェース

 継承(抽象クラス)とインターフェースの違いがマジでわからなくてずっと悩んでました。わかったと思ったらまた抜けていく、そんな存在です。言語によって継承とインターフェースがほぼ同じになってるものもありますが、哲学科ってそういう細かいとこが気になって詰むんだよね。技術屋さんの説明する違いは、Javaでは継承はメソッドのオーバーライド(書き換え)ができるけど、インターフェースはできないらしい。あとインターフェースはメソッドの内容がないんだっけ?逆だったらごめん。前理解したと思ったんだけどまた忘れました……。

 継承・抽象クラス

 抽象クラスとは性質です。神の神っぽいところをとりあえずクラスとしてなんとなーく定義しておきます。抽象クラスを継承すると、その性質をゲットすることができます。

 例えば、神っぽいクラスを継承したYHWHクラスとゼウスクラスは同じく神性をゲットします。神っぽいクラスに「啓示をする」というアクション(メソッド)が設定され、その内容が「人間に話しかける」だとします。YHWHもゼウスも啓示をするというコマンドを叩くと人間に話しかけます。また、個々人がメソッドの上書きをすることで「人間に話しかける」のではなく「村を燃やす」に変えることも可能です。

 

インターフェース

 インターフェースは機能であり約束らしいです。神に例えろと言われたら大変難しいですが、人間のアクションとして「葬儀を行う」という本能だけを植え付けておきます。

 さて、日本人とアメリカ人がいます。彼らにそれぞれ葬儀をやれ!と言うと、日本人は火葬を行いアメリカ人は土葬を行います。「葬儀をやれ!」という一言で、日本人とアメリカ人が考える「葬儀」を行わせることができる便利機能です。

 このインターフェースがなければ、日本人には「火葬をしろ」、アメリカ人には「土葬をしろ」といちいち分けて言わなければいけないのです。ダルいし、逆に伝えてしまったらドン引きされます。ただの便利機能です。

 

おわりに

 Unityをやってたら、他にも神っぽいなこれと思うことが思い浮かびますが、オブジェクト指向とは関係なさげなので終わります!アプリばっか作ってサーバーのこととかインターネットのこととかなんも分かんないので、知識不足しててすみません!