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