作成日

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番号を扱う必要がなく、先進的なオブジェクト指向のインタフェースを使用できます。setIntervalsetTimeoutの代わりにTimerを使用することをお勧めします。
  • サブクラスイベントを使用します。イベントの型が明確になりました。また、イベントを新しいEvent基本クラスのサブクラスにする必要があります。新しいEventクラスによって、イベントシステムがより明確で効率的になります。ただし、これによってイベントの送信時にObjectクラスの汎用インスタンスを使用できなくなり、{type: 'customEvent' }などのオブジェクトリテラルの省略名を使用できなくなります。

    汎用Objectクラスを作成する代わりに、Eventクラス(dispatchEvent(new Event('myCustomEventType')など)を使用します。さらにプロパティを渡す場合は、Eventをサブクラス化する必要があります。Objectを使用しない理由は、型の安全を確保し、効率を高めるためです。

  • ビジュアルエレメントの場合はDisplayObjectを拡張する必要があり、他のクラスと同様に定義できます。newを使用してコンポーネントをダイナミックに作成して、addChildで表示リストに追加できるようになりました。これにより、createChildは不要になりました。TextFieldなどのビジュアルエンティティを、他のオブジェクトと同様にインスタンス化して、addChildaddChildAtを使用して容易に表示リストに追加できます。これによって、createEmptyMovieClipcreateTextFieldなど、一部の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に初めて触れる方の場合は、このヒントが役に立つでしょう。手元において、ぜひご活用ください。皆様のご活躍をお祈りいたします。