あんまりスマートじゃないかもしれないけどnamespaceでテストサーバーと本番サーバーを切り替えるような処理をスッキリ記述する方法です。

APIなどのURIを入れるStaticな定数クラスを作ります。そのときアクセス用のStaticフィールドへ同名のnamespaceつきの内部的な定数を代入するようにしておきます。フィールド部分でnamespaceを切り替えるとすべての定数が入れ替わるので、この定数クラスの利用側からはどちらのnamespaceかまったく意識する必要がありません。Debugフラグなどの分岐など不要になりロジック部分の見た目的にはスッキリします。

ただし、中身ではなんだか泥臭い方法に思えるのこの手のアプローチででもっといい方法があれば知りたいです。

namespaceは便利そうなんですがそれ自体の資料がXML関連のものばかりで、あまり他の効果的な利用方法が見当たらないのが残念ですね。参考になるのはProgressionのインターナルなnamespaceとか、AS3UnitのTestメソッドのラベル付けとかくらい?

//定数クラス package{ import flash.errors.IllegalOperationError; public class API { // 宣言だけでよい private namespace www; private namespace test; private namespace local; // それぞれの値 www static const _IMAGES_XML:String = "/swf/images/data.xml"; test static const _IMAGES_XML:String = "./images/data.xml"; local static const _IMAGES_XML:String = "./images/data_debug.xml"; www static const _DETAIL_XML:String = "/swf/images/detail.xml"; test static const _DETAIL_XML:String = "./images/detail.xml"; local static const _DETAIL_XML:String = "./images/detail_debug.xml"; // ここで切り替えておく use namespace local; public static const IMAGE_XML:String = _IMAGES_XML; public static const DETAIL_XML:String = _DETAIL_XML; public function API() { throw new IllegalOperationError( "APIはインスタンスを作れません。" ); } } }

//利用側 package{ import flash.display.*; import flash.events.*; import jp.progression.commands.*; public class Main extends Sprite { public function Main() { var loading:CommandList = new SerialList( null, new LoadURL( new URLRequest( API.IMAGES_XML ) ), function () { var command:CommandList = this.parent; trace( command ); var xmldata :XML = new XML( this.latestData ); for each( var img:XML in images ) { //command.insertCommand( new LoadChild( img.@src ) ); } }, new Trace( "complete!" ) ); loading.execute(); } } }

<追記>

あー場合によってはこういうやりかたのがスマートかも→ What is Flash for you?

HTML5飯