Islandにオブジェクトが格納されているとはどういう意味か
私がやろうとしていたのは、Legacy側と、Project側で相互にnon-C-Objectをやりとりする処理だったので、オブジェクトを相手側に渡すのにどうやればいいのかを理解するのが最大の課題でした。
異なるIslandどうしであればフレームワークにその機能が含まれていますが、この場合は相手側がIslandには入っていません(正確には、デフォルトのIslandという概念がある。Island(class)>>default 参照)
今の実装では次のように定義されています:
Object>>island "Answer the receiver's island" ^Processor activeIsland ProcessorScheduler>>activeIsland "Answer the currently active Island." ^activeProcess island ifNil:[Island default] Process>>island "Answer the receiver's island" ^island
これより、(今の実装では)次のように理解できそうです。
- オブジェクトがIslandに含まれるということは、そのオブジェクトを処理するプロセスがそのIslandに含まれるということである
- C-Objectの場合スクリプトスケジューリングという形でオブジェクトとプロセスとの関係が管理されているが、non-C-Objectの場合はそのような概念がない。つまり、C-Objectからnon-C-Objectへの到達パスがあるならば、その2つは同じIslandに属するとみなされる。
- 同じnon-C-Objectについての#islandの結果が、呼び出しの状況によって異なることがありえる。
今のところ、単純にnon-C-Objectのクローンを作成し、Islandをまたがる参照パスを断ち切っておけば、うまく受け渡しができています。これはIsland(class)>>default が発見できていなかったための苦渋の策なので、今度時間ができたら、デフォルトのIslandと普通のIsland間でのdeepcopyを試してみたいと思います。