Change before you have to.

androidアプリ開発、iosアプリ開発、rails、deep learning .etc.を使った社会実験。

オブジェクト指向とは?〜アプリを作る前に〜

 

前回までに

iOS Developer登録(申請篇、アクティベート篇、完結篇)

開発環境の整備

をやってきました。

 

以前、無謀にもプログラミング未経験の私が

グラディウスのようなゲームを作りたいと宣言しました。

 

もう少し具体的にしないとどうにもならないので

いくつか考えられる機能を挙げてみました。

 

主なプレーヤー

・主人公

・敵

他にもいろんなものを用意する必要がありそうですが、まずはこの二つ。

もちろん、敵は数体用意する必要があると思いますし、

主人公についても必要に応じて複数(キャラ変更できるよう)用意しようと思います。 

 

ゲーム構成

・主人公がビームを出す

・敵に当たると爆発する

・敵はゲームが進行するに連れて強くなる

 

柔軟性を持たせるために主人公や敵の動き方は最初に決めないようにしようと思います。

 

 

細かい部分は作りながら考えていきますが

この大枠だけは最初に決めておきます。

あとちょっと気になっているのが、プログラムとの相性についてです。

 

iPhoneアプリのプログラミングをする時に必要なのが、

objective-cという言語らしいので、

wikiで調べてみました。

 

Objective-C(オブジェクティブ シー)は、プログラミング言語の一種。C言語をベースにSmalltalk型のオブジェクト指向機能を持たせた上位互換言語である。

Objective-CはNeXT、Mac OS XのOSに標準付属する公式開発言語である。OS Xのパッケージ版に開発環境がDVDで付属するほか、ユーザ登録をすれば無償でダウンロードできる(Xcodeの項目参照)。現在では主にアップルのMac OS XiOS上で動作するアプリケーションの開発で利用される。」

 

 

・・・分からない言葉が沢山あります。

 

まず、C言語Smalltalkもまるで既知のように説明していますが、

私にはなんのこっちゃ分かりません。

まー呪文みたいなものを唱えるってことですよね(大雑把に言ってすみません。なめてる訳ではありません。(´。・д人)

 

あと、一番気になるのがオブジェクト指向機能という言葉。

これもwikiで調べます。

オブジェクト指向(オブジェクトしこう)とは、オブジェクト同士の相互作用として、システムの振る舞いをとらえる考え方である。英語の object-oriented (直訳は、「対象物志向の」・「目的重視の」という意味の形容詞) の日本語訳である。

オブジェクト指向の枠組みが持つ道具立ては、一般的で強力な記述能力を持つ。複雑なシステム記述、巨大なライブラリ(特に部品間で緊密で複雑な相互関係を持つもの)の記述においては、オブジェクト指向の考え方は必須である。」

 

 

うーん、ますますよくわからなくなってきます。

最後の方に書いてあるところを見ると

複雑で沢山のプログラミングをする場合に必須ということが分かります。

 

これから作ろうとしているのがどれだけの規模になるのか分かりませんが、

オブジェクト指向について一応勉強だけはしてみようと思います。

 

 

それで、参考にしたサイトがこちらです。

グーグルの検索で、

オブジェクト指向ってキーワードと一緒に「5分で分かる」と入れたらヒットしました。

「5分で絶対に分かるオブジェクト指向

http://www.itmedia.co.jp/im/articles/0703/06/news125.html

 

 

オブジェクト、インスタンス、クラス、スーパークラス、サブクラス。。

初めて聞く単語が沢山出てきます。

分かったような分からないような。。

 

とにかく何度も読んでみて

誤解を恐れずに以下、自分なりにまとめてみました。

 

オブジェクト指向における世界とは

「個性を持ったオブジェクトが集まっ」たものとあります。

今回の例では世界=ゲームそのものとします。

 

その世界を構成するものがオブジェクトなので

少なくとも目に見えるものはオブジェクトと呼んでも良さそうです。

ですので例えば、主人公はオブジェクトなのではないかと思います。

あと、主人公が放つビームもオブジェクトだと思います。

主人公に襲いかかる敵もそうですね。

 

あとクラスという単語が出てきました。

先ほどのサイトの中では「クラスとはオブジェクトの抽象概念 」という説明があります。

オブジェクトの抽象概念ってなんでしょうか。

少し読み込んでみると、具体例が書かれています。

つまり、自分、弟、同僚などをオブジェクトとすると

これら個々のオブジェクトに対するクラスとは「人」であると書かれています。

 

そもそも抽象概念って言葉自体が目に見えるものじゃないので分かりにくいですが、

クラスっていうのはカテゴリーみたいな感じで理解すれば分かりやすいと思いました。

 

例えば私が作ろうとしているゲームでは、

主人公、敵やビームなどは「生物」とか「物体」というクラスに属するという理解ができそうです。

あくまで私の分類方法ですが。

 

こうすると分かりやすくなってきます。

スーパークラスとはクラスという名のカテゴリーを広くしたものです。

サブクラスとはそのカテゴリーを狭くしたもののようです。

だから、敵というクラスを作ったときのスーパークラス

より広い概念としての物体、もしくは生物となるわけですね。

逆に物体というクラスのサブクラスは敵とか主人公とかビームに相当します。

 

 

スーパークラスの特性はサブクラスに全て受け継がれるわけですね。

日本語にすると前者が親クラス、後者が子クラスなので

遺伝子が受け継がれるイメージで分かりやすいです。

 

ゲームの世界では

①主人公(ヒト)

②敵(カイジュウ)

③弾丸(ビーム)

等がありますが、これらはいずれも

④物体(モノ)というオブジェクトの特性を引き継ぐわけです。

(①、②、③のスーパークラスが④であるという前提)

 

これらを個々のオブジェクトに対して

クラスの関係をまとめてみようと思います。

 

ちょっと話が複雑になってきたので、

私のゲームの例でまとめてみたのが、以下のイメージです。

 

<ゲームに登場するオブジェクトのクラス関係>

f:id:ichonol:20140112230944j:plain

字が汚くてすみません。汗

 

上がスーパー(親)クラス、下にいくほどサブ(子)クラスになります。

サブクラスは更に下にサブクラスを作れるようなので

カイジュウのサブクラスに「弱い奴」と「強い奴」とかを作ってみました。

 

あと、アイテムもコインのアイテムとか特殊効果があるアイテムとか

どんどんサブクラスを考えることができそうです。

 

インスタンスという言葉については出てきませんでしたが、

これだけでは説明が難しいのでこちらに簡単に(しかもざっくりと)説明しています。

 

こうやって図にすると少し分かりやすくなりましたね。

明日はこれをどうやって実際のプログラムにするかということを勉強して書こうと思います。

 

続きます。