6
votes

Devrais-je établir l'héritage au moment de la compilation plutôt que de l'exécution, et si oui pourquoi?

L'héritage Afaik dans Perl est généralement configuré comme suit:

package Mule;
our @ISA = ("Horse", "Donkey");


3 commentaires

Les modules base et parent vous permettent d'établir des relations ISA à la compilation. En revanche, modifier @isa vous-même se produit au moment de l'exécution. À cette lumière, une façon de reformuler votre question est comme ceci: Est-il généralement avantageux d'établir le héritage précédent (compilation-heure) plutôt que plus tard, et si oui pourquoi? Voir également ces questions connexes: Stackoverflow.com/questions/1378309/... et Stackoverflow.com/questions/876471/... .


commence {@isa = ...}; se produit également au moment de la compilation.


@Fm merci de commentaire :-) J'ai reformulé la question


3 Réponses :


5
votes
BEGIN {
    require Horse;
    require Donkey;
    push @ISA, qw(Horse Donkey);
}

5 commentaires

Vous pouvez utiliser UTILISER PARENT QW (classes de base) ou utiliser la base QW (classes de base). Le parent est préférable sur la base car elle a beaucoup moins de magie sombre, mais ce n'est pas dans la base de la base.


Je suis trop rouillé à Perl pour en savoir plus sur «Parent». Merci @leon +1


Le module fonctionnera lorsque la classe mère est dans le même fichier. Voir Search.cpan.org/perldoc?base .


Leon: le parent est à base. Cela n'a tout simplement pas été aussi longtemps que la base.


@Fm: Comme le parent, seulement vous devez être explicite sur votre intention



1
votes

En ce qui concerne Compile-VS-Run-Time:

en Perl, les modules (packages / espaces de noms) vivent généralement dans des fichiers distincts. C'est à dire. Quelqu'un :: Module serait trouvé dans certains / module.pm. Dans cette configuration, la différence de compile-vs-roulant ne comptera pas beaucoup. Le temps d'exécution du module que vous chargez via use () sera avant que la compilation du code d'appel continue. Observateur:

fichier certains / module.pm : xxx

fichier test.pl : xxx

La sortie sera la suivante: xxx

par conséquent, un notre @isa = qw (base); sera exécuté avant que la compilation de votre programme principal continue après le chargement du module.

Il est correct, cependant, que l'attribution à @isa ne garantit pas que le La classe de base a été chargée. C'est pourquoi nous avons le utilise la base et utilisez des pragmas parent . Si vous n'avez pas besoin spécifiquement de fonctionnalités de Utiliser la base (champs) ni la compatibilité plus longue en arrière qu'elle fournit sur Utiliser le parent , je vous suggère d'utiliser plus léger-poids Utiliser le parent .


0 commentaires

3
votes

établir l'héritage au moment de la compilation évite une boucle de dépendance particulièrement difficile à déboguer, illustrée ci-dessous.

# Child.pm
package Child;

our @ISA = qw(Mother);

use Foo;

# Mother.pm
package Mother;

sub wibble { 42 }

# Foo.pm
package Foo;

use Child;
Child->wibble;


1 commentaires

Merci, c'est une illustration utile.