3 Stimmen

Objektliteral mit Konstanten als Schlüssel (in Schlüssel-Wert-Paar)

Ich habe eine Klasse, die einige Konstanten enthält und eine wörtliches Objekt (assoziatives Array) mit einigen Daten wie diesem:

var ConfigObj:Config = new Config({
    "Some" : 10,
    "Other" : 3,
    "Another" : 5
});

Die Klasse sieht folgendermaßen aus:

public dynamic class Config
{
    static public const SomeProperty:String = "Some";
    static public const OtherProperty:String = "OtherProperty";
    static public const AnotherProperty:String = "AnotherProperty";

    public function Config(settings:Object)
    {
        // Doing some stuff here
    }
}

Das Problem ist, wie kann ich die Konstanten als Tasten wie diese:

var ConfigObj:Config = new Config({
    Config.SomeProperty : 10,
    Config.OtherProperty : 3,
    Config.AnotherProperty : 5
});

Außerdem möchte ich es nach Möglichkeit inline halten.

var MyObj:MyClass = new MyClass({x:1, y:2, z:3});

ist für mich viel besser als:

var Temp:Object = new Object();
Temp.x = 1; // Or Temp[x] = 1;
Temp.y = 2; // Or Temp[y] = 2;
Temp.z = 3; // Or Temp[z] = 3;

var MyObj:MyClass = new MyClass(Temp);

3voto

zzzzBov Punkte 166065

Ich habe das Gefühl, dass Sie Ihr Konfigurationsobjekt zu sehr verkomplizieren. Wenn Sie jedoch Konstanten verwenden möchten, um Schlüssel-Wert-Paare zu setzen, müssen Sie eine temporäre Variable verwenden:

var o:Object, configObj:Config;
o = {};
o[Config.SomeProperty] = 'foo';
o[Config.OtherProperty] = 'bar';
o[Config.AnotherProperty] = 'baz';

configObj = new Config( o );

Eine wichtige Frage ist, ob diese Eigenschaften wirklich konstant sind. Wenn dies der Fall ist, besteht kaum ein Risiko bei der Verwendung des String-Literales, wenn Sie das Objekt instanziieren:

new Config( { 'SomeProperty':'foo', 'OtherProperty':'bar', 'AnotherProperty':'baz' } );

Natürlich ist dies ist nicht flexibel, wenn sich die Werte in den Konstanten ändern.

0voto

Patrick Punkte 15622

Wenn Sie die Typüberprüfung und die Benennung von Parametern erzwingen wollen, sollten Sie nicht mit einem dynamic class oder die Übergabe einer Object aber Sie sollten einen Code Config class mit all den Möglichkeiten, die es gibt. Die Rückgabe der Config class während das Setzen eines Paremeters es Ihnen ermöglicht, den Aufruf zu inlinen. Es erfordert mehr Arbeiten, aber es ist sicherer IMHO.

Ex:

class Config {
    protected var _somePropertySet:Boolean
    public function get isSomePropertySet():Boolean{
        return _somePropertySet
    }
    protected var _someProperty:String;
    public function setSomeProperty(value:String):Config{
        _somePropertySet=true
        _someProperty = value
        return this
    }
    public function get someProperty():String{
        return _someProperty
    }

    protected var _someOtherPropertySet:Boolean
    public function get isSomeOtherPropertySet():Boolean{
        return _someOtherPropertySet
    }
    protected var _someOtherProperty:int;
    public function setSomeOtherProperty(value:int):Config{
        _someOtherPropertySet=true
        _someOtherProperty = value
        return this
    }

    protected var _someAnotherPropertySet:Boolean
    public function get isSomeAnotherPropertySet():Boolean{
        return _someAnotherPropertySet
    }
    protected var _someAnotherProperty:Object;
    public function setSomeAnotherProperty(value:Object):Config{
        _someAnotherPropertySet=true
        _someAnotherProperty = value
        return this
    }
}

class Tmp {
    public function Tmp(config:Config) {
        initFromConfig(config)
    }

    protected function initFromConfig(config:Config):void {
        if (config.isSomePropertySet){
            //..
        }
        if (config.isSomeOtherPropertySet){
            //..
        }
        if (config.isSomeAnotherPropertySet){
            //..
        }
    }
}
var t:Tmp=new Tmp(new Config().setSomeProperty("foo").setSomeOtherProperty(5).setSomeAnotherProperty(null))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X