AW: AddonSystem
Wie angedeutet, für ein Websystem kenne ich noch keine konkreten Schemen zur Erweiterung der Funktionalität. Ich kann aus der OOP ein Beispiel skizzieren, dass dir den Ansatz verständlich machen kann.
Nehmen wir als Klasse ein Dokument, wie das intern dargestellt wird ist egal. Diese Klasse hat beispielsweise eine Methode namens
getTitle(). Beim Ausgeben des Dokumentes wird an den richtigen Stellen diese Methode aufgerufen, das sollte kein Problem darstellen.
Willst du nun dein Dokument erweitern, beispielsweise soll jeder Titel fett dargestellt werden, könntest du entweder eine Kindklasse DokumentFetterTitel bilden - aber du siehst schnell wie aufgebläht so ein System wird - oder die bisherige Klasse erweitern.
Falls du schon mal mit Klassen gearbeitet hast, sollte dir Vererbung ja bekannt sein. Sagen wir, es gibt eine Kindklasse von Dokument, die für eine Familie von Verschönerungen im Dokument stehen soll, und nennen wir sie Dekorierer. Da Dekorierer von Dokument erbt, bietet es die gleichen Methoden (sie oben) an. Es ist also einem Klienten (jemand, der Dokument nutzen will) gleichgültig, ob er mit Dokument oder Dekorierer redet (genauer: er weiß es i.d.R. garnicht).
Zeit für etwas Code, ich skizziere Dokument und Dekorierer (Pseudo-Syntax, hab lange kein PHP-OOP mehr geschrieben):
PHP:
class Dokument {
...
$title = "Mein Titel";
getTitle() {
return $title;
}
...
}
abstract class Dekorierer extends Dokument {
Dokument $dok = null; //hält eine Referenz auf das dekorierte Dokument
Dekorierer(Dokument $dokument) { //Konstruktor
$dok = $dokument;
}
...
}
Bis jetzt ist noch nichts wirklich magisches passiert. Dekorierer ist abstrakt, weil davon keine Instanzen erzeugt werden sollen. Jetzt möchte ich, dass ein Dekorierer den Titel fett macht. Erzeugen wir eine Kindklasse FettDekorierer von Dekorierer:
PHP:
class FettDekorierer extends Dekorierer {
...
getTitle() {
$oldTitle = $dok.getTitle(); //hole den Titel vom dekorierten Dokument
$newTitle = "<strong>".$oldTitle."</strong>"; //oder ein internes Markup-System nutzen, etc.
return $newTitle;
}
...
}
Wir können also sowas machen:
PHP:
$myDoc = new Dokument( ... ); //Titel im Konstruktor setzen, usw.
$decoratedDoc = new FettDekorierer($myDoc);
echo $decoratedDoc.getTitle(); //gibt <strong>.....</strong> aus
Warum ist dieses System besser als bspw. die Vererbung nach DokumentFetterTitel? Weil es sehr viel flexibler ist. Sobald du noch mehr Zeug erweitern willst, kommst du mit reiner Vererbung nicht weit (DokumentFetterKursiverTitel, DokumentKursiverUnterstrichenerTitel, ...). Du kannst aber beliebig Dekorierer-Unterklassen erzeugen und sie miteinander kombinieren:
PHP:
$myDoc = new Dokument( ... ); //Titel im Konstruktor setzen, usw.
$decoratedDoc = new KursivDekorierer(new UnterstrichenDekorierer(new FettDekorierer($myDoc)));
echo $decoratedDoc.getTitle(); //gibt den entsprechend formatierten Titel aus
Dieses
Prinzip ist nur eines von vielen, um die Funktionalität deiner Objekte zu erweitern.
Wie anfangs gesagt, ich weiß nicht wie webbasierte Systeme es machen, aber es folgt sicher ähnlichen Ideen.
Duddle