こんばんはこんばんは。YAPC が終わって、そろそろ1ヶ月になるんですね。。。 YAPC の直前くらいに書き始めた本連載も今回が最終回です。

僕が作っているKappa という ORM の話。 今日は雑多な話です。スピリチュアルです。コードもありません。

目次

設計思想みたいな話

僕はアプリケーションというものは、当該業務を写す鏡のようなものである、と考えています。

運用がぐちゃぐちゃな部分はアプリもぐちゃぐちゃになって、「あちゃー」という思いをすることもあるし、逆に、 アプリ作ってみて、「この業務はこういう風になってたのか」と感心することもあります。

その1で紹介したいくつかの僕の blog 記事でさんざんストアドプロシージャを dis っているのは、ストアドの記述力だと、よほど上手に組まないと、「業務を写す鏡」までたどり着かず、 似たようなロジックなのに共通化できないとか、そもそもただのループ回すにも一苦労とか、項目追加するだけなのに、 書き換えるところ多すぎとか、そういうことに何度も直面してきたからです。

Kappa では、ロジックはすべてテーブルクラス(と Row オブジェクト)に置かれることになります。テーブルクラスでロジックを 作り込めば作り込むほど、全体のモデルが賢くなるように出来ています。(もちろん、ちゃんとクラス階層を作らないとダメですよ)

機能の話

基本的に、Kappa 本体では、テーブルクラスと Row オブジェクトの処理以外はしないつもりです。(最近カスタマイズ可能なイテレータを 付けたのですが、これをどうしようか、かなり悩んでいます。将来消しちゃうかもしれません。)

トランザクション管理とか、コネクション管理とか、その辺は ORM で持つ方がいいかな、という気もしなくもないのですが、 DBI の上に一枚なにかかぶせて、なんとかするのを今検討しています。

DBIx::Decorator ってのを書いてみたら、色々ダメさ加減が分かった話

まだ成果は出ていないんですけどね。。。

今、プロジェクトの親クラス(今まで説明してきた例でいうと、MilkyHolmes::DB とか MilkyHolmes::DB::Table)あたりに置いてる物体で、 汎用っぽいものが見えてくれば、将来コアに追加されるかもしれませんが、今の所、そういうものは見えていません。

プラグイン

基本的に、プラグイン機能は考えていません。プロジェクトの親クラスにメソッド置けば十分ではないか、と考えています。先行者の Teng も プラグインあんまり出回ってませんしね。。。

(SQL::Maker を内部で使っているので、)SQL::Maker のプラグインでいい感じのものが増えてきたら、 SQL::Maker のプラグインを簡単に組み込める機能とか付けるかもしれません。

スキーマ定義の話

もともとスキーマレスで使えることを志向しているので、スキーマクラスとか無いのですが、テーブルクラスにスキーマ上の PK とかを 定義するときは、正規の方法を提供してあげるほうがいいのかな、とかちょっと思っています。(今、僕のプロジェクトで ::DB::Table に置いてる シンタックスはひどすぎるので、別のものを考えてみるつもりです)。これができると、INSERT して SELECT して Row オブジェクト返したりとかできる ようになるので、ちょっとだけ嬉しいかな、と思っています。

今後の話

今のところ、機能的にはあんまり困っていません。が、別のプロジェクトで使ってみると、バグが見つかったり、欲しい機能が出てきたりするので、 いろいろな所で使ってみようと思っています。

あと、内部で、SQL 実行エンジンとして使っている SQL::Executor というモジュール(これも僕が作ったやつ)が出すエラーメッセージがひどすぎるので、 それは改善したいな、と思っています。

互換性の話

今、ふつうに業務で使っているので、激しく非互換にすることは無いとは思いますが、自分の中ではまだまだベータ版だよなー、と思っています。 なので、非互換な変更が将来入るかもしれません。

CPAN にあげる?

将来、設計がだいぶ安定して、使ってる人が出てきたりしたら CPAN に上げるかもしれませんが、今のところそのつもりは無いです。

まとめ

今回は雑談なので、まとめ、といいつつ、まとめるような話はありません。連載は今回でおしまいにするつもりですが、今後も何か機能追加やバグフィックス などあれば、随時記事は書いていきたいと思います。

Kappa に関して、なにかリクエストや疑問や文句などあれば、twitter(@tsucchi) とかこのブログのコメント欄(使ったこと無いから使えるか分らんけど)とか、 はてブとか、その辺で連絡してみてください。要望とかバグなどあれば、@tsucchi か github issue(日本語でいいです。ってか日本語のがいいです)まで。

ではでは。