Comment dois-je définir un sous-programme d'objet Moose après son initialisation? J'écris un module d'objet en utilisant Moose et je prévois sérialiser (nstore
) les objets créés.Comment dois-je définir un sous-programme d'objet Moose après son initialisation?
Examiner l'exemple suivant (simplifié!):
package MyObj 0.001;
use Moose;
use namespace::autoclean;
has 'size' => (
is => 'ro',
isa => 'Int',
required => 1,
);
sub some_sub {
my ($self, @more) = @_;
if ($self->size() < 100) # do something;
elsif (($self->size() < 500)) # do something else;
elsif (($self->size() < 7500)) # do something else;
# ...
}
1;
some_sub
agit différemment selon size
. Puisque size
est en lecture seule, il reste constant après l'initialisation de l'objet. Donc, en supposant que j'appelle some_sub
zillion fois, il est dommage que je doive passer par tous les if
chaque fois.
Je ferais mieux de le faire une fois que l'objet a été initialisé, puis définir some_sub
pour être une fonction plus simple sans if
s du tout.
Mais ... comment puis-je faire cela?
MISE À JOUR
Peut-être que je devrais ajouter un attribut de type lazy
subref qui contiendra une référence au sous-programme choisi. some_sub
appellera alors simplement $self->chosen_sub->(@_)
. Qu'est-ce que tu penses?
+1 yup, c'est à peu près ce que proposait ma mise à jour. Je voulais juste m'assurer que c'était logique. –
Vous pouvez aussi plier la méthode 'calculate()' dans l'attribut 'calculation_method' (et renommer comme' s/_method // ') en le faisant' isa => 'CodeRef', traits => ['Code'], handles => {calculate => 'execute_method'}); '(comme l'a noté phaylon dans la réponse de draegtun). – Ether