« 正式に移行... | メイン | まだまだ OreCa for C++ について »
2005年06月27日
ふたたび OreCa for C++ について考える
さて、NSBasic 方式のデータベースに対して入出力をサポートしたいという要件について考えてきたその結果として登場した NSBasicDatabase クラスだが、ユーザー定義タイプ( 構造体およびクラス )に関してはどうすればいいだろうか。単純にアトミックな型だけで構成される構造体であれば先日のメンバ関数テンプレートで対応できる( 構造体のアライメントの問題があるか...)が、文字列メンバを含んでいると話は厄介になる。
実際にそういう要件があるのかといわれれば、例として OreCa のデータベースが出てくるだろう。NSBasic においてデータベースにアップデートをかける DbUpdate( ) メソッドの構文は不定の引数をとるように見える。これを構造体のように見立てて入出力をしようと考えているわけだ。
別の考え方として、特定のキーにアタッチした後に入出力をストリームのように扱う方法もある。
NSBasicDatabase nsbdb( "testDB" );
nsbdb.Attach( "theKey" ) << intVal << stringVal << floatVal;
この方法は、データベースクラスのオブジェクトが特定のキーをロックして不定の期間保持しなければならないことを意味するし、レコードのサイズを頻繁に変更しなければならないと言う意味でよくない。全ての操作はアトミックではないから、以下のように書いても同じ動作をしなければならないのだ。
NSBasicDatabase nsbdb( "testDB" );
nsbdb.Attach( "theKey" );
nsbdb << intVal;
nsbdb << stringVal;
nsbdb << floatVal;
では、代入演算子のメタファーで行くと言うのはどうか? この場合、NSBasicDatabase はキー文字列をインデックスに取る連想配列という仮面をかぶる。たとえば、int 型に対しては以下のようになるだろう。問題は、NSBasicDatabase::operator[]( ) がなにを返すかだ...専用のプロキシクラスを立てるか。たとえば NSBasicRecord とか。
int intValue = 100;
NSBasicDatabase nsbdb( "testDB" );
nsbdb["keyForInt"] = intValue;
では、この方法でユーザー定義タイプをエレガントに解決できるか? NSBasicRecord::operator=( ) をグローバル演算子オーバーロードして実装してやればいい。この方が美しいかな。表現として STL にも近いし...
投稿者 kagelow : 2005年06月27日 12:32