2011-05-23 90 views
2

我发现我有很多场合,我有一个通常需要实例化为“集合”的类。我的解决方案一直是这样做的:类是使用类方法来“管理”自身实例的好习惯吗?

class Foo 
    attr_accessor :bar 
    def initialize bar 
    @bar = bar 
    end 
end 

class FooCollection 
    attr_accessor :foos 
    def initialize 
    (0.10).each {|n| @foos[n] = Foo.new(n)} 
    @coolest = 3 
    end 

    def coolest 
    @foos[@coolest] 
    end 
end 

我曾考虑过使用这种类型的行为类方法。我似乎无法下定决心要做到这一点是否更清洁或更混乱。

class Foo 
    attr_accessor :bar 
    @@all = [] 
    def self.create_all 
    (0.10).each {|n| @@all[n] = Foo.new(n)} 
    @@coolest = 3 
    end 

    def self.coolest 
    @@all[@@coolest] 
    end 

    def initialize bar 
    @bar = bar 
    end 
end 

我知道使用类方法创建了它是一个单身的问题,所以如果我需要让富的多个集合我可能必须进行收集阵列或东西的哈希值。但是,实际上,这些解决方案对我来说都不是“干净”的,如果是这种情况,通常会有更好的选择,我不知道。有一个吗?

+2

这可能有助于使用实际场景,因为我无法真正关注您的foobar代码。 – 2011-05-23 02:47:23

+0

嗯,我是一个新手,但我认为这将是一个简单的例子。它只是创建了10个对象的集合,并且具有对象本身无法知道的某种指定。在这种情况下,我选择了“最酷”。 – 2011-05-23 15:54:08

回答

1

这里有一个想法,你可能会喜欢:

class FooCollection < Array 

    def initialize 
    super 
    (0..10).each { |n| self[n] = Foo.new n } 
    @coolest = 3 
    end 

    def coolest 
    self[@coolest] 
    end 

end 
+1

或者你可以使用'def_delegators:@foos,:[]'如果你更喜欢合成而不是继承。 – 2011-05-23 02:55:48

1

至于“做的选择我?”,我不能说谁的人已经学会了如何做正确的事,就像有人谁做了不正当的事情。

我会说避免单身人士。你可能会认为这只是一件事情,但这可能会因为没有人能预料到的原因而改变。我知道有“你不会需要它”,但是这一次,把它想成“你不需要单身人士”,而不是“你不需要能够做多个FooCollections”。

如果FooCollection听起来很愚蠢,不要用它作为单身人士的理由。尝试找出使用FooCollection的内容。如果只有一件事情使用FooCollection,比如说Bazza,那么可能有代码处理Bazza中的Foo或者包含在Bazza中的模块。否则,如果有多个使用FooCollection的对象,只要尝试将尽可能多的方法放入FooCollection即可,直到您知道要重命名它为止。

相关问题