9.2.3. リカバリおよび永続性
StateManager クラスはクラス階層のルート部分に存在し、オブジェクトの有効化、無効化、および回復を行います。例9.1「StateManager 実装」を参照してください。
例9.1 StateManager 実装
オブジェクトは、1)回復可能、2) 回復可能および永続的あるいは、3)回復可能でも永続的でもないというように分類可能です。
- 回復可能
StateManagerは、オブジェクトに関する適切なリカバリ情報を生成、保持しようとします。このようなオブジェクトの有効期間は、オブジェクトを作成したアプリケーションの有効期間を越えないものとします。- 回復可能かつ永続的
- オブジェクトの有効期間は、そのオブジェクトを作成する、あるいはアクセスするアプリケーションの有効期限よりも長くなっています。リカバリ情報を保持するだけでなく、
StateManagerは、適時activateあるいはdeactivate操作を呼び出すことで、オブジェクトの既存ステートおよび永続ステートを自動的にloadあるいはunloadしようとします。 - 回復可能でも永続的でもない
- リカバリ情報は保持されず、オブジェクトの有効化、無効化も自動試行されません。
オブジェクトが回復可能、あるいは回復可能かつ永続的であれば、
StateManager は、アプリケーション実行中の様々な時点に、deactivate メソッド実行の一部としてsave_state メソッドを呼び出し、activate実行の一部としてrestore_stateを呼び出します。StateManager はユーザーレベルのステート変更を検知することができないため、プログラマはこれらのメソッドを実装しなければなりません。そしてプログラマは、オブジェクトステートのどの部分を永続化するか決定します。例えば、スプレッドシートの場合、値を再計算できるのであれば、全エントリを保存する必要がありません。例9.2「save_state の例」の例は、A、B、Cという整数のメンバ変数を含むExample クラスのsave_state 実装について示しています。
例9.2 save_state の例
注記
クラッシュリカバリの仕組みに関する改善点を活用し、
save_state と restore_state メソッドはすべてsuper.save_state および super.restore_stateを呼出す必要があります。