Ich bin nicht begeistert von der argument-passing-Architektur, die ich für die (vielen) Perl-Skripten entwickle, die für einige Skripte entwickelt wurden, die verschiedene Hadoop MapReduce-Jobs aufrufen.Wie kann ich gemeinsame Argumente an Perl-Module übergeben?
Derzeit gibt es 8 Skripts (in der Form run_something.pl), die von cron ausgeführt werden. (Und mehr auf dem Weg ... wir erwarten irgendwo zwischen 1 und 3 mehr für jede Funktion, die wir zu hadoop hinzufügen.) Jedes von diesen hat ungefähr 6 identische Befehlszeilenparameter und einige Befehlszeilenparameter, die ähnlich sind, alle spezifiziert mit Euklid.
Die Implementierungen sind in einem Dutzend .pm-Modulen. Einige davon sind weit verbreitet, und von denen andere einzigartig sind ....
Derzeit bin ich vorbei die args global zu jedem Modul ...
Innen run_something.pl ich habe:
set_common_args (%ARGV);
set_something_args (%ARGV);
Und in Something.pm habe ich
sub set_something_args { (% MYARGS) = @ _; }
So dann kann ich
if ($MYARGS{'--needs_more_beer'}) {
$beer++;
}
Ich sehe, dass ich wahrscheinlich zusätzliche „gemeinsame“ Dateien haben, gehen die ich will werde args, passieren, so dass ich haben drei oder vier set_xxx_args Aufrufe an der Spitze jeder run_something.pl, und es scheint einfach nicht zu elegant.
Auf der anderen Seite schlägt es die Übergabe des ganzen dummen Argumentarrays in die Anrufkette, und die Auswahl und Weiterleitung einzelner Elemente in der Anrufkette ist (a) zu viel Arbeit (b) fehleranfällig (c) doesn ' t viel kaufen.
In viele Möglichkeiten, was ich tue ist nur objektorientiertes Design, ohne die objektorientierte Sprache trappings, und es sieht hässlicher ohne das Drum und Dran, aber dennoch ...
Jeder Gedanken oder Ideen?
Oder überspringen Sie einfach das Boilerplate-Hauptprogramm, konsumieren MooseX :: Runnable und sagen Sie 'mx-run MyApp :: Module :: Foo --args --go --here'. Keine Hacks erforderlich. – jrockway