Autoloader

Autoloader

am 15.08.2006 12:51:03 von struebig

Folgendes Problem: CGI Anwendungen haben ja die angenehme Eigenschaft,
dass immer nur ein Teilbereich abläuft. D.h. aber auch, wenn ich ein
Objekt habe, bräuchte ich nicht bei jedem Aufruf die z.b. save(),
delete() oder edit() Funktion zu kompilieren.

Daher bietet es sich an diese auszulagern und on-the-fly einzubinden.
Jetzt fällt es mir schwer diese ausgelagerten Module an das Objekt zu
binden. Daher hatte ich mir folgenden Weg ausgedacht:

Hauptdatei: myClass.pm

package myClass;

use myAutoload; # siehe unten
sub new { .... }

usw....

Unterverzeichniss /myClass/
Load.pm
Save.pm
Edit.pm
....

und dazu einen Autoloader, der dann zur Laufzeit die entsprechenden
Module nachlädt:

package myAutoload;

$pkg = (caller)[0];

*{$pkg.'::AUTOLOAD'} = sub
{
my $obj = shift;
# Den Funktionsnamen extrahieren
my $name = $AUTOLOAD;
my ($pkg2,$func) = ($name =~ /(.*)::([^:]+)$/);

return if $func eq "DESTROY";

my $modul = $pkg . '::' . ucfirst $func;
eval "use $modul;";
die $@ if $@;
return &{$pkg.'::'. $func}($obj, @_) if (ref \&{$pkg.'::'.
$func} eq 'CODE') ;

die "Fehler $name existiert nicht im Modul";
}
1;

Das funktioniert zwar, aber ich bin mir a. nicht sicher ob das mit
AUTLOAD so ein gute Sache ist, da es vermutlich sehr langsam ist und b.
ob es nicht einen schöneren Weg gibt oder ein Modul.

Ich hatte die Sache zwar schon Produktiv im Einsatz, aber ich hab hier
ein leicht schlechtes Gefühl, da ich zwar verstehe was da passiert aber
nicht sicher bin, ob das nicht umständlich ist und mir einfach kein
besserer Weg eingefallen ist.

Struppi.

Re: Autoloader

am 16.08.2006 23:56:05 von Slaven Rezic

"J. Strübig" writes:

> Folgendes Problem: CGI Anwendungen haben ja die angenehme Eigenschaft,
> dass immer nur ein Teilbereich abläuft. D.h. aber auch, wenn ich ein
> Objekt habe, bräuchte ich nicht bei jedem Aufruf die z.b. save(),
> delete() oder edit() Funktion zu kompilieren.
>
> Daher bietet es sich an diese auszulagern und on-the-fly einzubinden.
> Jetzt fällt es mir schwer diese ausgelagerten Module an das Objekt zu
> binden. Daher hatte ich mir folgenden Weg ausgedacht:
>
[...]
>
> Das funktioniert zwar, aber ich bin mir a. nicht sicher ob das mit
> AUTLOAD so ein gute Sache ist, da es vermutlich sehr langsam ist und b.
> ob es nicht einen schöneren Weg gibt oder ein Modul.
>
> Ich hatte die Sache zwar schon Produktiv im Einsatz, aber ich hab hier
> ein leicht schlechtes Gefühl, da ich zwar verstehe was da passiert aber
> nicht sicher bin, ob das nicht umständlich ist und mir einfach kein
> besserer Weg eingefallen ist.

Die richtige Antwort auf deine Performancesorgen ist natürlich
mod_perl. Aber wenn das keine Option für dich ist, dann ist das
Nachladen von Code eine gute Lösung. Ob du nun AUTOLOAD verwendest
oder das Nachladen manuell mit "require ..." machst, macht nicht so
viel aus. Performanceprobleme sehe ich keine.

Gruß,
Slaven

--
Slaven Rezic - slaven rezic de

Lost in your Tk widget tree? Try
http://user.cs.tu-berlin.de/~eserte/src/perl/Tk-WidgetDump/

Re: Autoloader

am 17.08.2006 13:13:39 von struebig

Slaven Rezic wrote:
>
> "J. Strübig" writes:
> > Ich hatte die Sache zwar schon Produktiv im Einsatz, aber ich hab hier
> > ein leicht schlechtes Gefühl, da ich zwar verstehe was da passiert aber
> > nicht sicher bin, ob das nicht umständlich ist und mir einfach kein
> > besserer Weg eingefallen ist.
>

Erstmal Danke für deine Antwort (ich stolpere in letzter Zeit auch oft
über Hinweise über Perl::Tk von dir, die mir auch schon oft
weitergeholfen haben)

> Die richtige Antwort auf deine Performancesorgen ist natürlich
> mod_perl. Aber wenn das keine Option für dich ist, dann ist das

Die Performanceprobleme (ich hatte ja vor einigen Wochen deshalb einen
Thread gestartet) an sich liesse sich auch schon mit einem Update auf
ein etwas teueres Webpaket lösen. Das Problem war an sich nicht so
dramatisch, ich hatte halt nur, weil das Projekt klein anfing nur das
billigste Paket und muss eben jetzt, wo das Projekt wächst, da etwas
nachrüsten. An mod_perl traue ich mich noch nicht so ran (hat mein
momentaner Hoster mW auch nicht im Angebot).

> Nachladen von Code eine gute Lösung. Ob du nun AUTOLOAD verwendest
> oder das Nachladen manuell mit "require ..." machst, macht nicht so
> viel aus. Performanceprobleme sehe ich keine.

Danke. Ich hab die Tage einen Haufen Tutorials durchgelesen, die z.T.
von AUTLOAD abrieten. Aber anderseits macht es das CGI Modul ja auch
nicht anderes.

Gruss

Struppi.