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 風味な仕組みでした。
[ツッコミを入れる]