Ankündigung

Einklappen
Keine Ankündigung bisher.

Verständnisproblem Klassen Vererbung

Einklappen

Neue Werbung 2019

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

  • Verständnisproblem Klassen Vererbung

    Guten Abend,

    ich komme mit Google & Co nicht weiter und bräuchte mal eine private Beratung um den Knoten im Hirn wieder zu lösen.

    Für ein aktuelle Projekt möchte ich mich mit der OOP vertraut machen. Ich hab schon einige Bereiche auf Klassen umgestellt, weil ich immer wieder mal vor dem Problem stand, das ich einer Funktion immer weitere Parameter zufügen musste und dafür dann gleich immer den ganzen Source umschreiben musste. Dank OOP kann ich einer Klasse ja einfach eine neue Methode zufügen ohne das ich andere Bereiche im Source dafür ändern muss.

    Jetzt versuche ich gerade die Bereiche für das rendern der HTML Elemente zu bereinigen. Dabei möchte ich von Anfang an alles richtig machen und blicke bei der Vererbung nicht ganz durch. Ein Beispiel:

    Eine Klasse Table soll für das handling einer HTML Tabelle herhalten. Die darin enthaltenen Elemente wie z.B. <tr> <td> sollen bei Bedarf globale Attribute erhalten (http://www.w3schools.com/tags/ref_st...attributes.asp). Pseudocodemäßig soll es etwa so aussehen:

    Pseudocode:
    PHP-Code:
    $table = new Table();
    $row $table->body->addRow();
    $row->addClass('clickable-row');
    $row->addData('href','http://www.dasinternetabschalten.de'); 
    Sieht nett aus, aber... um ganz runter zu den Attributen zu kommen müsste ich ja eine Klasse - nennen wir sie Global_Attributes - erstellen, die neben einem Array für die Attribute auch die Funktionen zum setzen/lesen/löschen dieser Attribute hat.
    Diese wird dann an z.B. die Klasse Table_Row oder auch andere Klassen die diese Attribute zulässt (eigentlich fast alles) vererbt

    Pseudocode:
    PHP-Code:
    class Table_Row extends  Global_Attributes {

      private 
    attributes = array();

      public function 
    addClass($name) {
        
    $this->attributes['class'][] = $name;
     }
    ...

    Pseudocode wie gesagt.

    Jetzt mein Verständnisproblem: Angenommen, ich habe eine Tabelle mit 100 Zeilen, dann bekommt jeder dieser Zeilen (Rows) sein eigenes Attribut Array - das ist ok, da ich dem Array über die in der Klasse vorhandenen Funktionen nur den Wert zuteilen möchte, der auch benötigt wird. eine nackte Zeile hat also nur ein leeres Array - soweit so gut. was aber ist mit den Methoden (Funktionen) die werden ja auch jedes Mal mit vererbt, oder? D.h. bei der Tabelle mit 100 Zeilen habe ich 100 leere Arrays UND 100 mal ein dutzend Funktionen um diese Arrays kontrolliert zu handlen.

    Wo ist hier mein Denkfehler und wer könnte mir hier mal einen Schubs in die richtige Richtung geben um solche Programmierfehler/Denkfehler zu vermeiden.

    Würde mich wirklich riesig über konstruktives Feedback freuen!

    Gruß,

    Guido

  • #2
    Bevor du dich ganz auf Vererbung versteifst, schau dir unbedingt das Verfahren der Dependency Injection an. Dann entscheide, welches Verfahren für dein konkretes Problem besser ist.
    Dein Problem hab ich so früh noch nicht erfasst. Muss wohl nochmal lesen.

    Edit: Um Zeile und Spalten einer Tabelle zu stylen brauchst du keine extra Attribut-Ojekte/Arrays. Es reicht für die meisten Fälle, der Tabelle eine CSS-Klasse mitzugeben.
    Ansatz siehe hier.

    Kommentar


    • #3


      Methoden werden nicht kopiert. Sie hängen an der Klasse, aus der du Objekte instanziiert hast und existieren nur einmal.

      Kommentar


      • #4
        Diese wird dann an z.B. die Klasse Table_Row oder auch andere Klassen die diese Attribute zulässt (eigentlich fast alles) vererbt
        Du solltest in dem Fall nicht mit Vererbung arbeiten. Bei Vererbung handelt es sich immer um eine ist-ein-Beziehung. Ist Table_Row ein Global_Attributes? Wohl eher nicht. Versuche von Anfang an die Prinzipien des objektorientierten Designs zu beachten (zumindest die SOLID-Prinzipien), das kann am Anfang extrem hilffreich sein.

        https://de.wikipedia.org/wiki/Prinzi...ierten_Designs

        Bei deiner Vererbung-Stratagie verletzt du das L im SOLID, also das Liskovsche Substitutionsprinzip und das stellt dich automatisch vor weitere Probleme...

        Jetzt mein Verständnisproblem: Angenommen, ich habe eine Tabelle mit 100 Zeilen, dann bekommt jeder dieser Zeilen (Rows) sein eigenes Attribut Array - das ist ok, da ich dem Array über die in der Klasse vorhandenen Funktionen nur den Wert zuteilen möchte, der auch benötigt wird. eine nackte Zeile hat also nur ein leeres Array - soweit so gut. was aber ist mit den Methoden (Funktionen) die werden ja auch jedes Mal mit vererbt, oder? D.h. bei der Tabelle mit 100 Zeilen habe ich 100 leere Arrays UND 100 mal ein dutzend Funktionen um diese Arrays kontrolliert zu handlen.
        Schau dir mal das Fliegengewicht-Entwurfsmuster (Flyweight pattern) an:

        https://de.wikipedia.org/wiki/Fliege...wurfsmuster%29

        Diese Technik wird, wenn ich mich recht erinnere, auch in dem Buch PHP Design Patterns am Beispiel einer Tabelle ausführlich beschrieben. Insgesamt ein empfehlenswertes Buch für den Einstieg in OOP/OOD.

        https://www.amazon.de/PHP-Design-Pat.../dp/389721864X

        vg
        jack

        Kommentar


        • #5
          Mahlzeit,

          an dieser Stelle schon mal Danke für das Feedback. Offensichtlich habe ich das ganze Prinzip der OOP noch nicht verstanden und werde mich daher mal mit den Texten der vorgeschlagenen Links beschäftigen. Das Buch liegt auch schon mal im Warenkorb - danke für den Tipp.

          Zu der Frage
          Ist Table_Row ein Global_Attributes?
          - nee, natürlich nicht. Table_Row enthält globale Attribute - also Eigenschaften, die sich über Methoden steuern lassen. So hatte ich das bisher an den Beispielen die ich so im Netz gefunden habe verstanden. Ja irgendwie wohl dann doch nicht, also noch mal zurück zum Anfang und lernen.

          Besten Dank

          Guido

          Kommentar

          Lädt...
          X