Nun, ich habe in einer meiner Klassen zwei Funktionen/Methoden:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
sub IO::String::readon{
my $self = shift;
my $len = shift;
my $offs = shift;
$offs = defined $offs ? $offs : $self->tell;
$self->seek($offs,0);
$self->read(my $buffer, $len);
return $buffer;
}
sub IO::File::readon{
my $self = shift;
my $len = shift;
my $offs = shift;
$offs = defined $offs ? $offs : $self->tell;
$self->seek($offs,0);
$self->read(my $buffer, $len);
return $buffer;
}
Die völlig identisch sind, also redundanter Code. Sie werden aufgerufen über ein Handle, was entwicklungsbedingt sowohl eine Instanz von
IO::File als auch
IO::String sein kann.
Um diese Code-Redundanz los zu werden, bin ich nun auf diesen Trichter gekommen:
sub UNIVERSAL::readon{
my $self = shift;
my $len = shift;
my $offs = shift;
$offs = defined $offs ? $offs : $self->tell;
$self->seek($offs,0);
$self->read(my $buffer, $len);
return $buffer;
}
Mit dem Wissen, daß ja alle Perl-Klassen von UNIVERSAL erben und damit auch jede Methode die man auf diese Art und Weise der UNIVERSAL-Klasse unterjubeln kann im redundanten Code zu vermeiden.
Was sagt Ihr denn dazu?