Il existe plusieurs façons de gérer la réutilisation du code en Perl. De nombreux exemples ne font pas clairement la distinction entre les approches et de nombreuses classes en utilisent au moins deux.
Je conseille d'utiliser autant que possible le style OO et de n'utiliser l'EXPORTATEUR que si vous avez au moins trois classes ou plus qui ont besoin d'un cluster relativement petit de fonctions utilitaires.
Donc:
package Foo;
use Foo::Util qw(util) ;
use strict ;
sub foo {
}
sub bar {
}
1;
package Foo::Bar ;
use Foo ;
use Foo::Util qw(util) ;
our @ISA = qw(Foo) ;
use strict ;
sub bar {
}
1;
package Foo::Util ;
use Exporter ;
our @ISA = qw(Exporter) ;
our @EXPORT = qw(util) ;
use strict ;
sub util {
}
1;
Je préfère visualiser l'approche OO et l' EXPORTERapproche comme deux dimensions différentes de la disponibilité du code, comme si les fonctions venaient dans le package actuel à partir de l'axe x ou y.
Dans l'exemple ci-dessus:
Foo::Bardérive la méthode foo()de la classeFoo
Foo::Bardéfinit une bar()méthode pour que la méthode polymorphe bar()ne soit pas dérivée de la classeFoo
Les deux classes Fooet Foo::Barreçoivent la EXPORTEDfonction ( pas la méthode ) util()du package ( pas la classe )Foo::Util
Les deux systèmes semblent compliqués mais ont une utilité très pratique. Le suivi de l'héritage multiple peut devenir difficile et rapide. Donc, avoir la deuxième dimension de la disponibilité du code, vous permet de garder votre arbre d'héritage petit et gérable.
Généralement, si une fonction est monolithique et relativement stupide, utilisez EXPORTER, sinon utilisez l'héritage. Mais ne vous embêtez pas EXPORTERdu tout à moins que ce que vous allez faire soit susceptible d'impliquer plus de 3 ou 4 packages.