2

それで。

おそらく、私が抱えている特定の問題に対してタイトルが一般的すぎるのでしょう。

SQLite データベースに接続する Perl スクリプトがあります。ランタイム中に、SELECT、INSERT、UPDATE などの多くのデータベース操作を実行します。各データベース操作を独自のサブルーチンでラップしました (主に、SQL ステートメントと結果セットの追加処理を非表示にするため)。

このデータベース操作サブルーチンの 1 つを呼び出す必要があるたびに、同じデータベース ハンドラー オブジェクトを使用したいので、データベース ハンドラー オブジェクトを引数として渡します。例えば:

my $dbh = DBI->connect( "dbi:SQLite:dbname=db.db", "", "") or die;

sub select_from_systems {
    my $dbh = shift;
    return $dbh->selectcol_arrayref("SELECT hostname FROM systems");
}

ちなみに、私は Perl DBI を使用しています。

データベース ハンドラー オブジェクトを引数として渡す必要がないように、これを行うためのより賢い方法があるかどうか疑問に思っています。

グローバル変数は避けたいと思います。それらが疫病だとは思いません。この場合、それは正当化されるかもしれませんが、それでも.

どんな助けや洞察も大歓迎です。

よろしく。

4

3 に答える 3

4

モジュールをオブジェクト指向にします。これは引き続きハンドルを引数として渡しますが、より優れた構文になります。

package MyConnection;

sub new {
  my $class = shift;
  my $dbh = DBI->new(@_);
  bless \$dbh, $class;
}

sub select_from_systems {
    my $self = shift;
    $$self->selectcol_arrayref(...);
}

それで:

my $db = MyConnection->new(@credentials);
...;
my $result = $db->select_from_systems;

オブジェクトをモデル化するために、ここでは単純なスカラー参照を使用しましたが、従来のハッシュベースの OO (または単に Moose を使用) が必要な場合もあります。

于 2013-07-26T02:20:35.033 に答える