オブジェクトを以降のリクエストでも、他の利用者にも使えるようにすること。

永続化でやること Edit

  • Fetch
    キー(複数) → オブジェクト(複数)
  • Store
    キーとオブジェクト → 保存できていたらそのキー/さもなくば「保存できなかった」という何か
  • Search
    何か → 適合するキー(複数)
    何かとは…キーの一部 または永続化クラスが特別視する部分…例えばクラス名とか。
  • ValidateKeys
    キー(複数) → 使えるキー(複数)
    永続化クラス内部で使われるので、呼び出し側が使う必要は無い。
    Storeせずに使えるキーを得るために。

例えば…
Search→Fetch
組み合わせて使う。

永続化での上書きは追加で Edit

同一キーの書き込みはファイルの追加。ファイル追加ならロック待ちがおきないので効率的。
古いファイルは残す。同じキーに関連付けられるオブジェクトは複数。

上書き時、古いファイルは残す。
ファイル名に時刻でも付ければいい。新しいファイル名として有効ならいい。排他的ロックをかけられるまでは残す。

参照可能なのは最新版
1つのキーに対して複数のファイルが存在するので、最新版は探して見つける。ファイル名探索。

古いファイルは消せるときに消す Edit

古いファイル(同一キーでより新しいファイルがあるというファイル)を消すのはいつでもいい。消せるときに。
つまり最新版でなくて排他的ロックを取得できたファイルは消していい。

排他的ロック/共有ロック Edit

排他的ロックを使うのはファイルを作るときと消すときだけ。
変更/上書きはしないのでN/A。
共有ロックを使うのはファイルを参照するとき。

ファイルを消すときだけブロックロック待ち)が発生しうる。

永続化のキー Edit

Validateで削除か置き換えになる文字がある。
ファイルシステムのパスに使えない文字。

ディレクトリ区切りはそのままディレクトリ区切りになる。
ファイルシステムを直接見たときに分かりやすいように。

【パスの形式】
永続化ディレクトリ/クラス名/キー(ディレクトリ区切りがあればそれをディレクトリとして扱う).time.拡張子

Store時、渡されたキーが使えるキーでなければ勝手に変更する。ValidateKeysを使って。
Storeではキーが渡されなくてもいい。勝手に生成する。
戻り値に実際に使ったキーを含める。

シリアライズ Edit

Store時、シリアライズ可能なオブジェクトを渡されたらそのシリアライズを実行。不可能ならToString()でもしておく。それも不可能ならエラー。渡すオブジェクトはいずれかができなければならない。
(Stringのシリアライズは不要。Stringのシリアル形式はString)

永続化クラスでの検索 Edit

検索機能とは別の、低いレベルの話。