Запись в атрибуты только для чтения внутри класса 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 функционировать?

Ответы на вопрос(3)

Ваш ответ на вопрос