そんで考えたのが以下のもの。上記は今考えた用語。要するによく話題になるオブジェクトはどのコンテナに入れる?問題。
以下のようなオブジェクト管理ができると嬉しいんじゃないかなーとか思ってるわけです。突然 Ruby っぽいコードになります。
class WeakWeakShot < Shot feature :hitSwordable, :hitShotable end class WeakStrongShot < Shot feature :hitSwordable end class StrongWeakShot < Shot feature :hitShotable end class StrongStrongShot < Shot end
とかいう感じでクラス単位で特徴を指示しておいて、あとは
omgr.each(:hitSwordable) {|o| o.hitSword}
とかでイテレーティングする、と。この際に全オブジェクトが :hitSwordable であるかどうかをチェックしてイテレーティングしてると比較大量発生でイヤンなわけですが、これはシステムがおさめるコンテナを勝手に階層化してくれればいいんじゃないかなと。
つまり、上記だと、 (Weak|Strong)(Weak|Strong)Shot の4つのクラスはそれぞれ別のコンテナ、例えば WeakWeakShotMgr におさめられて、かつ、勝手にシステムが作るクラス HitSwordableMgr は WeakWeakShotMgr と WeakStrongShotMgr をおさめていて、 each(:hitSwordable) とかすると、 HitSwordableMgr ごしに WeakWeakShotMgr と WeakStrongShotMgr をイテレートしてくれる、というような仕組みがあるといいのではないかなと。
あと、二種類の属性を使ってイテレートする場合、例えば :shot かつ :hitSwordable をイテレートしたい場合、 each(:shot, :hitSwordable) とかするとして、この場合はありえる全てのコンテナを作っておくと、 feature の数に対して指数オーダーのコンテナが必要になるので、こういう場合は :shot の条件を満たしたコンテナをなめてから、二つ目の条件に対してはコンテナを一つずつなめていけばいいかなと、オブジェクト全部を調べるのに比べればはるかに速いはず。
あーやっぱり説明が激しくわかりにくい。なんか今度実装して試してみます。というか SDL ネタにして意見聞いてみようとか思ってたわけですが。 C++ とかでこれやろうとするとなんかかなり面倒なことになりそうなので(最近の発想だとすぐに「動的にクラスを作るには…」とかになる) Ruby あたりでやってみようかと。
そして AOP の話とかもからめるつもりがからまってない。あと Composite パターンとか Strategy パターンとか MVC がめんどくさい話とか。