2

アプリケーションのデータ モデルの厳密に型指定されたプロキシ クラスを生成できるフレームワーク、できれば Flex コンパイラに拡張機能またはビルド ステップを実行させる何らかの方法を知っている人はいますか。

プロキシでやりたいことは主に 2 つあります。

  1. 実行時に、アクセスされたインスタンスを遅延解析してインスタンス化する必要があります (Java の Hibernate に Lazy プロキシ オブジェクトがあるのと同様)。
  2. エディター アプリケーションでは、setter 呼び出しを実装して、どのオブジェクトが変更されたかを追跡できるようにします。
    • 「参照キー」が変更されたときに参照しているオブジェクトを保存することがわかるように、配列の追加/削除を追跡し、場合によっては「参照」オブジェクトを追跡する必要があるため、ChangeWatcher のプログラムによる設定などを超えて、この状況ではプロキシが本当に必要です。それをキーで

最初のケースでは、そのオブジェクトがシリアル化されたデータからロードされるときにプロキシが基本的に抽象化するようにしますが、それが実際のオブジェクトである場合は、同じパブリック プロパティとデータ アクセス パターンを使用して参照を渡します。

基本的に、プロキシは、メソッドが最初に呼び出されたときにオブジェクトをインスタンス化します。

as3-commons-bytecode のような AS3 バイトコード ライブラリを使用できることはわかっています。

または、GraniteDS コード生成を転用する可能性があります。

それは決定論的なものであり、実行時に簡単にデバッグする方法があればいいので、コードを生成したいと思います。

MXMLC が MXML ファイルから AS3 コードを生成するときに、MXMLC のようなことができるかどうかは誰にもわかりません。

また、コンパイル パイプラインで「いつ」を制御する方法もありますか?これは、getter/setter の代わりにパブリック フィールドを使用するデータ オブジェクトがたくさんあるため、コードを生成できますが、[バインド可能] であり、プロキシ ベースを生成できれば動作する生成された getter/setter メソッドについて。

アプリケーション データ オブジェクトとプロキシ クラスの例を次に示します。

[Bindable]
public class PersonDTO implements Serializable {
    private var _name:String;

    private var _age:Number


    public function get age():Number {
        return _age;
    }

    public function set age(a:Number):void {
        _age = a;
    }

    public function get name():String {
        return _name;
    }

    public function set name(n:String):void {
        _name = n;
    }

    public void readObject(data:*) {
        //...
    }

}

// GENERATED CLASS BASED ON PersonDTO
public class LazyProxy_PersonDTO extends PersonDTO {

    private var _instance:PersonDTO = null;
    private var _instanceData:*;

    private function getInstance():void {
        if (_instance == null) {
            _instance = new PersonDTO();
            _instance.readObject(_instanceData);
        }
    }

    override public function get age():Number {
        //Ensure object is instantiated
        return getInstance().age;
    }

    override public function get name():String {
        //Ensure object is instantiated
        return getInstance().name;
    }

}

// GENERATED CLASS BASED ON PersonDTO
public class LogChangeProxy_PersonDTO extends PersonDTO {

    //This will be set in the application
    public var instance:PersonDTO;

    //set by application
    public var dirtyWatcher:DirtyWatcherManager;

    override public function set age(a:Number):void {
        dirtyWatcher.markAsDirty(instance);
        instance.age = a;
    }

}
4

1 に答える 1

2

AS3-Commons バイト コード ライブラリをもう少し掘り下げてみると、プロキシ クラスとインターセプターの生成をサポートしているようです。

  • http://www.as3commons.org/as3-commons-bytecode/proxy.html

    public class DirtyUpdateInterceptor implements IInterceptor {
    
    public function DirtyUpdateInterceptor() {
        super();
    }
    
    public function intercept(invocation:IMethodInvocation):void {
        if (invocation.kind === MethodInvocationKind.SETTER) {
            if (invocation.arguments[0] != invocation.instance[invocation.targetMember]) {
                invocation.instance.isDirty = true;
            }
        }
    }
    }
    
于 2011-11-22T17:54:39.870 に答える