Spolecne promenne v objektech - moznosti (uvaha)
Ondrej Koala Vacha
koala na vju.cz
Čtvrtek Září 2 16:33:20 MEST 2004
Dobry den,
neco z nize uvedeneho uz jsem zde pred casem resil, tehdy vsak v jine
souvislosti. Takze: jde mi o zpusob, jakym resite spolecne prommene pri
objektovam navrhu. Klasicke reseni pres hash ma svoje nevyhody:
package x;
sub new {
my $class = shift;
my $self = {};
$self->{'all'} = 100;
$self->{'pole'} = (1,2,3,4);
bless $self, $class;
}
sub addtisk {
my $self = shift;
$self->{'all'}++;
print $self->{'all'},@{$self->{'pole'}};
}
Podle meho nazoru hlavne v tom, ze misto jednoduchych promennych se
pouzivaji prvky hashe, coz (znacne) zneprehlednuje kod. Srovnejme
$all versus $self->{'all'} nebo @pole v. @{$self->{'pole'}}. Dalsi
nevyhodou je, ze nelze pouzit use strict ke kontrole platnych promennych.
Urcite reseni je pouziti aliasu pres typegloby:
sub new {
...
my $all = 100; $self->{'all'} = \$all;
my @pole = (1,2,3,4); $self->{'pole'} = \@pole;
...
}
sub addtisk {
my $self = shift;
local *all = $self->{'all'};
local *pole = $self->{'pole'};
$all++;
print $all, na pole;
}
Zde je kod prehledny, direktiva strict se sice take neda pouzit primo, ale
je aspon dosazitelna preprocesingem (nahradit local *all... my $all a s
use strict zkusit natahnout). Rozdil je v uzavrech, kde promenne local
pozbyvaji na rozdil od my platnost.
Tak nevim - jsem jediny, kdo ma z pouziti $self->{'all'}++ boleni hlavy
(a reseni je tudiz aspirin;) ?
s pozdravem
--
Ondrej Koala Vacha
Další informace o konferenci Perl