hotti: Funktionsaufrufe Cachen

Beitrag lesen

Moin;

Es ist möglich, mit dem bischen Perl-Code das statische Verhalten weiter einzuschränken, z.B. so, dass eine DB-Connection-Instanz an einen bestimmten URL gebunden ist (Parameter wären dann DB_NAME, DB_TABLE, OWNER_URL).

Im Prinzip ist das alles nichts umwerfend Neues: Funktions-Aufrufe werden gecached. Genauer gesagt, wird der Rückgabewert einer Funktion gecached. Auf CPAN gibt es dazu das Modul Memoize und ab Perl v5.10 steht state zur Verfügung, dieses Schlüsselwort (analog zu c/PHP static) nimmt Einfluss auf den Geltungsbereich einer Variable, dahingehend, dass die Funktion das Cachen selbst übernehmen kann:

  
use feature 'state';  
# oder  
# use 5.010;  
sub foo{  
   state %cache;  
}  

In PHP sieht das ganz ähnlich aus: static $cache; Bei jedem Funktionsaufruf wird zuerst in $cache geschaut, ob entsprechend der Funktions-Argumente, bereits ein "Ergebnis" (Object, Instanz einer Klasse, Scalar, blessed Reference...) vorliegt. Wenn nicht, wird der Return-Value erstellt, in den $cache geschrieben und zurückgegeben. Somit werden alle zurückzugebenden Instanzen nur einmal erstellt, nämlich nur beim ersten Aufruf der Funktion.

Der Return-Value ist immer eine Referenz, die jedoch auf sehr umfangreiche Datenstrukturn verweisen kann: Instanzen von Klassen, Dateihandle, Datenbankhandle, Arrays, Hashes, Scalare usw.

Noch ein praktisches Beispiel:

  
    $Address = $self->userdata()  
        or $self->mesg("Kein Benutzer angemeldet");  
    # oder  
    $Vorname = $self->userdata->{Vorname};  

Hier spielt vieles zusammen: In $self steckt $SESSION (als Attribut), darin der Benutzername und die übrigen Benutzer-Daten können sonstwo gespeichert sein, z.B. in MySQL. Die Methode userdata() cached sowohl ein prepared Statement, als auch die Benutzerdaten für den Return-Value.

Der Entwickler ruft einfach nur die Methode auf, das kann er beliebig oft machen und muss sich keine weiteren Gedanken machen, woher die Daten eigentlich kommen. Sollte sich bezüglich der Datenhaltung was ändern, bleibt der Code davon unberührt, lediglich die Methode wäre zu ändern und die ist in einer externen Datei definiert (userdata.pm).

Zurückgegeben wird eine Datenstruktur, die nach kontextgerechter Behandlung der Template-Engine übergeben werden kann, eine intelligente Template-Engine (z.B. HTML::Template) übernimmt die die kontextgerechte Behandlung selbst (Maskieren von spitzen Klammern usw.). $Address ist dann nur noch ein Platzhalter und was damit gemacht wird, muss nur noch derjenige wissen, der das Template bearbeitet.

Tags: OOP, Teamarbeit, Kaffeepause, Mittagsschlaf :)