光学薄膜設計ソフトの設計 その18 - 値の変更管理 [考え中 - 光学薄膜設計]
最近コードをさわってないので、忘れないように、ということで久しぶりの薄膜設計ソフト。計算エンジンの実装をどうするか考える。
前回も書いたけどこのあと書くコードは単なる試行錯誤の途中の列挙であって、デバグされたものではないことをに注意してほしい。
計算した結果の値をキャッシュするためには、自分に関係あるパラメータが変更されたかどうかを監視している必要がある。この監視にはいろいろなやり方があるけど、若干のオーバーヘッドを許せば簡単な方法がある。
それはパラメータが変更されたとき、それを通知してもらうというやりかたである。
通知にはFoundationフレームワークの中にNSNotoficationという便利なクラスがあるが、これは結構高機能で重い。もうちょっと簡単なクラスを設計して使うことにする。
考え方
簡単にすますためには、図-5.3のように監視される方のオブジェクトが監視したいオブジェクトの配列を持っていて、監視されるオブジェクトの値が変更されたら配列の中のオブジェクト全部に「変更されたよ」と知らせると言うものである。
そのためには、監視されるオブジェクトが配列を保持することと、
- 配列に登録する
- 配列から取り除く
- 「変更されたよ」に応答する
変更の伝播
計算ではいろいろな値を扱うことになるけど、変更管理の点から見るとふたつに分類できる。
- 他のパラメータに値が影響されないもの
- 他のパラメータの値に従って値を変えるもの
- 波長
- 入射角
- 偏光
- 膜厚
- 屈折率(波長が変わると値が変わる)
- 特性マトリクスの値
とりあえず前者を主変数、後者を従変数と呼ぶことにする。
例えばOTFLayerは波長が変更されると自分の特性マトリクスの計算に影響を受けるけど、屈折率も変わっている可能性がある。従ってOTFLayerは少なくとも波長と屈折率の両方を監視する必要がある。そしてその場合、変更通知は2回来ることになる。この通知の順番はどうなるかわからないし、2回とは限らないかもしれない。
そこで、監視する側のオブジェクトは変更通知をもらったとき、自分の中で変更があったことだけ記憶して、再計算は実際に値が要求されたときに行うことにすればいい。OTFLayerの例では、波長から通知をもらうと自分のBOOL変数のisRevised変数をYESにセットする。その後屈折率から通知をもらってもisRevisedを再設定するだけ(あるいは何もしない)にする。その後OTFLayerはOTFLayerCompositionからマトリクスの要求があったとき、isRevisedを見てYESなら波長や屈折率から値をもらってきてマトリクスを再計算し、isRevisedがNOならキャッシュしている値を返すだけにする。もちろん再計算した後はisRevisedをNOにリセットするのを忘れないようにする。
このやり方は、ひとつのパラメータを変更するだけで、変更通知のメッセージが飛び交うことになるけど、プログラミングの面倒は比較的少ない。
オブジェクトの分類
計算エンジンの実際に光学特性を計算する部分に属するオブジェクトをふたつに分類してみると
- 主変数
- 波長
- 入射角
- 偏光
- 膜厚
- 従変数
- 屈折率
- 波長
- OTFLayer
- 屈折率
- 波長
- 入射角
- 偏光
- 膜厚
- OTFLayerComposition
- 屈折率(基板と入射媒質の)
- OTFLayer
- OTFOpticalCharacteristics
- OTFLayerComposition
- 屈折率
前者のオブジェクトは自分を監視しているオブジェクトの配列を保持して通知するだけでいいけど、後者は通知をもらって、自分を監視しているオブジェクトに通知を伝播する必要がある。
通知の問題は複雑だけどメカニズムは簡単。次回はこれを実装してみる。結局まだコードに入れなかったな。
コメント 0