Schreiben von schreibgeschützten Attributen in einer Perl Moose-Klasse
Mit Perl undMoose
uf 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?