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