データベース特性
たとえばゴブリン大部隊にいる指定されたキャラの空間座標を x, y, z に書き換える場合、間違いなく、
pDivison->get( id )->setPosition( x, y, z );
という関係になってくる。
まかり間違っても、
pDivision->setPosition( id, x, y, z );
というような操作はつけないでしょう。
他方、データベースなら、
UPDATE division set px=x, py=y, pz=z WHERE ID = id;
と書ける。それをモデル化すれば、
pDivision->setPosition(id, x, y, z);
というメンバ関数を持つのは当然の成り行きであり、このメンバ関数をコールする側としても、自然なオペレーションということに……
別の視点もある。よく考えてみるとアプリケーションとデータベースはクライアントとサーバーの関係にあり、 get() しても得られるのはデータのコピーでしかない。
これを、データ本体は別のプロセス、別のコア、別の記憶空間にあって直にアクセスすることは許されず、書き込みには同期が必要な状況として考えてみる。
(周辺プロセッサとのやりとりで起こり得るケースだと思う)
CGoblin *pGoblin = pDivision->get( id ); pGoblin->setLeader(); pDivision->sync( pGoblin ); // 同期発生 // リーダーを中心とした新しいスクワッドを作成 CSquad *pNewSquad = pDivision->createSquad( pGoblin, 8 ); // 同期発生 // リーダー周辺の負傷ゴブリンを取得して配属 int itr; for (CGoblin *pFollower = pDivision->getWoundedFirst( &itr, pGoblin ); !pFollower; pFollower = pDivision->getWoundedNext( &itr, pGoblin )) { if (!pNewSquad->add( pFollower )) break; pDivision->sync( pNewSquad ); // 同期発生 }
明らかに重そうだ。そして実際にパフォーマンスチェックで足を引っ張ってしまい、「お前のパートのせいで60fpsになんねえよ(−_−#)」などと責められたとしよう。
しかし、もし、このプロセッサ(?)に、複数のデータ更新を1回の要請で変更することができ、そうするときレイテンシは最短になるという特別な転送モードが備わっていたらどうだろうか。
pDivison->setSomethongAll(...); // sync 発生
とすることに何の抵抗もない。データベースのデータモデルとやりとりをするというのは、こういう感覚なのかもしれない。