2005年12月12日
_ Feature Base Object Management
これはこういうことでしょうか。
class ObjManager def initialize @all_objs = [] @container = Hash.new{|h,k| h[k]=Array.new} end def add(obj) @all_objs << obj obj.features.each do |feature| @container[feature] << obj end end def objs(*features) case features.size when 0 @all_objs when 1 @container[features.first] else main, *subs = *features @container[main].find_all{|obj| subs - obj.features == []} end end end class ManagedObj class << self def def_features(*features) @features ||= [] @features.concat(features) end attr_reader :features end def features self.class.features end end # テスト class A < ManagedObj def_features :x, :y end class B < ManagedObj def_features :y, :z end mgr = ObjManager.new mgr.add A.new mgr.add B.new p mgr.objs p mgr.objs(:x) p mgr.objs(:y) p mgr.objs(:y, :z) p mgr.objs(:z, :x)
もうすこし工夫すれば継承が使えたりするようにはできるでしょう。
以前 Ruby でゲームを作るための思考実験として同様のシステムを作りました。 ただし上のやりかたそのままだと自分自身の消滅を扱うのが面倒なので、 毎フレームごとに自分自身を適切な分類に登録していくようにしました。 Template method パターンとクラスメソッドの併用で Rails 風味な仕組みでした。