Запись в атрибуты только для чтения внутри класса Perl Moose
Использование Perl иMoose
Доступ к данным объекта возможен двумя способами.
$self->{attribute}
или же$self->attribute()
Вот простой пример, демонстрирующий оба:
# 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";
Я знаю, что когда ты за пределамиPerson.pm
файл лучше использовать$person->age()
версия, так как она не позволяет делать глупые ошибки и не дает перезаписать значение только для чтения, но мой вопрос ...
внутри изPerson.pm
это лучше всего использовать$self->{age}
или же$self->age()
? Считается ли плохой практикой перезаписывать атрибут только для чтенияв сам модуль?
Следует ли изменить этот атрибут на атрибут чтения / записи, если ожидается, что его значение когда-либо изменится, или считается приемлемым переопределить аспект атрибута, доступный только для чтения, с помощью$self->{age}
в пределахHAPPY_BIRTHDAY
функционировать?