CRLのプロジェクト

さて、このプロジェクトでは、3次元物体を表すオブジェクトがあって(物体を表すオブジェクトとはこれ如何に?)、それをクリックしたりドラッグしたりしたときの動作をいわばある種のモードによって切り替えたい、という問題があります。別にこのプロジェクトに限った事ではなく、一般的な問題ではありますが。

その3次元モデルたちは、単純な立方体なこともありますが、複雑なメッシュデータの事もあって、必ずしも共通の親クラスを(継承ツリーの低いところで)共有しているわけではありません。また、ほとんど同じなんだけど、ちょっとだけ違う動作をしなくてはならない、という物体も何種類かあります。

というわけで、他の3次元物体を包み込んで(それ自体はレンダリングされない=目に見えないけど、子物体は表示される)異なる動作を提供する3次元物体が何通りかあり、その中ではあるモードを表すフラグに応じてイベントハンドラの動作が変わる、というような形になっています。

問題は、昔から何度も言われている通りに、クラスの継承構造に当てはまらないために、似たようなコードがあちこちのクラスに書かれている、という事です。

一部でささやかれているTweakは、かなりプロトタイプベースチックな味が良く出ていて、このような問題を解決するときにとっても有効、なはずなのですがなにしろそもそもCroquetに統合されていないので、現状では泣く泣くコードのコピーを作っていく、という事になってしまっています。

Croquetにおいてこの問題がちょっと違う様相を見せるのは、リモートコンピュータ上には自分の分身がいて、それらは一意に付けられた名前によって同じものである、と認識されている事です。動作を変えたいときに、包んでいる皮をひょいっと付け替える、という方針だと、ローカルで皮を変えたらリモートの皮も同様に変えたりしなくてはならず、分散環境での一意性を制御するという問題が複雑になってしまいます。そのため、やや汚くても、同じオブジェクトにいろいろな機能を持たせておいて、モードを見て選ばれる動作を切り替える、という少々美しくない解に落ち着いてしまう嫌いがあります。

僕自身はハックして動けば納得する、という面も強い人ではありますが、「きれいな解」というのも大事ですよね、という結論の項目でした。