[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: 銀行のシリアライズについて


幾つかソースをいじりました。

・「毎日5時にタイマーコールバック」みたいなのは、registerRepeated
  のオーバーロードされたバージョンを使って簡単に実装できます。

    clock.registerRepeated(
        new ClockHandler(onNewDay),
        TimeSpan.untilTomorrow()+TimeSpan.fromHours(5),
        TimeSpan.ONEDAY );

・起動時にスレッドを作らない。
 新しい世界が作られた時に何かの処理をするには、World.onNewWorldに
 ハンドラを追加する。


肝心のセーブの問題ですが、御指摘のようにタイマーコールバックは全てシリア
ライゼーションの対象になるので、そこに問題があります。

まず、BankbookWindowが直接タイマーを使って営業中/休業中の情報を更新する
のではなく、BankModuleが現在の営業状態をstatusプロパティとして持つほうが
よいでしょう。銀行がいつ営業中でどのタイミングで営業状態が切り替わるか、
などといったdetailはBankModuleの中に隠されているべきことだからです。

そして、eventを使って、外部のモジュールがstatusの変化を取得できるように
しましょう。このeventにpersistent(シリアライズ対象になるもの)と
non-persistent(ならないもの)の2種類を用意することによって、
BankbookWindowが安全にstatusの変化を取得することが出来ます。


本当は、抜本的な問題としてpersistentなdelegateとnon-persistentなdelegate
の2種類が作れるようになればいいのですが、どうも.NETではそういうことはで
きなさそうです。


                        川口耕介 / kk@kohsuke.org

_______________________________________________
FreeTrain-general mailing list
FreeTrain-general@lists.sourceforge.jp
http://lists.sourceforge.jp/mailman/listinfo/freetrain-general

題名

名前

メッセージ