Rolf b: PHP - OOP - Wie sollte ich am besten meinen Code strukturieren?

Beitrag lesen

Sinnhaftig ist das Ganze durchaus. Ich versuche mal ein paar Hinweise, wie du herangehen könntest.

Du hast XML Dokumente, schreibst Du. Wenn Du Dir das Schema dieser Dokumente ansiehst, wirst Du feststellen, dass dein "ChangeLog" ein Container ist. Er enthält ein "HauptRelease", dazu gibt es "SubReleases", ein Subrelease dokumentiert "Bugfixe". Das sind schonmal gleich 4 Klassen, ohne lange nachzudenken.

Diese Klassen beschreiben aber NUR das Datengebilde zu einer Changelog XML Datei. Für deine Anwendung hast Du eine Klasse "Configuration", wo alle Konfigurationseinstellungen drinstecken. Du hast auch eine Klasse "Application" (die ich auch gern "Context" nenne), die sozusagen die Wurzel allen Übels darstellt. Dieses Objekt stellst Du über eine globale Variable bereit. Sie hat bspw. ein Property, unter dem Du das Configuration Objekt findest. Sie könnte auch ein Property "Log" haben, unter dem Du den gerade geladenen Changelog findest.

Um eine Changelog-Datei zu laden, schreibst du eine weitere Klasse: ChangelogReader. Die hat eine öffentliche Methode "Load" und diese produziert aus einer XML Datei ein Changelog-Objekt mit allen Unterobjekten. Gerne kannst Du ihr weitere Klassen beigesellen wie einen HauptreleaseReader oder SubreleaseReader, die sich ausschließlich mit diesem Teil des XML Schemas befassen. Hängt davon ab, wie komplex dein Schema ist, ob sich das lohnt.

Unabhängig von dem, was deine Seite alles kann, musst Du zumindest mal einen Changelog darstellen können. Falls Du ein Template-System für PHP nutzt, musst Du es füttern. Tust Du das nicht, musst Du das entsprechende HTML erzeugen. Aber egal, wie du es tust, du brauchst eine Klasse ChangelogRenderer, die sich um diese Aufgabe kümmert. Da ein Changelog Unterobjekte hat, schadet es nicht, die Darstellung eines Hauptreleases, eines Subreleases oder eines Bugfixes in einen HauptreleaseRenderer, SubreleaseRenderer und BugfixRenderer zu verteilen.

Grundidee: Eine PHP Datei enthält genau eine Klasse. Jede Klasse kümmert sich um eine kleine, klar umrissene Aufgabe. Eine Methode darin tut genau eine Sache. Methoden mit mehr als 50 Zeilen können gelegentlich sinnvoll sein, sind aber meistens schon zu lang. Es sei denn, sie bestehen hauptsächlich aus Kommentar oder dein Schreibstil ist sehr zeilenfressend. Klassen mit mehr als 500 Zeilen bündeln meistens zu viele Teilaufgaben. Allerdings kann Dir eine zu starke Zerlegung in PHP Performanceprobleme bescheren, weil dann zu oft der Classloader anspringt und die Anwendung sich auf zu viele Dateien verteilt.

Diese ganzen kleinen Klassen müssen dann vom Hauptprogramm geeignet erzeugt und zusammengesteckt werden, damit das Orchester sauber spielt. Wenn Du eine Seite zur Anzeige eines Changelogs hast, wirst Du einen für alle Seiten einheitlichen Teil haben, der Configuration und ein Application-Objekt erzeugt (z.B. in einer Funktion abgebildet, die in irgendeinem include steckt). Und dann solltest Du zügig dazu übergehen, das Steuerobjekt für die aufgerufene Seite zu erzeugen (das bekommt z.B. das Application-Objekt als Parameter) und darauf nur noch eine Run() Methode aufzurufen. Darin kommen dann die Unterscheidungen, ob es ein GET oder POST war, ob es Query-Parameter gab und wie zu reagieren ist, und wenn dann klar ist, was GENAU für diesen Request zu tun ist, erzeugst Du ein Worker-Objekt für genau diese Aufgabe und startest dieses.

Das heißt: Du hast mehrere Kategorien von Objekten.

  • Rahmen (Application, Configuration)
  • Modell (ConfigLog, HauptRelease, SubRelease, BugFix, ...)
  • View (die Renderer-Klassen)
  • Controller (die Steuerklassen, die das Modell aufbauen und einen View dazu erzeugen)

MVC. Model-View-Controller. Ein Konzept, dass recht bekannt ist und dass du gerne recherchieren kannst.

Sauberes OOP ist viel Erfahrung, viel Kennenlernen von Code anderer Leute, viel Fehlermachen und daraus lernen, viel Lektüre über "gute" OOP Muster.

Damit du vor lauter Klassen nicht wahnsinnig wirst, brauchst Du dann noch zweierlei:

  • eine IDE, mit der Du den Überblick behältst (ich mag die PHP Edition von Netbeans)
  • einen automatischen Classloader, der die benötigten Klassen in dem Moment nachlädt wo sie angesprochen werden. Da gibt's einiges in der wilden weiten Welt. Meiner ist selbstgeschrieben, das ist keine Raketenwissenschaft, aber die fertigen können natürlich mehr und du musst sie nicht testen. Nur bedienen lernen ;)

Rolf