Die Frage die ich im vorherigen Post meinte ist, wie die Überschrift schon sagt: „Wer befüllt/initalisiert ein Daten Objekt“. Mit Daten Objekte meine ich Objekte, welche zum größten Teil einfach nur Daten beinhalten. Solche Objekte sind ziemlich einfach „unabhängig“ zu programmieren. Ich glaube, solche Objekte werden im anderen Kontext als Beans oder POJOs bezeichnet.

Als Beispiel nehm ich mal eine „Gästebuch Anwendung“ und die darin verwendeten Objekte von der Klasse „Eintrag“. Ein Einträg enthält natürlich den Eintrag Text selbst, dann den Namen des Schreibers, vielleicht noch seine Email Adresse und zu guter letzt noch ein Datum. Bevor diese Infos aus der Datenquelle in HTML oder sonstiges Ausgabeformat umgewandelt werden, werde diese in das bereits genannte Objekt abgelegt und können dann später bequem ausgelesen werden.

Mein Frage nun im Bezug zum Beispiel: Wer erzeugt die Eintrag Objekte?
Soll das Objekt vielleicht eine Datenbank Verbindung erhalten und sich die Daten selber holen? Das wäre nicht so gut, da diese Klasse dann wieder abhängig von der Datenquelle ist.

Wie wäre es, wenn es eine passende Collection Klasse gibt, welche die einzelnen Objekte erzeugt und mit Daten befüllt? Der Nachteil dieser Lösung wäre aber, dass es dann für jede Datenklasse eine weitere Collection Klasse geben muss. Außerdem wäre dann die Collection Klasse abhängig von der Datenquelle.

Eigentlich sollte die Datenquelle selbst diese Objekte erzeugen – aber wie macht man das bei vielen unterschiedlichen Daten Klassen?

Was wäre, wenn es einen allgemeinen DataLoader gibt? Dieser benötigt nur noch den Typ der Daten Klasse und die Bezeichnungen der Inhalte und könnte anhand dieser Informationen die Daten aus der entsprechenden Datenquelle mappen. (Je nach DatenQuelle müsste ein eigener DataLoader implementiert werden, wobei hier bestimmt wieder Funktionalität in einer abstrakten Klasse ausgelagert werden könnte.) Die entsprechenden Interfaces könnten dann so aussehen:


interface DataObject {
    static function getTypeId();
    static function getDataDescriptions();
    function setData($name, $value);
}
interface DataLoader {
    function getDataObjectCollection($typeId, $filter);
}

Hey – irgendwie gefällt mir dieser Ansatz. Den gibt es bestimmt schon irgendwo da draußen ;) aber es tut gut, nochmal selber drauf zu kommen. Jetzt nur noch mal schauen, wo es vielleicht Probleme/Erweiterungsbedarf gibt:

  1. Was noch fehlt (ich habe es nur durch den Parameter „$filter“ angedeutet), ist eine Einschränkungsmöglichkeit bzw. ein Filter der gesetzt werden kann, damit der DataLoader nicht immer gleich alle verfügbaren Objekte lädt.
  2. Dann gäbe es noch das Problem, dass vielleicht andere Objekte als Werte gesetzt werden müssen. Also das statt „Name“ und „Email-Adresse“ ein User Objekt gesetzt werden soll.
    Ich denke, damit sowas ebenfalls „automatisch“ über den DataLoader funktioniert, muss die „getDataDescriptions“ Methode in einer DataObject Implementierung mehr Infos zurückliefern, als nur die Werte Bezeichnungen. Vielleicht zusätzlich die „typeIds“ der gewünschten Werte.

Ansonsten fällt mir gerade kein weiteres Problem bei dieser Lösung auf. Dir vielleicht?
Oder kennt jemand eine bessere oder andere Lösung?

Advertisements