Je pense que vous concentrer sur la mauvaise chose ici. Je fais ce genre de chose avec Data :: Constraint, Brick, etc. et j'en parle dans Mastering Perl. Avec un peu d'intelligence et de réflexion sur la structure de votre programme et les fonctionnalités dynamiques de Perl, vous n'avez pas besoin d'une telle approche réglementaire et procédurale. Cependant, la première chose que vous devez comprendre est ce que vous voulez vraiment savoir dans ce sous-programme d'appel. Si vous voulez juste savoir oui ou non, c'est plutôt facile. Le problème avec votre needs
est que vous envisagez de l'appeler une fois pour toutes les conditions, ce qui vous oblige à utiliser needs
pour contrôler le flux du programme. C'est la mauvaise façon de faire. needs
est seulement là pour vous donner une réponse. Son travail n'est pas de changer l'état du programme. Cela devient beaucoup moins utile si vous l'utilisez à mauvais escient car un autre sous-programme appelant peut vouloir continuer même si needs
renvoie la valeur false. Appelez-le une fois et laissez-le revenir une fois. Le sous-programme appelant utilise la valeur de retour pour décider de ce qu'il doit faire.
La structure de base implique une table que vous transmettez à needs
. Ceci est votre profil de validation.
sub run_find {
my $arg = shift @_;
return unless needs [
[ sub { $arg }, "arg required" ],
[ sub { exists $lang{$arg} }, "No such language: $arg" ],
];
}
...
}
Vous construisez votre table selon vos besoins. Dans needs
vous traitez juste la table:
sub needs($$) {
my ($table) = @_;
foreach $test (@$table) {
my($sub, $message) = @$test;
unless($sub->(...)) {
print $message;
return
}
}
return 1;
}
Maintenant, la chose vraiment cool avec cette approche est que vous ne devez pas savoir à l'avance la table. Vous pouvez tirer cela de la configuration ou d'une autre méthode. Cela signifie également que vous pouvez changer la table dynamiquement. Maintenant, votre code se rétrécit un peu:
sub run_find {
my $arg = shift @_;
return unless needs($validators{run_find});
...
}
Vous pouvez continuer avec ceci. Dans Maîtriser Perl Je montre quelques solutions qui suppriment complètement cela du code et le déplacent dans un fichier de configuration. Autrement dit, vous pouvez modifier les règles métier sans modifier le code. Rappelez-vous, presque à chaque fois que vous tapez la même séquence de caractères, vous vous trompez probablement.:)
Vous réalisez que, comme vous l'avez écrit, 'needs' sera toujours' return $ condition', n'est-ce pas? – Zaid