オブジェクト指向入門 ④インスタンス化(実体化)の意義

オブジェクト指向入門

前回に引き続き、オブジェクト指向の意義の話をします。
今回はクラスをインスタンス化して、実体を作っていくことについてです。

インスタンス化のイメージ

オブジェクト指向における「インスタンス化」のイメージをおさらいしましょう。

「自動車」を例にすると、
オブジェクト指向には以下の一連の流れが必要になります。

なんでこうする必要があるのでしょうか?

とりあえずはなにかと便利だから、と理解しておいて、
どういう時に便利なのかを具体的に見ていきましょう。

「サンプル2-3」の場合

さて、ここでプログラミング入門シリーズの『②動くものを見てみよう』の項にある
「サンプル2-3」を再度確認しましょう。
色のついた点を動かすことで綺麗なグラフィックを作っているやつです。

◆サンプル2-3

ここは解説を飛ばしました所ですが、
実はクラスやオブジェクト指向をフルに使って作っているので、
それについて学ぶのに最適なサンプルとなってます。

絵を描くには<canvas>というコントロールを使っています。それについて詳しくは置いといて・・・

このプログラムは、色のついた点みたいな画像がたくさん動くことで構成されてるのが分かるでしょうか?
要は、点をいっぱい動かすために、点を一個のインスタンスとして、
それをいっぱい作るようにプログラムが組まれています。

軽くソースコードを見ていきましょう。

まず、以下のクラス「Pointer1」は、
「全体で雨のようにランダムに降ってる点」を制御しています。

class Pointer1 {

    constructor(x,y,initlight)
    {
        (処理)
    }

    update() {
        (処理)
    }

    draw() {
        (処理)
    }

}

同様に、「Pointer2」は円上に動いてぐるぐる回っている点を制御していて、
「Pointer3」は五芒星を描く点を制御しています。

クラスPointer1をインスタンス化してる所を探しましょう。
関数「draw()」内に以下の処理があります。

pointer1.push(
    new Pointer1(Math.floor(引数)
);

引数はランダムに降らせるための座標などを渡しています。これについては置いておいて・・・
ここでインスタンスを作って、作ったインスタンスを配列「pointer1」に入れている所が重要です。

そんでもって、関数「draw()」は関数「mainLoop()」内で呼んでいるので、
なんどもなんども雨が降るように、なんどもなんどもこの処理が実行されるようになっています。

つまり、簡単に説明すると、まずは点が発生する数だけ「new Pointer1(引数)」を実行しています。
今回の場合、作ったものは配列形式でインスタンスができているので「pointer1[i]」というように書いて使います。

それから、「pointer1[i].update()」や「pointer1[i].draw()」というように
クラス内のメソッドを呼ぶことで、一個一個の点を動かしたりします。
動かす処理と描画する処理は、Pointer1クラスの「update()」と「draw()」の中でやります。

このように、「独立したたくさんのものを動かす」場合は、
オブジェクト指向が活きやすいです。

オブジェクト指向を使っていく一例がイメージできたでしょうか?

ゲームイメージの場合

例えば、ちまたで出回っているゲームでも当然、
たくさんの「オブジェクト」が使われます。

例えば、アクションゲームでプレイヤーがいて雑魚キャラがいた場合、
プレイヤーが一個のオブジェクトになっていて、
雑魚キャラもまたオブジェクトになっています。
雑魚キャラはいっぱい必要なので、一つのクラスからたくさんのインスタンスが作られます。

以上のように、ゲームプログラミングの場合は、
例えば「キャラクターの数だけインスタンスが必要だから、オブジェクト指向が必要」
などと理解してもらえれば良いと思います。

オブジェクト指向の使用は実際にプログラミングをするとあらゆる局面で出てくるので、
具体的な使用例は、実際にゲームを作ってみたらもっと分かるようになるでしょう。

業務ソフトウェアイメージの場合

業務ソフトウェアの場合、
大体、「画面」があって「コントローラー」が配置されています。

例えば、「商品情報を登録するための画面」とかだったら以下のようになります。

 

この時、まずは「画面そのもの」が一個のオブジェクトになっていて、
加えて、コントローラーの一個一個がオブジェクトになっていると理解してもらえれば良いです。

あと、「マルチウィンドウ」に対応しているソフトウェアだった場合、
画面の中で新たな画面を表示させることがあります。

この時、「親ウィンドウ」の処理から「子ウィンドウ」をインスタンス化することで、
「子ウィンドウ」が表示されるようになります。

それから、子ウィンドウは独立したインスタンスとしてプロパティを持っていて、
親ウィンドウは子ウィンドウのプロパティを参照することができるし、
子ウィンドウが親ウィンドウの値を参照することもできます。
子ウィンドウで何かを処理して、その結果を親ウィンドウに渡すみたいな処理を、
インスタンス(実体化)されたもの同士でのプロパティのやり取りとして扱うことができます。

以上のように「マルチウィンドウ」を使っていく場合、
オブジェクト指向が活きやすいです。

他にも、「処理をインスタンスとして独立して動かしたい」
「使い終わった処理は破棄したい」といったイメージで使う場合、
オブジェクト指向が便利になります。

 
以上。オブジェクト指向の使い方のイメージをざっくりと説明していきました。

逆に言うと、オブジェクト指向無しでシステムを作ることが不可能ってわけではないですが、
無数のオブジェクトが必要になったらそれが欲しくなってくるし、
オブジェクト指向があった方が高度なものが作れる、と理解しておいてください。

この辺は実際に開発をしてみて、使う意義の理解を深めていきましょう。
 

まとめ
  • サンプル2-3の例では、動く点の一個一個がインスタンスになっている
  • ゲームイメージの場合は、動くキャラクターの一つ一つなどがインスタンスになっている
  • 業務ソフトウェアイメージの場合は、画面に表示されるコントロールの一つ一つなどがインスタンスになっている。それから、画面自体もインスタンスだし、ウィンドウを新しく表示する場合はインスタンス化していく
  • 実際に開発をして使う意義の理解を深めていこう

 

オブジェクト指向入門 ⑤構造体の使い方とクラス
引き続き、「オブジェクト指向の使い方」の話をしていきます。 オブジェクト指向の使い方とは、 言い換えるとクラスの使い方ということになります。 そんでもって、クラスの使い方は様々であり、 何かしらの処理(メソッド)を持つものを使うこと...

コメント