OOP-Frage: Objekte in Listen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • OOP-Frage: Objekte in Listen

    Hallo,

    wie auf den meisten Webseite, will ich auch auf meiner eine Liste anzeigen. Genauer gesagt: eine DVD-Liste.

    Hierfür habe ich zwei Klassen angedacht:

    1) Dvd (id, titel, beschreibung, darsteller[], ...)
    2) DvdListe (enthält im wesentlichen ein Array mit Dvd-Objekten)

    Jetzt dachte ich, wäre es ja ziemlich cool, wenn man noch über die DvdListe iterieren kann, was ja dank Iterator-Interface kein Problem ist.

    Meine Frage ist jetzt, wie bekomme ich die DVD-Daten (id, titel, ...) aus meiner Datenbank am geschicktesten in Dvd-Objekte und damit in die Dvd-Liste?

    Ich dachte an sowas:

    while($row = mysql_fetch_object($res))
    $dvdliste->addDvd(new Dvd($row))

    Ist das sinnvoll?

    Wenn ich das Dvd-Objekt dann auch auf einer "Detailseite" verwenden will, wäre das ganz schick. Aber dort benöigt das Objekt viel mehr Daten (z.B. aus Darsteller, etc), die evtl. auch aus mehreren Abfragen zustande kommen. Wie gehe ich damit sinnvoll um?
    ICH BIN ICH!!!

  • #2
    Guten Morgen,

    zunächst sehe ich jetzt kein Problem beim Befüllen Deiner Liste. Das sollte so funktionieren.

    Jedes DVD Objekt ist im Sinne von OOP also ein Daten Model. Dieses Model solltest Du so gestalten, dass es auch mit der individuellen ID eines Datensatzes arbeiten kann. So sollte der Contructor des DVD Datenobjektes unterscheiden können, ob es sich um eine ID eines individuellen Datensatzes oder um ein komplettes Rowset handelt. So kannst Du mit einer ID auf Deine Detailseite verlinken und anhand Deiner ID kannst Du dann alle Daten, die Du für die Detailseite benötigst, ermitteln.

    Kurzes Beispiel:
    PHP-Code:
    class Dvd extends DataModel {
        protected 
    $sqlSelects '';
        protected 
    $sqlJoins '';
        
    /**
         * Erzeugt ein neues DVD Datenmodel
         * @param integer $id Individuelle ID eines Datensatzes
         * @param array $rowset Bestehendes Rowset
         */
        
    public function __construct($id null$rowset null) {
            if (
    $rowset === null) {
                
    // Hier dann die Datenbankabfrage anhand der ID
                
    ...
                
    $rowset $stmt->fetch(PDO::FETCH_ASSOC);
            }
            
    parent::__construct($rowset);
        }

    Der Einfachheit halber könntest Du nun abhängige Objekte für Deine Detailansicht erzeugen, um zusätzliche Daten zur DVD auszulesen.

    Primitives Beispiel für Deine Darsteller:
    PHP-Code:
    class DvdActors extends Dvd {
        public function 
    __construct($dvdID) {
            
    $this->sqlSelects.= ",actor.id, actor.name";
            
    $this->sqlJoins.= "LEFT JOIN actor_table AS actor ON (actor.dvdID = dvd.id)";
            
    parent::__construct($dvdID);
        }

    Zumindest würde ich das so als sinnvoll betrachten ...
    MM Newmedia | MeinBlog

    Kommentar


    • #3
      Hallo,

      ich würde etwas mehr zwischen reinen Datenklassen und speziellen Model-Klassen unterscheiden. Die Modelklasse für MySQL kann man von PDO ableiten und die kann dann Instanzen von DVD, DVDActor u. s. w. befüllen und Methoden wie z. B. findDVD() und saveDVD() bereitstellen. Diese Klassen sind aber dann reine Datenklassen, die nur Getter und Setter besitzen und damit lediglich als komplexe Datentypen dienen.

      Das Problem an ezkimos Ansatz ist, dass bei Änderungen an der Datenbank, beim Austausch des DBMS oder auch bei der Umstellung auf eine ganz andere Datenbasis (Webservice, CouchDB, CSV, ...) alle diese Klassen umgeschrieben werden müssen. Wenn es dagegen reine Datenklassen sind, kann man sie weiterverwenden und nur die Model-Klasse ändern, welche sie befüllt.

      Gruß,

      Amica
      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
      Super, danke!
      [/COLOR]

      Kommentar


      • #4
        Hör auf Amica, ich würd's genau so machen.

        Grundsätzlich habe ich mir angewöhnt rein lesende und dann manipulierende Daten-Objekte zu erstellen, die von den rein lesenden vererbt werden. Die Datenobjekte sind, wie Amica es bereits sagte, mit vielerlei anderen Gegebenheiten verbunden. Ein Cache System wäre zum Beispiel auch denkbar.
        MM Newmedia | MeinBlog

        Kommentar


        • #5
          @AmicaNoctis

          Hallo,

          könntest Du das mit den Daten- und Modelklassen etwas genauer beschreiben oder vielleicht an einer einfachen Beispielimplementierung veranschaulichen? Das würde mich sehr interessieren, da ich gerade als OOP-Anfänger vor ähnlichen Fragen wie "IchBinIch" stehe und mir nicht sicher bin ob ich die von Dir beschriebene Vorgehensweise richtig verstanden habe.

          Vielen Dank im Voraus.

          Gruß
          [FONT=&quot]jack[/FONT]
          Zuletzt geändert von jack88; 26.04.2012, 08:41.

          Kommentar

          Lädt...
          X