Ein Programmierer schreibt eine Funktion, die Thread-sicher sein muss und außerdem die programmweite Logdatei nutzen soll. Alles, was er dazu tun muss, ist, der Funktion die Auszeichnungen »@synchronized« und »@logging« voranzustellen. Mit Python-Dekoratoren ist eine solch elegante Annotation von Funktionen tatsächlich möglich.
Selbstverständlich muss der Entwickler den für die hinzugefügte Funktionalität erforderlichen Programmcode trotzdem schreiben. Sein nachträgliches Anbinden an bestehende Funktionen eröffnet dennoch interessante Möglichkeiten. Viele Forderungen des aspektorientierten Programmierparadigmas lassen sich mit ihnen umsetzen (Abbildung 1).
Abbildung 1: Der aspektorientierten Programmierung geht es darum, zur Kernfunktionalität orthogonal stehende Seitenaspekte wie Datenvalidierungen getrennt zu entwickeln und erst spät in die Anwendung einzuflechten.
Anwendungsfälle
Dekoratoren sind zum Beispiel nützlich, wenn es darum geht, das implizite Verhalten eines Programms sichtbar zu machen, zum Beispiel Laufzeitverhalten, Programmfluss oder Aufrufhäufigkeit von Funktionen. Funktionen lassen sich außerdem mit Vor- und Nachbedingungen oder beispielsweise mit Cache-Mechanismen ausstatten.
Dieser Artikel zeigt am Beispiel der Fibonacci-Zahlen, wie Dekoratoren den Entwickler zunächst bei der Analyse von Performanceproblemen helfen. Aus den dabei gewonnenen Erkenntnissen ergibt sich, dass ein Caching die Zahl der benötigten Durchläufe stark verringert. Die Performance steigt dabei um weit mehr als den Faktor 1000.
Entflochten
Bei der Software-Entwicklung ist es sinnvoll, Kernfunktionalität und erweiterte Funktionalität wie Sicherheits-Check, Datenvalidierungen oder Protokollierung möglichst sauber zu trennen (Abbildung 1). Die Grundidee der aspektorientierten Programmierung ist es, diese Core-Level-Concerns getrennt von den orthogonal zu ihnen stehenden System-Level-Concerns zu entwickeln und erst im letzten Schritt zu verflechten.
« Zurück
1
2
3
4
5
Weiter »