2010年03月29日

OOP その2 クラスとインスタンス オブジェクト

【注意】素人が迷走しながら書いてる記事なので参考にしないで下さい(苦笑)

クラスとインスタンス


前記事でオブジェクト指向プログラミング言語には下の3つの概念があると書きました。

・インヘリタンス(継承)
・ポリモフィズム(多態性)
・ダイナミックバインディング(動的束縛)

これを理解するには、クラスというものを知る必要がありそうなので、先にクラスから手を付けてみる。

平たく言えば、オブジェクト指向プログラミングってのはバラバラの部品をグループに分けて安全性・再利用性を高めて効率よくプログラムすること。
オブジェクト指向プログラミング言語は、これを可能にするための言語ってことだけど、具体的にはどういう言語なの?ってとこだよな。

実際、アクションスクリプトはオブジェクト指向プログラミング言語なわけだから、アクションスクリプトを見ながら考えてみる。
アクションスクリプトで、まず知らないといけないのが「クラス」。
何気なく使ってるけど「クラス」って何よ?

プログラミングで書いたように、アクションスクリプトも機能ごとに分類されており、それをクラスという。
例えばテキスト関係を担うクラス・サウンド関係を担うクラスといった風に分けられている。

クラスを見てみると主に「プロパティ」と「メソッド」で構成されている。
プロパティとは性質のことで、座標・大きさ・名前など性質を現すもの。
メソッドは命令のことで、誰に何をさせるかを命令するもの。
この他にクラスによってはイベントや定数といったものがある。
こういったプログラムの部品となるコードを使いやすく分類したのがクラス。
ということは、クラスってのはコードの集まりに過ぎない。

これを実際にタイムライン上で使うには、「インスタンス」を生成しなければならない。
インスタンスとは、事実・実例といった意味で、ライブラリにあるmp3ファイルをタイムラインに配置するのと同じことになる。
ASでは、varステートメント・new演算子・コンストラクタを使って記述をする。

var mySound:Sound = new Sound();

//var インスタンス名:データ型 = new コンストラクタ名(引数);


オブジェクト

さて、クラスとインスタンスが出てきたところで「オブジェクトとはなんぞや?」を考えてみる。
今まで「オブジェクト」という言葉をあえて避けてきた。
というのも、いろいろ読んだけど、解説によってオブジェクトの捉え方が違っているから。
ここがわからなくて、いつも挫折していた。
でも「オブジェクト指向」というくらいだから、オブジェクトが解らないと先に進めない。
しかもややこしいことにオブジェクトクラスとかあるし、混乱する。

オブジェクトの捉え方がどう違うかというと、
・クラスもインスタンスもオブジェクト
・クラスはクラス、インスタンスがオブジェクト
・クラスはオブジェクト、インスタンスはインスタンス
どれが正解?と思うんだけど、たぶんどれも正解。
もっとも解りやすいと思った記事を貼っておく。
IT Pro 第1回「オブジェクト、クラス、インスタンスの関係」

この記事を読むと、「クラスもインスタンスもオブジェクトである」と捉えるのが自然な気がした。
では、アクションスクリプトでは、どのように捉えているのだろう?

AdobeFlash CS3ドキュメンテーションより引用
オブジェクト指向プログラミング (OOP) は、情報 (データ値) と機能が含まれる個別のエレメントであるオブジェクトとしてコードをグループ化することによって、プログラム内のコードを構成する方法です。

フフフ・・・。Adobeがもっと解りやすく解説してくれればこんな苦労も無いのに、終始このように専門家しかわからないような書き方なので困る。
私的解釈すると、データ(プロパティや定数など)とメソッドが含まれるものをオブジェクトとして捉える。さらには「コードをグループ化」と書いてある。
これってクラスのことだよね。
さらにAdobeの解説を見てみる。
クラス : 特定の型のオブジェクトの構造とビヘイビア (そのデータ型のオブジェクトのテンプレートや設計図など) の定義。

インスタンス : プログラムで作成される実際のオブジェクト。

他でクラスの解説を読んでいると「クラスはオブジェクトの雛形」という表現もあった。たぶんそういうことを言いたいんだと思う。
でもオブジェクトの雛形とかいわれてもピンとこない。
で、先ほどのIT-proの解説に準えると、クラスは第ニ実体。
実体なんだけど、グループ化されたコードの集合体なので、抽象的。
抽象的なので、このままタイムライン上で使うことができない。
実際に使えるように具体化するためにインスタンスという第一実体を作る。
ということで、結論は「クラスもインスタンスもオブジェクト」

【追記】
野中文雄氏のサイトを見ると、「アクションスクリプトにおいてクラスは単なる抽象的な存在ではない」と書かれてあった。
でもこれは多言語と比較して抽象的じゃないということだと思う。
クラスはオブジェクトでないとする言語からみると、アクションスクリプトはクラスもオブジェクトとされるので、抽象的とはいえないということなのかな?と解釈。
アクションスクリプトしか知らない私にとっては、インスタンスからみたらクラスは抽象的な存在であるように思う。
野中文雄氏のサイト ActionScript3.0言語の概要より
posted by K at 23:55| Comment(1) | OOP | このブログの読者になる | 更新情報をチェックする

OOP その1 カプセル化

本気でアクションスクリプトを勉強しようと思い立った私。
いままで何度も挫折したオブジェクト指向ですが、やはりこれを避けては通れないようで・・・orz
っつーことで、メモしていこうと思います。
三日坊主で終わりそうですが(笑)
【注意】素人が迷走しながら書いてる記事なので参考にしないで下さい(苦笑)



オブジェクト指向プログラミング(Object Oriented Programming)とカプセル化


アクションスクリプトはオブジェクト指向プログラミング言語らしい。
オブジェクト指向プログラミング言語とはなんぞや?

専門用語使いまくりのものから例え話まで、いろいろ読み漁ったけど、やっぱりわからんので、自己流解釈することにした。

ゲームを作るには、いろんな機能が必要。
たとえばテキストを表示したり、その内容を書き換えたりする機能。
画像を読み込んで表示する機能。フレームを制御する機能。効果音を制御する機能などなど。
この機能同士が、それぞれ独立していて、ひとつの機能の中で処理が完結できるようになっている構造のことをオブジェクト指向プログラミング。
では、なぜ機能がそれぞれ独立していなければならないのか?
お互いに依存していると、一つのミスで全てがエラーを起こしてしまう。
それを防ぐために、独立させる必要がある。
これをカプセル化という。
「カプセル化」の説明には「隠蔽」という言葉がよく使われているので、独立させるというより、外部からアクセスできないように隠すというのが正解。
こうすることにより、プログラムの安全性を高めるという意味があるらしい。
さらに機能を独立させることで、何度も繰り返し使うことができるという利点がある。

で、このようなプログラミングを可能にする言語をオブジェクト指向プログラミング言語という。
この言語には、3つの概念が含まれる。

・インヘリタンス(継承)
・ポリモフィズム(多態性)
・ダイナミックバインディング(動的束縛)

ハァ〜なんじゃそりゃ。
posted by K at 10:16| Comment(8) | OOP | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。