2016-04-26 12 views
1

In meiner Anwendung habe ich einen Schlüssel-Wert-Speicher bekam die Benutzerkonfiguration (a la Apache Commons Configuration) implementiert:Zwingende qx.core.Object # binden

var config = new Configuration(); 
config.set("foo.bar", "baz"); 
config.get("foo.bar"); // "baz" 

Gepunktete Namen verwendet werden Konfiguration einführen Hierarchie. Ich möchte auch, dass Folgendes funktioniert:

config.bind("foo.bar", target, "property.chain"); 

Die Idee hier ist, traditionelle Qooxdoo Bindungssemantik zu verwenden; Der Unterschied ist, "foo.bar" bezeichnet keine echte Eigentumskette, es ist nur ein Schlüsselname.

Wie soll ich das umsetzen? Ist es in Ordnung, qx.core.Object#bind mit meiner Implementierung vollständig zu überschreiben? Oder sollte ich die Interna der Configuration-Klasse so modellieren, dass der Standard qx.core.Object#bind (delegiert an qx.data.SingleValueBinding) funktionieren würde? Das zweite Szenario würde wahrscheinlich einige generierte Klassen beinhalten (ähnlich wie bei qx.data.marshal.Json#toClass), um Schlüsselnamen mit realen Eigenschaften wiederzugeben. Ehrlich gesagt, scheint es mir ein bisschen komplex zu sein. Was denken Sie?

Antwort

3

den Bindungsmechanismus zu ersetzen, ist keine triviale Aufgabe, aber es würde unidirektional sein - zum Beispiel, während Sie binden außer Kraft setzen könnten() Bindung von Ihre Konfiguration zu ermöglichen, würden Sie nicht in der Lage sein, von einer Eigenschaft zu binden zurück in die Konfiguration. Offensichtlich hängt es von Ihrer Anwendung ab, ob dies nützlich ist, aber (zum Beispiel) wenn Sie eine Konfigurationseditor-Benutzeroberfläche erstellen wollten, würde die Standardformularbindung einfach nicht funktionieren.

Alternativ können Sie Ihr Konfigurationsobjekt als eine tatsächliche Klasse erstellen und dies hat mehrere Vorteile - bi-direktionale Bindung funktioniert, Sie können Eigenschaften mit erzwungenen Datentypen, Ereignisse, Methoden anwenden, können Sie die Struktur mit Reflektion überprüfen, usw.

auf der anderen Seite ist es oft sehr nützlich, die Lage sein, einfache Einstellungen zu erstellen (und vergessen) ohne eine formale API-Struktur für jeden erstellen zu müssen.

Also kann Ihre Laufleistung variieren, weil es von den Daten abhängt, die Sie speichern möchten, und wenn Ihre Anwendung komplexer wird, können die Daten, die Sie speichern möchten, auch komplexer und schwieriger zu speichern sein String/Wert-Paare.