[OOP] Forum neu Programmierung mit Container-Klasse

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

  • [OOP] Forum neu Programmierung mit Container-Klasse

    Hallo,

    ich habe ein kleines Forum gebastelt, das in einem Mitgliederbereich läuft - der Mitgliederbereich besteht aus den 20 Mitgliedern unseres Clubs, also nichts großes.

    Nun will ich den Mitgliederbereich neu programmieren - bin Informatikstudent und habe ein paar neue Programmiertechniken gelernt während des Studiums, die ich jetzt gerne praktisch anwenden möchte.

    Das Forum ist so aufgebaut:

    -> Kategorie 1 (fest, kann nur von Admin hinzugefügt werden)
    -> Forum 1 (fest, kann nur von Admin hinzugefügt werden)
    -> Thema 1 (kann von jdm. Mitglied erstellt werden)
    -> Beitrag 1 (kann von jdm. Mitglied erstellt werden)
    -> ...
    -> Thema 2
    -> ...
    -> Forum 2 (...)
    -> ...
    -> Forum 3 (...)
    -> ...
    -> Kategorie 2 (...)
    -> Forum 1 (...)
    -> ...
    -> ...
    -> Forum 2 (...)
    -> ...
    -> Kategorie 3 (...)
    -> Forum 1 (...)
    -> ...

    Nur mal so zum Überblick. Nun würde ich gerne mit einer Containerklasse arbeiten, die dann die einzelnen Kategorien, etc. enthält. Nun aber schon das 1.Problem: Zum Zeitpunkt, an dem ich die Kategorien aus der DB abrufe muß ich ja auch die Foren abrufen. Diese will ich dann zu den Kategorien packen (also daß jede Kategorie in ihrem Objekt die Unterforen enthält).

    Ist es nun sinnvoll, das ganze so zu lösen (mit einem Conteiner - denke, wenn ich es auf die 2.Art löse brauche ich da auch nicht mehr - und einer Klasse, wo ich dann alle Kategorien, Foren, Themen, etc. reinpacken kann? Oder soll ich für jeden Bereich Kategorien, Themen, Beiträge,... eine eigene Klasse basteln, die speziell darauf zugeschnitten ist?

    Hier mal das Codebeispiel von mir:
    Code:
    <?php
    class ForumContainer {
    
    	public $cont					= array();
    
    	public function __construct($obj = '') {
    		if(!empty($obj))
    			$this->Add($obj);
    	}
    	
    	public function Add($obj) {
    		$a							= count($this->cont);
    		$this->cont[$a]				= $obj;
    		return;
    	}
    	
    	public function getCont() {
    		return $this->cont;
    	}
    	
    	public function Count() {
    		return count($this->cont);
    	}
    	
    	public function __destruct() {
    		unset($this->cont);
    	}
    }
    
    class ForumParts extends ForumContainer{
    
    	private $title;					// Titel
    	private	$text;					// Text oder Beschreibung
    	private	$time;					// Erstellungszeitpunkt
    	private	$author;				// Autor
    	private $nrChildren;			// Anzahl an Kindelementen
    	private	$parent;				// Was ist das Elternelement
    
    	public function __construct($aID,$aTitle, $aText, $aTime, $aAuthor, $aNrChildren, $aParent = '') {
    		$this->id					= $aID;
    		$this->title				= $aTitle;
    		$this->text					= $aText;
    		$this->time					= $aTime;
    		$this->author				= $aAuthor;
    		$this->nrChildren			= $aNrChildren;
    		$this->Parents				= $aParent;
    	}
    	
    	public function getID() {
    		return $this->id;
    	}
    	
    	public function getTitle() {
    		// Umwandlung der Umlaute und ß
    		return $this->title;
    	}
    	
    	public function getText() {
    		// Umwandlung der Umlaute und ß
    		// Umwandlung der Links, Bilder,..
    		return $this->text;
    	}
    	
    	public function getTime() {
    		// Umwandlung in lesbares Datum
    		return $this->time;
    	}
    	
    	public function getAuthor() {
    		return $this->author;
    	}
    	
    	public function getNrChildren() {
    		return $this->nrChildren;
    	}
    	
    	public function getParent() {
    		return $this->parent;
    	}
    	
    	public function __destruct() {
    
    	}
    }
    
    $kategorien	   = new ForumContainer();
    $kategorien->Add(new ForumParts('1','Kat1','','10000000000', '1','5'));
    $kategorien->Add(new ForumParts('2','Kat2','','10000000000', '1','3'));
    
    $arr = $kategorien->getCont();
    
    $arr[0]->Add(new ForumParts('1','Forum1','Desc1 (in Kategorie 1)','10000000000', '1','5','1'));
    $arr[0]->Add(new ForumParts('2','Forum2','Desc2 (in Kategorie 1)','10000000000', '1','3','1'));
    $arr[0]->Add(new ForumParts('3','Forum1','Desc1 (in Kategorie 2','10000000000', '1','5','1'));
    
    for($i = 0; $i < count($arr); $i++) {
    	echo $arr[$i]->getTitle();
    	$test = $arr[$i]->getCont();
    	echo '<ul>';
    
    	foreach($test as $value) {
    		echo '<li>';
    		echo $value->getTitle();
    		echo '</li>';
    	}
    	echo '</ul>';
    
    }
    ?>
    Ich hoffe, ihr wisst, was ich meine... Vielleicht könnt ihr mir auch einfach nur einen Tipp geben, wie man sowas einigermaßen professionell löst. Man will sich ja immer verbessern und dazu lernen

    Danke und Grüße,

    Marc

  • #2
    Sorry, aber OOP ist nicht dafür ausgedacht worden um die Leben noch schwiriger zu machen.
    Ich sehe überhaupt kein Sinn von deiner classe ForumContainer, weil
    1)ein Mehrdemensionaler Array ist nichts anderes als ein Container
    2)Der ganzer Zusammenhang zwischen Beiträgen, die du mit den komischen Werten ''Forum1','Desc1'" ( Parametern 2 und 3) bei ForumParts darstellen willst, werden normale weise durch die refferencen gemacht.
    3)Man schreibt die classen
    3.1) um sie in zukunft verwenden zu können
    3.2) um die funktionstüchtige classen zu überschreiben und dadurch Ihr funktionalität zu erweitern
    3.3)um die forgeschriebene funktionen die in einem Interface oder Abstracter classe steckt konsequent implementieren.
    3.4)weil anderes einfach nicht geht(Java, C#)

    Erkläre mir bitte jetzt welche Sinn von oben aufgelisteten, deine classe ForumContainer hat?
    4)Die ganze struktur, die du darstellen willst, kommt vermutlich aus DB.
    DB ist auch OOP, da du jede Tabelle als ein Object betrachten kannst.
    Mit 10 Zeilen von Quelltext, der in eine einzige Methode gepackt wird, kannst du die Ganze struktur direkt im Browser ausgeben.
    Die ganze Struktur, die du gebastelt hast, ist eigentlich nur dafür ausgedacht wurde, um dem User am ende der Inhalt zum Browser senden, danach braucht man kein Container mehr.
    muss man wirklich für aufbau so einen Container mehr Aufwand für erzeugen von Container betreiben, als für den wirklichen Sinn und Zweck von der Anwendung?
    -------------------
    Ich kann nicht ausschlissen, dass ich nicht ganze Idee verstanden habe, aber so wie es Aussieht versuchts du absolut Grundlos aus der einefacher Ausgabe eine super-Abstractionsschicht aufzubauen und zwar so tüchtig, dass du vergessen hast wofür es am ende dient.

    Bitte betrachte mein Beitrag nicht als persönliche Kritik.

    Zuletzt geändert von Slava; 22.06.2007, 20:23.
    Slava
    bituniverse.com

    Kommentar


    • #3
      Hi Slava,

      danke für die Antwort! Ist auch immer interessant die Meinung von anderen (die sich wahrscheinlich besser auskennen mit PHP als ich) zu lesen.

      Nachdem was du schreibst ist OOP in PHP dann ja sowieso total unnötig - die Daten kommen zu 99% aus Datenbanken, können nicht auf andere Seiten übernommen werden,... Oder verstehe ich das falsch?

      Könntest du vielleicht ein Beispiel nennen, wo es sinnvoll wäre?

      Vielen Dank und Grüße,

      Marc

      Kommentar


      • #4
        OffTopic:
        Yes! Endlich mal wieder ein neues Rad! Geil!
        Nur wenige wissen, wieviel man wissen muss, um zu wissen, wie wenig man weiß.

        Kommentar


        • #5
          Original geschrieben von Mean
          Nachdem was du schreibst ist OOP in PHP dann ja sowieso total unnötig - die Daten kommen zu 99% aus Datenbanken, können nicht auf andere Seiten übernommen werden,... Oder verstehe ich das falsch?
          kann ich so nicht unterschreiben.
          webapplikationen basieren meist auf http, welches ein zustandsloses protokoll darstellt. das ist auch der große unterschied zu applikationen, die auf deinem desktop laufen.
          die webapp wird bei einem http-request gestartet und danach wieder beendet, bis zum nächsten browser-request.
          um einen client wiederzuerkennen, hat der php-gott sessions erfunden. in der session kannst du u.a. auch deine objekte serialisiert ablegen und bei einem erneuten request des selben clients "wiederbeleben".

          mehr hintergrundwissen unter: http://www.develnet.org/101.html

          Kommentar


          • #6
            Danke für die zahlreiche Beteiligung!

            Wegen dem serialize: das kennte/kannte ich schon, wobei ich da bisher nur darüber gelesen habe, daß man das für Objekte normal nicht einsetzt...

            D.h., ich lege z.B. in (m)einem Mitgliederbereich einen Benutzer-Objekt an (wenn dafür kein OOP verwendet wird, wofür dann?) und halte das dann die ganze Zeit, die er eingeloggt ist, über die Session am Leben!?!?!

            Aber warum sind denn z.B. Foreneinträge keine Objekte? Objekte sind für mich Dinge, die Eigenschaften (=Attribute) haben. Sei es nun ein Auto, ein Mensch oder eben ein Foreneintrag... Ich bastle mir doch damit auch eine Schablone, die ich dann auf alle Foreneinträge anwende, z.B. um den Text von BB-Code zu befreien, das Datum von Times in Date zu verwandeln,...?!?!

            Grüße,

            Marc

            Kommentar


            • #7
              Die Beiträge sind super als Objekte. Ich denke es ging Slava um diese Container-Klasse, die ja nichts tut was ein einfaches Array nicht auch kann.

              Zu dem Benutzerobjekt: sicher ist es praktikabler, das bei Bedarf neu wieder herzustellen (z.B. anhand der Benutzerid in der Session), anstatt es komplett in die Session zu schreiben.

              Bei sowas wie Warenkörben könnte das ev. nützlich sein (obwohl sicher auch da die Warenid und die Menge oder sowas reichen würden).
              ich glaube

              Kommentar


              • #8
                Original geschrieben von Mean

                Könntest du vielleicht ein Beispiel nennen, wo es sinnvoll wäre?

                Eine Mail, SMTP,HTTP-Client oder andere Classen, die uns erleichtern entweder ein besseren Übersicht oder aufwändiger und verborgener Funktionalität greifbar zu machen.
                Wenn du meinst, dass die classe ForumParts für deine Anwendung benötigt wird, dann mach es auch. Aber warum muss diese classe von nutzlosem ForumContainer abgeleitet sein, ist für mich wirklich ein rätsel.
                $ForumContainer=array(); tut nichts anderes als deine classe, die einfach die vertrauten array-funktionen dekoriert.
                Wenn du die Interresse hast, der richtiger OOP Ensatz bei PHP kennenlernen, dann würde ich dir Zend-Framework als guter Beispiel nennen. Da sind die classen dafür ausgedacht um eine Anwendung schnell und Übersichtlich zu entwickeln.
                Slava
                bituniverse.com

                Kommentar


                • #9
                  Eine sinnvolle Kapselung des Forums in eine Klasse wäre das verarbeiten der SQL-Query an die Datenbank. Also eine Klasse mit den Methoden

                  holeKategorie( id )
                  speichereKategorie( id, daten )
                  erstelleKategorie( daten )

                  usw.

                  So kapselst du logisch zusammenhängende Programmabschnitte und dein Code wird leserlicher. Das wäre eine sinnvolle Forum-Klasse!

                  Kommentar

                  Lädt...
                  X