Schreiben von schreibgeschützten Attributen in einer Perl Moose-Klasse

Mit Perl undMooseuf Objektdaten kann auf zwei Arten zugegriffen werde

$self->{attribute} oder$self->attribute()

Hier ist ein einfaches Beispiel, das beides demonstriert:

# 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";

Ich weiß, dass, wenn Sie außerhalb des @ siPerson.pm Datei ist es besser, die @ zu verwend$person->age() -Version, da Sie so keine dummen Fehler machen und keinen schreibgeschützten Wert überschreiben können, aber meine Frage ist ...

Innerhal vonPerson.pm ist es am besten, @ zu verwend$self->{age} oder$self->age()? Wird es als schlechte Praxis angesehen, ein schreibgeschütztes Attribut @ zu überschreibeinnerhal das Modul selbst?

Sollte dieses Attribut in ein Lese- / Schreibattribut geändert werden, wenn eine Änderung des Werts zu erwarten ist, oder wird es als akzeptabel angesehen, den schreibgeschützten Aspekt des Attributs mit @ zu überschreibe$self->{age} innerhalb derHAPPY_BIRTHDAY Funktion?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage