Spolecne promenne v objektech - moznosti (uvaha)
Frantisek Darena
darena na akela.mendelu.cz
Pátek Září 3 15:33:38 MEST 2004
On Thu, 2 Sep 2004, Ondrej Koala Vacha wrote:
>
> 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:
Co se mysli temi spolecnymi promennymi? Atributy objektu? Pokud jsou to
jenom promenne, ktere nemaji byt viditelne navenek, muzou to byt lexikalne
vymezene promenne deklarovane treba na zacatku toho baliku.
>
> 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