Elephant Communicationsの制作スタッフが日々気になったことをお届けするブログです。

« MacのQuickTimeでFLV再生 | メイン | スイーツ大将 »

金曜日, 5 09, 2008

OOP(Object Oriented Programming)とは、オブジェクト指向のことです。字面的にも、語感的にも個人的にはあまり好きな呼び方じゃないんですが、いかんせんタイトルが長くなってしまうので。

やっとこさオブジェクト指向の知識だけではなく、 実制作にその概念を取り入れることができるようになってきました。 そこにたどり着くまでの紆余曲折を書いてしまうと、かなり深い話になってしまいます。

でもこのブログでそんなに深い話を書いてもだれも読んでくれませんので、 プログラムに関して簡単だけれども、とっても大事な仕組みを紹介していこうと思います。※第二回があるかどうかはわかりませんけどね

扱う言語はActionScriptなので、同じECMAScript(エクマスクリプト)を源流とするJavaScriptにも共通した概念が通用するんじゃないかと思います。関数を変数として扱えるところとか、一番よく似てますね。

今回はスコープのお話。

スコープとは、「ある変数が持つ有効領域」を指す概念です。 入門書などではおろそかにされていることが多いですが、 これをきちんと意識していく練習をしていかないと、 勉強しているうちに行き詰ってしまいかねません。 オブジェクト指向でプログラムを書くにあたって直面する壁が、 スコープだと感じました。

まず以下のプログラムの実行結果を予想してみてください。

function scopeTest():Void {
	trace(scope);
}
var scope:String = "root";
scopeTest();

これは普通に「root」という文字列が出力されたかと思います。
それでは次のプログラムの実行結果を予想してみてください。

function scopeTest2():Void {
	var scope2 = "function";
}

var scope2:String = "root";
scopeTest2();

trace(scope2);

出力結果は、「root」になってしまいます。
この結果を理解するためには「ローカル変数」「グローバル変数」の概念、 「var宣言の概念」をきちんと理解していることが重要です。

oop_scope.gif

つまり、scopeTest2の中で宣言・代入された変数はローカル変数であり、グローバルで宣言されていた変数とは、名前が同じではあるけれどもまったくの別人であったということです。そして、ローカル変数は一度関数を抜けてしまうと破棄※1されてしまいます。最後のtraceの対象になったのは、グローバルで宣言された方の変数scope2でした。

ローカル変数というものは、「関数※2」内において有効なものです。 関数内でvar宣言された変数はローカル変数として扱われ、ローカル変数のスコープはその関数内でのみ有効となります。 グローバル変数は、基本的にグローバル領域すべてにおいて有効な変数です。 では、var宣言されていない関数内の変数はどうなるでしょうか? 以下のプログラムの実行結果を予想してみてください。

function scopeTest3():Void {
	scope3 = "function";
}

var scope3:String = "root";
scopeTest3();

trace(scope3);

「関数内でvar宣言された変数はローカル変数になる」ということなので、 var宣言していないと、ローカル変数として扱われないということになります。 つまり、変数scope3はグローバル変数として扱われます。 5行目のグローバル領域で宣言された変数と同一のものとなるので、 その変数を関数内で上書きした形ですね。

基本はこんな感じだと思いますが、スコープはもっと奥が深いので、 自分が宣言した変数がどこまでのスコープを持っているのかいろいろと試してみてください。

※1 ただし、クロージャという概念を用いれば例外的にローカル変数を保持することも可能です。

※2 ちなみにですが関数とメソッドの違いを認識しておくとお得です。
関数というのは、オブジェクトに所属していないモノを指します。 メソッドというものは、オブジェクトに所属したプロパティとしての関数を指します。

※2 CodeZine(JavaScriptの関数とメソッド):
http://codezine.jp/a/article/aid/221.aspx

トラックバック

このエントリーのトラックバックURL:
http://lab.elephant-com.co.jp/cgi-bin/mt/mt-tb.cgi/91

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)