2

まだデータベースに接続されていない大きなスクリプトがあります。小さな新機能用に 1 つ必要です。ネイキッド ブロックをrequire DBI必要な場所に追加しても安全ですか、それとも何かをインポートする必要がありますか?

# Lots of no-database code here...
my $obj;
{
  require DBI;
  my $dbh = DBI->connect('dsn');
  $obj = ModuleThatNeedsDBH->new(dbh => $dbh);
}
$obj->fancyStuff();
# More no-database code...

$dbhブロックはもちろん、プログラムの残りの部分から隠しておくことです。

4

2 に答える 2

3

デフォルトでは、DBIモジュールは呼び出し元のパッケージに何もインポートしないので、理論的requireにはuse.

しかし、あなたはこれから何を得たいと思っていますか?この場合use DBIは と同等BEGIN { require DBI }であり、ブロックを省略すると、BEGIN実行時にパッケージをロードするという望ましくない長いプロセスが課されることになります。

データベースへの接続の失敗も処理する必要があることに注意してください。

my $dbh = DBI->connect('dsn', 'user', 'pass')
            or die $DBI::errstr;

あなたの場合、死ぬことは少し極端かもしれませんが。

于 2012-07-02T15:41:04.790 に答える
2

デフォルトでは DBI は何もインポートしませんが、使用時に内部処理やセットアップを行わないという意味ではありません。モジュールのドキュメントに別段の記載がない限り、完全なプロセスを使用して、発生するはずのすべてが実際に行われるようにする必要があります。How can I dynamic include Perl modules without using eval?を見たいと思うかもしれません。.

また、ModuleThatNeedsDBH引数リストに収まらない場合は、自動的に作成することを検討します。依存性注入は優れていますが、必要なものを作成するために上位レベルを強制する必要があるという意味ではありません。

于 2012-07-02T20:51:10.540 に答える