技術系

Perlには、Class::DBIというモジュールがある。使ってみると、まあ便利なのだが、問題もある。例えば、あるデータベース(名前はtest)に、userというテーブルが存在しているとしよう。

id name
1 akagi
2 itou
3 sawa

その場合、Class::DBIを継承して作ったモジュールである、Test::DB::Userというのを自分で作る。そしてその上で、
my $id1 = Test::DB::User->retrieve(1);
とすると、$id1は

$id1 = bless{
      id => 1,
      name => 'akagi',
       },Test::DB::User;

となる。

で、何が問題かといえば、このモジュールは一つのテーブルに対して一つのクラスが対応しているわけだが、どういうわけか一つの行に対して一つのインスタンスを生成している。これはおかしいのではないだろうか、という気がいつもするのだ。

そこで、僕は以下のようなモジュールを考えた。
まず、あるデータベースに対して、一つのインスタンスが存在する。あるデータベースインスタンスは、一つのコネクションといくつかのテーブルインスタンスを持つ。
テーブルインスタンスは、自身のテーブル名とカラムの名前の他に、データベースへのコネクション、そしてデータベースの名前を持つ。
テーブルインスタンスにメッセージを送ることで、行オブジェクトを取ることが出来る。行オブジェクトは、行のデータ以外にそれぞれが所属しているテーブルインスタンスへのリファレンスを持つ。
これを実際に使うとこのようになるのだ。

#retrieve

 $database = new Test::DB;
 $table = $database->table('user');
 $id1_user = $table->retrieve(1);

#id1_user update;

 $id1_user->change(name => 'sigeru');
 $id1_user->update();

どうだろうか。この簡単なスクリプトであっても、よりイメージしやすいモジュールが作れていると思うのだが。
今度、時間があれば作ってみたいと思う。