2011-05-23 89 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即可,直到您知道要重命名它爲止。

相關問題