am 14. Februar 2009
Heute gibt es mal wieder eine Idee direkt vom PHP Meister Nils. Gut, vielleicht kein Großmeister, aber bestimmt die Person, die in den letzten Monaten am häufigsten über PHP gebloggt hat in ganz Deutschland.
Meine heutige Idee kam mir bei der Arbeit, als ich mal wieder einen Dekorator basteln musste. Wie ihr vielleicht wisst, muss ich beim Dekorierer Entwurfsmuster gegen ein bestimmtes Interface programmieren und die meisten Methoden über Delegation an das Ursprungsobjekt weiterleiten. Methoden, die ich erweitern will würde ich dann einfach erweitern, statt zu delegieren. Wenn ihr meine komische Erklärung nicht versteht, was ich mal vermute, dann schaut euch einfach den Beitrag auf Wikipedia an oder kauft euch das Buch von Stefan Schmidt. Moment da fällt mir ein, dass ich ja selbst schon was geschrieben habe.
Im Moment habe ich das Problem, wenn ich viel mit Delegation arbeite, dass ich viele Methoden stupide weiterleiten, eben delegieren, muss. Habe ich ein Interface mit 20 Methoden, so muss ich die alle in meiner neuen Klasse implementieren. Und genau dies könnte doch eine Tool übernehmen. Als Input bekommt es einen Klassennamen und spuckt ein eine Klasse aus, die nichts macht, als alles weiterzuleiten, was es so an Funktionen gibt.
Machen wir mal ein kleines Beispiel:
interface iBlog
{
public function schreibeEintrag( $eintrag );
public function loescheEintrag( $id );
}
Versuchen wir es mal ganz einfach zu halten, da die Idee ja auch ganz einfach ist. Geben wir jetzt dieses Interface oder eine Klasse, die davon abgeleitet wurde in unseren Generator, so erhalten wir folgendes:
class BlogDelegate implements iBlog
{
private $blog;
public function __construct( iBlog $blog )
{
$this->blog = $blog;
}
public function schreibeEintrag( $eintrag )
{
return $this->blog->schreibeEintrag( $eintrag );
}
public function loescheBeitrag( $id )
{
return $this->blog->loescheBeitrag( $id );
}
}
Während ich den Code tippe, merke ich wie stupide diese Aufgabe wirklich ist. Über Refelction sollte das doch kein Problem sein, vielleicht sollte man auch die IDE mit einbeziehen. Ich meine das Zend Studio hat ja schon die Möglichkeit setter und getter automatisiert zu setzen. So eine delegate-Erstellungs-Methode wäre doch auch toll.
Vielleicht schreibe ich mal sowas als externes Tool, dass man integrieren kann. Mal schauen.