2

あらすじ

  1. useステートメントを使用している間、名前空間で変数をどのように宣言しますか?(つまり、変数名で名前空間を宣言せずに)
  2. コンテナ参照なしで「use」ステートメントを使用して名前空間変数をどのように参照しますか。(つまり、 [すでに名前空間に切り替えた後でこれを述べなければならない場合は、ちょっと無意味に思えます] trace(foo)trace(a.foo)

説明

Grant Skinnerの「名前空間を使用するための完全なガイド」や、JacksonDustanの「BetterOOPThrough Namespaces」などの他の記事を読んだ後、上記の未回答の質問が残っています。基本的な原則が欠けているように感じますが、名前空間を機能させることができないようです。次の例は、Flash IDEで使用するために作成されているため、次のように想定します...


locus.as

package com.atriace {
    public namespace locus = "atriace.com";
}


testA.as

package com.atriace {
    public class testA {
        import com.atriace.locus;
        locus var foo:String = "Apple";

        public function testA() {}
    }
}


testB.as

package com.atriace {
    public class testB {
        import com.atriace.locus;
        use namespace locus;

        public function testB() {
            trace(foo);
        }
    }
}


ドキュメントクラス:

import com.atriace.testA;
import com.atriace.testB;

var a:testA = new testA();
trace(a.foo); // results in "Apple"

var b:testB = new testB(); // compile error: variable "foo" not defined.


第1号

私の考えでは、名前空間は、スコープレベルのアクセス権を持つ変数を保持するためのオブジェクトにすぎません。Ergo、globalはすべての関数に表示される名前空間(ルートスコープであるため)、localは名前空間(現在のスコープと子スコープに固有)などです。trueの場合、で名前空間に切り替えるとuse、ローカル名前空間とカスタム名前空間の両方にたまたま存在する変数を簡単に宣言できるようになります。例えば:

use namespace locus
var bar:String = "test"; // this now *should* exist in both local & locus scope/namespace.

通常のオブジェクトのように名前空間を反復処理するメソッドを知らないので、これが何が起こるかわかりません。さらに、誰かがこの方法でカスタム名前空間変数を宣言した例は見たことがないので、名前空間変数は常に明示的に定義する必要があると思います。


第2号

「ここでの目標は何ですか?」と尋ねるかもしれません。簡単に言うと、新しいクラスが(同じパッケージ内で)追加できる変数とメソッドの動的プールが必要です。メソッドを呼び出す前にこの名前空間に切り替えることで、コードの冗長性を減らすことができます。だから、class.method()ちょうどになりますmethod()

testB.asではtestA.asクラスをインポートしてインスタンス化したことがない場合、エラーが発生することが完全に予想されます。特にfooはクラスの静的メンバーではないためです(また、そうする必要もありません)。ただし、少なくとも1回はfooをインスタンス化したので、名前空間にlocusは、という変数が必要ですfoo。つまり、testB.asがインスタンス化され、コンストラクターがfooの値を探すとき、名前空間にはすでに1つの値があります。

明らかに、Flashコンパイラはfoo宣言されていないことを訴えるので、この考え方には欠陥がありfooます。ドキュメントクラスから参照できる唯一の方法は、コンテナを参照することです(つまり、a.foo使用して名前空間に切り替えるのではなく、foo直接トレース)。

議論のために、継承も静的メンバーもこのジレンマの解決策ではありません。これは、より優れたコード手法を学ぶための演習であると同時に、複雑な依存関係を持つ大規模なユーティリティクラスの構造に対する答えでもあります。変数/メソッドがない場合は、単純にその周りをコーディングできます。


私はそれがあまり文書化されていないトピックであることを知っています。それが私がここにいる賢人が私が欠けているものを見るかもしれないことを望んでいる理由です。助けていただければ幸いです。:)

4

1 に答える 1

1

「usenamespace」はコンシューマー側用です。宣言には常に名前空間を含める必要があります。

MyNamespace var foobar:uint;

名前空間化されたパッケージグローバル変数を追加する場合(一般的なルールとしてはいけません)、パッケージはファイルごとに1つの公開定義のみを許可するため、それぞれを個別の.asファイルで定義する必要があります-レベル。

上記の例では、名前空間を誤って使用しています。名前空間は複数のクラスにまたがることができますが、探しているクラス間機能を実現することはできません。これは、アスペクト指向プログラミングの領域です。

于 2012-07-10T15:25:05.467 に答える