Thread Eigenschaften von Objekten, private, nichtprivate, schreibgeschützte (23 answers)
Opened by rosti at 2025-05-27 10:17

rosti
 2025-06-05 18:58
#197035 #197035
User since
2011-03-19
3617 Artikel
BenutzerIn
[Homepage]
user image
Quote
So kannst du auch bestimmte klassen an mehreren Stellen wiederverwenden ohne die Klassenhierarchie zu brechen.


Ja natürlich. Hunderte verschiedene HTML-Einzelseiten meines Blog werden über ein und dieselbe Subklasse als Response ausgeliefert. Lediglich die Eigenschaften wie title, body und descr sind unterschiedlich. Und per Eigenschaft interface=forum bspw. kann ich an jede dieser Seiten ein Forum unten dran hängen.

Quote
Ein weitere Möglichkeit ist es auch objekte als argumente zu übergeben.


Ja klar. Implizit wird ja bei jedem Methodenaufruf $self->control() das Objekt übergeben. Und da in dieser Methode stets ein CGI-Objekt gebraucht wird, wird es bereits dem Konstruktor der Basisklasse übergeben:

Code (perl): (dl )
1
2
3
4
my $ro = $class->new(
 BIN => $routes, # alle Eigenschaften der Response-Seiten im wahlfreien Zugriff
 URL => $url,    # der requestete URL like /index.html
 CGI => xCGi->new(), # Instanz meiner CGI-Klasse


Wenn ich jedoch erst beim Entwurf einer Subklasse sehe, daß ich in jeder Methode dieser Subklasse eine Datenbankverbindung brauche, erstelle ich dieses DBH in der init-Methode, das ist die Methode die über das FW als Erste aufgerufen wird. Somit implementiert mein FW auch ein Interface und versucht, in jeder Subklasse die 4 Methoden init, browse, control und trailer nacheinander aufzurufen. Was das Entwickeln weiterer Subklassen extrem vereinfacht, insbesondere auch dadurch daß nicht grundsätzlich alle 4 Methoden vorhanden sein müssen.

Ein weiteres Muster sollte jeder Entwickler kennen: Delegation. Damit mache ich die Methode einer fremdem Klasse zu einer Methode meiner eigenen Klasse:

Code (perl): (dl )
1
2
3
4
5
6
7
8
sub param{
    my $self = shift;
    return $self->{CGI}->param(@_);
}
sub xr{
    my $self = shift;
    return XR::xr(@_);
}


Lazy Delegation schließlich, lädt fremde Klassen/Instanzen über eine eigene Methode nach:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
use strict;
use warnings;
use TemplateSplitter;

sub template{
    my $self = shift;
    my $name = shift || 'default';
    my $t = TemplateSplitter->new( $self->{BODY} );
    $self->{BODY} = $t->{$name};
    $self->{BODY} .= $t->{$_} for @_;
}

Last edited: 2025-06-05 19:54:24 +0200 (CEST)
http://blog.rolfrost.de/

The art of steam.

View full thread Eigenschaften von Objekten, private, nichtprivate, schreibgeschützte