2

問題は、メソッドまたは変数内の変数を呼び出す前に、変数が null かどうかを確認することです。

if(order && order.reference && order.reference.quote)
{
   var length:int = order.reference.quote.findLength();
}

最後のオブジェクト変数までの null ポインターをチェックする任意のオブジェクトで使用できる関数があれば素晴らしいと思いませんか。

すなわち

     // This would check first if order, then order.reference, then order.reference.quote      
    //was null
    if(NullUtil.notNull(order.reference.quote))
    {
        .....
    }

何か案は?

4

2 に答える 2

3

他の一部の言語では、次のような存在アクセサー演算子を使用します?.( CoffeeScriptを参照) 。

パフォーマンスについてあまり心配していない場合は、次のようにすることができます。

function notNull(object:*, properties:String):Boolean
{
    if (object == null) return false;
    var props:Array = properties.split(".")
    for(var i:uint = 0; i < props.length; i++)
    {
        if(object[props[i]] == null) return false;
        object = object[props[i]]
    }

    return true;
}

そして、それを次のように使用します。notNull(order, "reference.quote");

しかし、それはあまりきれいではありませんが、おそらく魔法で少しきれいにすることができます.Proxy

たとえば、次のコードを考えてみましょう。

import flash.utils.Proxy;
import flash.utils.flash_proxy;

dynamic class Existential extends Proxy {

    private var _object:*;


    public function Existential(object:*) {
        _object = object;
    }

    flash_proxy override function getProperty(name:*):* {
        var object:* = _object;

        if (object == null) return null;

        var props:Array = name.toString().split("$");

        for(var i:uint = 0; i < props.length; i++)
        {
            if(object[props[i]] == null) return null;
            object = object[props[i]]
        }

        return object;
    }
}

その後、それを使用して他のオブジェクトをラップし、その場しのぎの存在ゲッターとして$ではなく、それらを使用してそれらにアクセスできます。.

    obj = {};
    eObj = new Existential(obj);
    eObj.what$is$this // null

    obj = { what: { "is":  { "this": 1 } } } ;
    eObj = new Existential(obj);
    eObj.what$is$this  // 1 

しかし、パフォーマンスはひどいものになると思います。パフォーマンスが重要な製品コードには使用したくありません。しかし、それはあなたにいくつかのアイデアを与えるかもしれません。

于 2013-04-23T16:23:45.097 に答える