Escribir en atributos de solo lectura dentro de una clase Perl Moose
Usando Perl yMoose
, se puede acceder a los datos del objeto de 2 maneras.
$self->{attribute}
o$self->attribute()
Aquí hay un ejemplo simple que demuestra ambos:
# 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";
Sé que cuando estás fuera delPerson.pm
archivo es mejor usar el$person->age()
versión ya que le impide cometer errores tontos y le impedirá sobrescribir un valor de solo lectura, pero mi pregunta es ...
Dentro dePerson.pm
es mejor usar$self->{age}
o$self->age()
? ¿Se considera una mala práctica sobrescribir un atributo de solo lectura?dentro el módulo en sí?
Si este atributo se cambia a un atributo de lectura / escritura si alguna vez se espera que cambie su valor, o si se considera aceptable anular el aspecto de solo lectura del atributo utilizando$self->{age}
dentro deHAPPY_BIRTHDAY
¿función?