12個のディレクトリに100個のPerlモジュールがあると考えてください。しかし、メインのPerlスクリプトを見ると、100use p1 ; use p2 ;
などのように見えます。この問題を解決するための最良の方法は何ですか?
4 に答える
use
100個のモジュールすべてをメインプログラムで直接使用しているとは思えません。プログラムがモジュールAの関数を使用し、モジュールBの関数を呼び出すが、メインプログラム自体がモジュールBの関数を参照していない場合、プログラムは。のみを参照する必要がありuse A
ます。use B
モジュールBから直接何かを呼び出さない限り、そうすべきではありません。
一方、メインプログラムが実際に100個のモジュールすべてと直接通信する場合は、おそらく大きすぎます。プログラム内のさまざまな機能グループを特定し、それらの各グループを独自のモジュールに分割します。これを行う主な理由は、コードの保守性、柔軟性、再利用性を高めるためですが、メインプログラムが直接通信するモジュールの数を減らして、削減するという嬉しい副作用もあります。use
1か所で必要なステートメントの数を減らします。
(そして、はい、私は100がおそらく誇張であったことを認識していますがuse
、コードによってdされているモジュールの数に不快感を覚えている場合、それは通常、問題のコードが実行しようとしていることを強く示しています多くは1つの場所にあり、モジュールのコレクションに分割する必要があります。)
use
Mods.pmのように、すべてのステートメントを1つのファイルに入れます。
package Mods;
use Mod1;
use Mod2;
...
そして、メインスクリプトにファイルを含めます。
use Mods;
私はeugeneのソリューションをサポートしていますが、次のuse
ように、トピックごとにファイル内のステートメントをグループ化できます。
package Math;
use ModMatrix;
use ModFourier;
...
そしてもちろん、モジュールとmod-collectionsに意味のある名前を付ける必要があります。
eugene yが提案したように、すべてのuseステートメントを別のファイルに入れるのがおそらく最良のアプローチです。少しのメタプログラミングで、そのモジュールへの入力を最小限に抑えることができます。
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