作成日
27 June 2006
ActionScript 3.0 はオブジェクト指向の強力な言語で、Flash Player 実行時の新しいプログラミングモデルとなります。ActionScript 1.0 または 2.0 を使い慣れている場合は、初めて ActionScript 3.0 を使用してアプリケーションを開発するときに、言語にいくらか違いがあることに気づくでしょう。
注意 :ActionScript 2.0 と ActionScript 3.0 の言語の違いについて詳しくは、『Flex 2.0 リファレンスガイド』で相違点の一覧を参照してください。
ActionScript 3.0 への移行を簡単にするために、ヒントと開発中に発生する可能性のある一般的な問題について説明します。
- すべての変数、パラメータおよび戻り値の型を宣言します。これは必須ではありませんが、すべての変数、パラメータおよび戻り値の型を宣言することをお勧めします。これによって、コンパイラに有益なエラーメッセージがより多く表示されます。仮想マシンに前もって型を知らせることができるので、実行時のパフォーマンスも向上します。これは大変重要なので、デフォルトでは警告が表示されます。
- アクセス指定子のない宣言は、デフォルトでは
package internal
で、public
にはなりません。宣言のデフォルトのアクセス指定子がinternal
となり、public
ではなくなりました。つまり、すべてのコードではなく、定義を含むパッケージのみに対して定義が可視になります。これは Java などの言語と同様です。ActionScript 2.0 の宣言はデフォルトではpublic
でした。この違いにご注意ください。誤りを防ぐため、宣言に必ずアクセス指定子を使用してください。アクセス指定子を使用しない場合、ActionScript 3.0 コンパイラに警告が表示されます。 - クラスはデフォルトではシールクラスになるので、実行時に動的にプロパティを追加することはできません。クラスをダイナミックまたはシールにすることができます。ダイナミッククラスの場合は、実行時にダイナミックプロパティを追加できますが、シールクラスの場合はできません。ダイナミックプロパティを格納するための内部ハッシュテーブルが必要ないので、シールクラスのほうがメモリを節約できます。また、コンパイラもより適切なエラーフィードバックを返すことができます。宣言
class Foo
はシールされています。クラスをダイナミックとして宣言するには、dynamic class Foo
のようにdynamic
キーワードを使用します。 - クラス定義をパッケージに含めるには、
package
宣言を使用します。package
キーワードは新しくActionScript 3.0に追加されました。ActionScript 2.0 のコード :
class mx.controls.Button { ... }
ActionScript 3.0 のコード :
package mx.controls { class Button { .. } }
ActionScript 2.0 では、public
クラスを、クラスと同じ名前でファイルに含める必要がありました。1 つのファイルで複数のクラスを宣言することはできますが、publicに指定できるのは 1 つのクラスだけで、このクラスの名前をファイル名と同じにする必要がありました。
- クラスへの参照に完全な修飾子があっても、複数のクラスをインポートすることができます。クラス
MyPackage.MyClass
を使用するには、次のように記述して読み込む必要があります。
import MyPackage.MyClass;
すべての参照に完全な修飾子がある場合でも同様です(完全な名前MyPackage.MyClass
を使用する場合)。ActionScript 3.0では、import
ステートメントは別のパッケージのクラス定義を使うために使用しますが、ActionScript 2.0 では省略名を作成するためのみに使用しました。ActionScript 3.0 では、完全なクラス名はあいまいさを避けるためのみに使用され、import
ステートメントに置き換えられません。
次のようにワイルドカード文字(*)を使用して、パッケージのすべての定義をインポートすることもできます。
import MyPackage.*;
コードでどの定義を使用するのかを明確にするため、定義を個別にインポートするほうが適切です。
- メソッドのオーバーライドに常にマークが付きます。この
override
キーワードは、オーバーライドされるメソッドに誤った名前やメソッドのシグネチャを指定する、またはオーバーライドされるメソッドの名前が変更されるなど、メソッドのオーバーライドのよくある問題を避けるために役立ちます。また、コードを見たときにメソッドがオーバーライドされることがはっきりとわかります。メソッドが別のメソッドをオーバーライドするかどうかがわかっているので、コンパイラでより有効な検証を行うことができます。ActionScript 3.0の
override
キーワードは、C#のoverride
キーワードをヒントに採用されました。 - 関数で戻り値の型を宣言します。関数の戻り値の型を宣言することをお勧めします。戻り値の型を省略すると、警告が表示されます。これは型の安全を確保するためで、うっかり戻り値の型を宣言することを忘れて、デフォルトのObject 型が返されることを防ぐことができます。値を返さない関数の場合は、戻り値の型を
void
として宣言します。 - 代理が言語に組み込まれたので、イベント送信が簡単になりました。ActionScript 2.0ではイベントをメソッドに渡すには、
mx.utils.Delegate
クラスを使用するか、それに代わる方法が必要でした。
import mx.utils.Delegate;
myButton.addEventListener("click", Delegate.create(this, onClick));
ActionScript 3.0では、メソッドの参照に抽出元のオブジェクトインスタンスが自動的に保存されます。これはメソッドのクロージャと呼ばれます。要するに自動代理です。次のように簡単なコードを記述するだけです。
myButton.addEventListener("click", onClick);
- Nullまたは未定義の参照のデリファレンスによって、例外が返されます。Nullまたは未定義の参照のデリファレンスは、従来の ActionScript では無視され、未定義として評価されました。新しいActionScriptではTypeError例外が返されます。これまではエラーメッセージが返されませんでしたが、不用意にNullや未定義の参照をデリファレンスしないようにご注意ください。新しいActionScriptでは、ECMAScript仕様に従って例外が返されます。
-verbose-stacktraces
および-debug
オプションを使用できます。-verbose-stacktraces
および-debug
コマンドラインオプションを使用してコンパイルすると、ファイル名と行番号がFlash Playerの実行時警告に表示されます。実行時エラーが発生すると、エラーの内容とエラーが発生した呼び出しスタックがダイアログボックスに表示されます。次に、-verbose-stacktraces
および-debug
オプションを使用すると、コードのエラーの原因となった部分を簡単に特定できます。- プロパティを明示的にバインド可能として宣言します。デフォルトでプロパティがバインド可能ではなくなりました。
[Bindable]
メタデータタグを使用して、バインド可能として宣言する必要があります。 - Flash Player APIのパッケージが再編成されました。以前はFlash Player APIのクラスと関数はすべてglobalでした。新しいバージョンでは、flash.display、flash.events、flash.uiなど多数のパッケージになりました。たとえば、MovieClipは
flash.display.MovieClip
になり、getTimer
およびsetInterval
はflash.utilsパッケージに移動しました。 - setInterval/setTimeoutの代わりに新しいTimerクラスを使用します。この新しい
Timer
クラスはタイマーイベントのメカニズムとしてsetInterval
およびsetTimeout
関数より優れています。新しいTimer
クラスがsetInterval
より優れている点として、例えば、インターバルID番号を扱う必要がなく、先進的なオブジェクト指向のインタフェースを使用できます。setInterval
とsetTimeout
の代わりにTimer
を使用することをお勧めします。 - サブクラスイベントを使用します。イベントの型が明確になりました。また、イベントを新しい
Event
基本クラスのサブクラスにする必要があります。新しいEvent
クラスによって、イベントシステムがより明確で効率的になります。ただし、これによってイベントの送信時にObject
クラスの汎用インスタンスを使用できなくなり、{type: 'customEvent' }
などのオブジェクトリテラルの省略名を使用できなくなります。汎用
Object
クラスを作成する代わりに、Event
クラス(dispatchEvent(new Event('myCustomEventType')
など)を使用します。さらにプロパティを渡す場合は、Event
をサブクラス化する必要があります。Object
を使用しない理由は、型の安全を確保し、効率を高めるためです。 - ビジュアルエレメントの場合は
DisplayObject
を拡張する必要があり、他のクラスと同様に定義できます。newを使用してコンポーネントをダイナミックに作成して、addChild
で表示リストに追加できるようになりました。これにより、createChild
は不要になりました。TextField
などのビジュアルエンティティを、他のオブジェクトと同様にインスタンス化して、addChild
やaddChildAt
を使用して容易に表示リストに追加できます。これによって、createEmptyMovieClip
やcreateTextField
など、一部のAPIがなくなります。new TextField
を作成するには、createTextField
ではなくnew TextField
を使用します。 - FlashでXMLを操作する場合は、E4X(ECMAScript for XML)を使用することをお勧めします。E4Xは従来のFlashのXMLクラスよりもはるかに強力で、言語に適切に統合されており、数多くの新機能を備えています。従来のFlashのXMLクラスも引き続き使用することができます。従来のXMLAPIはXMLDocumentという新しい名前でflash.xmlパッケージに含まれています。
- E4Xを使用する際には、E4Xを使用する際には、
toXMLString
メソッドを使用します。toString
メソッドは、オブジェクトの完全なXMLマークアップを返すとは限りません。完全なXMLマークアップが必要な場合は、toXMLString
メソッドを使用します。toString
メソッドは、XMLオブジェクトの有用な文字列値を返します。XMLオブジェクト全体をシリアル化する必要はありません。XMLマークアップを取得するには、toXMLString
メソッドを呼び出します。 for...in
ループを使用して、クラスによって宣言されたプロパティとメソッドを列挙できなくなりました。列挙できるのはオブジェクトの動的プロパティだけです。ActionScript 3.0は、describeType
という、オブジェクトの内容を調べる先進的なメカニズムを備えています。これを使用してActionScript 3.0のオブジェクトの内容を確認してください。- SWFファイルのルートオブジェクトを好みのカスタムクラスのインスタンスにすることができます。ActionScript 2.0では、SWFファイルのルートオブジェクトは常に
MovieClip
クラスのオブジェクトでした。ActionScript 3.0では、Spriteの任意のサブクラスにできます。クラス定義をSWFファイルのSWFファイルのDocumentRoot
に設定することができます。ロードされる際に、SWFファイルによってそのクラスのインスタンスが作成され、ルートオブジェクトとして機能します。
この記事で取り上げる話題を提案してくれた開発者コミュニティの皆様に感謝します。ここで取り上げた内容はあくまで概要ですが、ActionScript 3.0を初めて使用する際の基本として役に立つでしょう。 他のオブジェクト指向言語の十分な知識がある方には、ここで取り上げたヒントはあまり必要ないかもしれません。ActionScript 3.0を使用するときにも、他の言語を使用するために学んだ知識をすぐに活用できるでしょう。—
オブジェクト指向プログラミングとActionScript 3.0に初めて触れる方の場合は、このヒントが役に立つでしょう。手元において、ぜひご活用ください。皆様のご活躍をお祈りいたします。