Gravando em atributos somente leitura dentro de uma classe Perl Moose
Usando Perl eMoose
, os dados do objeto podem ser acessados de duas maneiras.
$self->{attribute}
ou$self->attribute()
Aqui está um exemplo simples que demonstra os dois:
# Person.pm
package Person;
use strict;
use warnings;
use Moose;
has 'name' => (is => 'rw', isa => 'Str');
has 'age' => (is => 'ro', isa => 'Int');
sub HAPPY_BIRTHDAY {
my $self = shift;
$self->{age}++; # Age is accessed through method 1
}
sub HAPPY_BIRTHDAY2 {
my $self = shift;
my $age = $self->age();
$self->age($age + 1); # Age is accessed through method 2 (this will fail)
}
1;
# test.pl
#!/usr/bin/perl
use strict;
use warnings;
use Person;
my $person = Person->new(
name => 'Joe',
age => 23,
);
print $person->age()."\n";
$person->HAPPY_BIRTHDAY();
print $person->age()."\n";
$person->HAPPY_BIRTHDAY2();
print $person->age()."\n";
Eu sei que quando você está fora doPerson.pm
arquivo é melhor usar o$person->age()
versão, pois evita que você cometa erros estúpidos e impede que você substitua um valor somente leitura, mas minha pergunta é ...
Dentro doPerson.pm
é melhor usar$self->{age}
ou$self->age()
? É uma prática recomendada substituir um atributo somente leituradentro o próprio módulo?
Este atributo deve ser alterado para um atributo de leitura / gravação, se é esperado que seu valor mude, ou é considerado aceitável substituir o aspecto somente leitura do atributo usando$self->{age}
dentro doHAPPY_BIRTHDAY
função?