Das Kefk Network Wiki befindet sich im Testbetrieb.
Key-Value Coding
Aus Kefk.
| Dieser Artikel wurde zur Löschung vorgeschlagen.
Falls du der Autor des Artikels bist, lies dir bitte durch, was ein Löschantrag bedeutet, und entferne diesen Hinweis nicht. |
Begründung: Ähnlich wie Forwarding (Softwareentwicklung) und Key-Value-Observing (beide gelöscht): kein etablierter Begriff der allgemeinen Softwareentwicklung oder objektorientierten Programmierung. --Segg12 15:55, 15. Apr. 2007 (CEST)
Key-Value Coding, abgekürzt KVC, ist ein Konzept aus der objektorientierten Programmierung unter Mac OS X. Hierbei greift der Programmierer auf die Attribute eines Objekts indirekt mittels eines Schlüssels (key) in Form einer Zeichenkette zu. Dies unterscheidet sich von der gängigen objektorientierten Vorgehensweise auf ein Attribut entweder mittels direktem Methodenaufruf (Getter und Setter) oder direkter statischer Adressierung einer öffentlichen Objektvariable zuzugreifen.
Der Schlüssel, oder auch Schlüsselpfad (keypath), bezeichnet dabei die Methode, die Instanzvariable oder einen Schlüssel in einem assoziativen Array, deren Wert ausgelesen werden oder gesetzt werden soll. Der Mechanismus des KVC sorgt dann dafür, dass die richtige Methode aufgerufen, die richtige Instanzvariable referenziert bzw. der richtige Wert aus dem assoziativen Array gewählt wird.
Das Prinzip der Kapselung bleibt mit KVC erhalten: ist ein Getter oder Setter vorhanden, ruft die KVC-Implementation diesen intern auf.
Mit KVC ist eine größere Dynamik im Programmierdesign möglich, da der Schlüsselpfad zur Laufzeit geändert werden kann. Die Freiheit der Dynamik kann sich in einem schlechten Design allerdings auch nachteilig auf die Übersichtlichkeit auswirken. Zudem geschieht dies auf Kosten der Compilersicherheit (compile-time safety).
Inhaltsverzeichnis |
KVC in der Praxis
In der Praxis wird die KVC-Infrastruktur im Rahmen einer Programmbibliothek bzw. eines Frameworks bereitgestellt. Dazu gehören Cocoa (früher OpenStep) und das Java-Foundation-Framework in WebObjects. In Objective-C geschieht dies durch das informelle Protokoll „NSKeyValueCoding“, was die Methoden „– valueForKey:“ und „– setValue:forKey:“ deklariert. Das Java-Gegenstück besteht aus dem Interface „NSKeyValueCoding“ und den Methoden „Object valueForKey(String key)“ und „void takeValueForKey(Object value, String key)“. Zudem gibt es dort das erweiterte Interface „NSKeyValueCodingAdditions“. Die konkrete Implementierung übernehmen in beiden Sprachen entsprechende Klassen der Frameworks.
Nur in Spezialfällen implementiert man KVC selbst und auch dann meist zur Verwendung innerhalb einer existierenden KVC-Infrastruktur.
Beispiele für die Verwendung von KVC
Implementierung einer Data-source-Methode in Objective-C
ohne Key-Value Coding
- (id)tableView:(NSTableView *)tableview
objectValueForTableColumn:(id)column
row:(int)row
{
edibleObject *food = [foodArray objectAtIndex:row];
if ( [[column designator] isEqualToString:@"name"] ) {
return [food name];
}
if ( [[column designator] isEqualToString:@"taste"] ) {
return [food taste];
}
if ( [[column designator] isEqualToString:@"color"] ) {
// etc...
}
// etc...
}
mit Key-Value Coding
- (id)tableView:(NSTableView *)tableview
objectValueForTableColumn:(id)column
row:(int)row
{
edibleObject *food = [foodArray objectAtIndex:row];
return [food valueForKey:[column designator]];
}
Java
Zugriff auf ein gekapseltes Objekt mit Key-Value Coding
Gegeben sei die Klasse Record und die Klasse Dictionary:
import com.webobjects.eocontrol.EOGenericRecord;
/*
* EOGenericRecord implementiert NSKeyValueCoding und NSKeyValueCodingAdditions
*/
public class Record extends EOGenericRecord {
public String username;
public void setUsername(String username) {
this.username = username.toLowerCase();
}
}
import com.webobjects.foundation.NSMutableDictionary;
/*
* NSMutableDictionary implementiert NSKeyValueCoding und NSKeyValueCodingAdditions
*/
public class Dictionary extends NSMutableDictionary {
}
Auf diese Klassen kann nun wie folgt zugegriffen werden:
public class RecordAccess {
public static void test() {
Record record = new Record();
Dictionary dictionary = new Dictionary();
record.takeValueForKey("Meyer", "username");
System.out.println(record.valueForKey("username"));
System.out.println("Der Username ist " + record.valueForKeyPath("username.length") + " Zeichen lang");
dictionary.takeValueForKey("hallo", "usergreeting");
System.out.println(dictionary.valueForKey("usergreeting") + " " + record.valueForKey("username"));
}
}
Der Aufruf von record.takeValueForKey("Meyer", "username") ist äquivalent zu record.setUsername("Meyer"). Verzichtet der Programmierer darauf einen Setter zu implementieren, greift KVC direkt auf die Instanzvariable zu. Das gleiche gilt für Getter, die Methode hierfür würde im Beispiel getUsername() oder username() heißen.
Des Weiteren sieht man die Anwendung des Interfaces NSKeyValueCodingAdditions, indem durch Aufruf von valueForKeyPath() auf die Eigenschaft „length“ der Klasse String zugegriffen werden kann. Die Methode String.length() wird für den Programmierer transparent mittels Reflection aufgerufen.
Außerdem kann Dictionary, da es eine Subklasse von NSMutableDictionary ist, beliebige Key-Value-Kombination aufnehmen, was man am Beispiel „usergreeting“ und „hallo“ sieht.
Zum tatsächlichen Ausführen obigen Codes benötigt man noch ein EOModel, welches eine Entity für Record enthält, sowie folgenden „Boilerplate“-Code:
import com.webobjects.appserver.WOApplication;
public class Application extends WOApplication {
public static void main(String argv[]) {
WOApplication.main(argv, Application.class);
}
public Application() {
super();
RecordAccess.test();
}
}
Siehe auch
Object-Graph Navigation Language
| Dieses Dokument entstammt in seiner ersten oder einer späteren Version der deutschsprachigen Wikipedia. Es ist dort zu finden unter dem Stichwort Key-Value_Coding, die Liste der bisherigen Autoren befindet sich in der Versionsliste; die Originalfassung kann dort auch bearbeitet werden. Alle Texte der Wikipedia und ihre Derivate stehen unter der GNU-Lizenz für freie Dokumentation. |
