1

マジック メソッドの getter と setter について質問があります。

私の質問は次のとおりです。どちらが優れていますか (より速く、より安全)?

PS これは ActionScript 3 ですが、PHP、JavaScript、C# などの他の言語についても質問に答えることができます。

ケース1

    public class Test extends Sprite
    {
        private var _test : uint = 0;

        public function Test()
        {
            start();
        }

        private function start() : void
        {
            trace(_test); ** Take the private var _test **
        }

        public function set test(value : uint) : void
        {
            _test = value;
            start();
        }

        public function get test() : uint
        {
            return _test;
        }
   }

またはケース2

    public class Test extends Sprite
    {
        private var _test : uint = 0;

        public function Test()
        {
            start();
        }

        private function start() : void
        {
            trace(test); ** difference here, take the public function test **
        }

        public function set test(value : uint) : void
        {
            _test = value;
            start();
        }

        public function get test() : uint
        {
            return _test;
        }
   }

最良の(最速の)方法は何ですか?

ありがとう!

4

2 に答える 2

5

独自のテスト ケースを記述して自分自身を調べる方法の約 90% です。

ゲッターとセッターは、プロパティが設定または取得されたときに何が起こるかを制御したり、読み取り専用または書き込み専用のプロパティを作成したりすることを目的としています。

これらの利点は、考えられるパフォーマンスの違いをはるかに上回ります。


これらのパフォーマンスの違いについては、テスト環境を次に示します。

// Test property.
var _test:uint = 0;
function get test():uint{ return _test; }
function set test(value:uint):void{ _test = value; }

// Direct access test.
function directTest(amt:int):Number
{
    // Directly accessing the property.
    var t:Number = getTimer();
    for(var i:int = 0; i < amt; i++)
    {
        var temp:uint = _test;
        _test = i;
    }

    return getTimer() - t;
}


// Getter/setter test.
function viaTest(amt:int):Number
{
    // Via getter/setter.
    var t:Number = getTimer();
    for(var i:int = 0; i < amt; i++)
    {
        var temp:uint = test;
        test = i;
    }

    return getTimer() - t;
}

これを使用する方法の簡単なデモ:

trace("Direct: " + directTest(1000000));
trace("Getter/Setter: " + viaTest(1000000));

そして、私が得たいくつかの結果:

Amount      Direct      Get/Set
1000        0           0
5000        0           0
20,000      0           2
150,000     1           14
500,000     2           46
2,000,000   10          184
10,000,000  47          921
于 2012-07-06T07:13:22.530 に答える
2

私は常に getter と setter を宣言されている同じクラスのメソッドにも使用することを好みます (ただし、プライベート変数を使用することもできます)。

ゲッターとセッターは、クラス プロパティを設定または取得する必要があるときに必要なロジックを非表示にするため、クライアント メソッドへの影響を心配することなく、セッター/ゲッター内で「実際に行うこと」を変更できます。

また、コードの繰り返しも避けます。

しかし、これは私の見解です... :)

于 2012-07-06T07:27:21.890 に答える