GenericDecorator mit Durchschlag

Gleich eines vorweg: Das ist wieder einmal ein Artikel zu einem sehr speziellen Detail der Implementierung eines Design Patterns in PHP, was unter Umständen furchtbar langweilig sein kann, wenn man mit der Materie eher wenig zu tun hat. Wer sich für solche Sachen eher nicht interessiert, ist mit diesem Artikel also schlecht bedient. Nachdem ich das nun losgeworden bin, will ich gleich mal durchstarten und die Eckdaten der Umgebung kurz beschreiben, für die ich in letzter Zeit fast ausschließlich entwickle.

Ich selbst bevorzuge schon seit längerer Zeit Ubuntu auf meinen Entwicklungsmaschinen. Falls ich das Zielsystem selbst auswählen kann, entscheide ich mich in der Regel auch hier für die Linux-Distribution, allerdings lade ich dann die Server-Version, weil ich auf den Overhead des X-Servers verzichten will. Mittlererweile sind wir bei Ubuntu 10.10 angekommen, die zum heutigen Zeitpunkt Apache 2.2.16, MySQL 5.1.49 und PHP 5.3.3 installiert, wenn man die üblichen Metapakete aus dem Task LAMP-Server angewählt hat.

Vor der PHP-Version 5 war es fast unmöglich, einen Decorator zu implementieren, welcher der Definition auch wirklich gerecht werden konnte. Von der Umsetzung einer schmalen und generischen Lösung durfte bestenfalls geträumt werden. Eine Anwendung, die ich kürzlich umgesetzt habe, verwendet Decorator-Klassen, welche von einem generischen Decorator erben, um entsprechende Problematiken mit der landesspezifischen Ausgabe von Zahlen und Zeichenketten zu vermeiden. Allerdings gibt es auch hier wieder einmal einen Haken, wenn man unvorsichtig wird.

Diese schlanke und – je nach Standpunkt sogar recht ansprechende – Lösung lässt sich auch recht einfach in bestehende Strukturen einbinden und birgt, trotz des Einsatzes von call_user_func_array, deren Einsatz ja häufig diskutiert wird, keinen nennenswerten Geschwindigkeitsprobleme. Übernimmt ein Decorator einer abgeleiteten Klasse ein beliebiges Objekt, ist er in der Lage, sich genauso wie selbiges zu verhalten. Für meinen Geschmack passiert hier aber schon fast zu viel des Guten.

In meinem Beispiel beginnen eventuell die Probleme in dem Moment, wenn die set-Methoden über den Decorator $b und nicht direkt über $a ausführt werden. $b wird automatisch auch das Objekt $a ändern, was eventuell nicht erwartet wird. call_user_func_array arbeitet aber mit einer Referenz auf das Objekt, womit wieder einmal eine ganz alte Geschichte aufgewärmt wurde …

Have Fun!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert