Rozważ, że mam 100 modułów Perla w 12 katalogach. Ale patrząc na główny skrypt Perla, wygląda on jak 100 use p1 ; use p2 ;
itd. Jaki jest najlepszy sposób rozwiązania tego problemu?
Odpowiedzi:
8 dla odpowiedzi № 1Wydaje mi się mało prawdopodobne, że jesteś use
wszystkie 100 modułów bezpośrednio w głównym programie. Jeśli twój program używa funkcji w module A, który następnie wywołuje funkcję z modułu B, ale sam program główny nie odwołuje się do niczego w module B, program powinien tylko use A
. Nie powinno use B
chyba że bezpośrednio wywołuje cokolwiek z modułu B.
Z drugiej strony, jeśli naprawdę jesteś głównym programemrozmawia bezpośrednio ze wszystkimi 100 modułami, to prawdopodobnie jest po prostu zbyt duże. Zidentyfikuj różne grupy funkcjonalne w programie i podziel każdą z tych grup na własny moduł. Głównym powodem jest to, że spowoduje to kod, który jest łatwiejszy w utrzymaniu, elastyczny i wielokrotnego użytku, ale będzie miał również szczęśliwy efekt uboczny polegający na zmniejszeniu liczby modułów, z którymi program główny rozmawia bezpośrednio, zmniejszając w ten sposób liczbę use
wymagane oświadczenia w jednym miejscu.
(I tak, zdaję sobie sprawę, że 100 to prawdopodobnie przesada, ale jeśli czujesz się niekomfortowo z powodu liczby modułów use
d według twojego kodu, to jest zwykle silna wskazówka, że dany kod próbuje zrobić za dużo w jednym miejscu i powinien zostać podzielony na zbiór modułów.)
4 dla odpowiedzi nr 2
Umieść wszystkie use
instrukcje w jednym pliku, powiedzmy Mods.pm:
package Mods;
use Mod1;
use Mod2;
...
i dołącz plik do głównego skryptu:
use Mods;
2 dla odpowiedzi nr 3
Popieram rozwiązanie eugene, ale możesz pogrupować use
instrukcje w plikach według tematu, takie jak:
package Math;
use ModMatrix;
use ModFourier;
...
I oczywiście powinieneś nazwać moduły i znaczące kolekcje modów.
1 dla odpowiedzi nr 4
Umieszczenie wszystkich oświadczeń dotyczących użycia w osobnym pliku jako sugerowanym przez eugenię jest prawdopodobnie najlepszym podejściem. możesz zminimalizować wpisywanie w tym module za pomocą trochę meta programowania:
package Mods;
require Exporter;
our @ISA = "Exporter";
my @packages = qw/Mod1 Mod2 Mod3 .... /;
# or map {"Mod$_"} 1 .. 100 if your modules are actually named that way
for (@packages) {
eval "require $_" or die $@; # "use" means "require pkg; pkg->import()"
$_->import(); # at compile time
}
our @EXPORT = grep {*{$Mods::{$_}}{CODE}} keys %Mods::; # grab imported subs
#or @EXPORT_OK