对于类来说,使用类方法“管理”自身实例是一种好习惯吗?

时间:2011-05-23 02:24:49

标签: ruby-on-rails ruby

我发现我有很多场合,我有一个通常需要实例化为“集合”的类。我的解决方案一直是做这样的事情:

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

我知道使用类方法会产生一个问题,因为它是一个单例,所以如果我需要创建多个foo集合,我可能必须使集合成为数组或其他东西的散列。但实际上,这些解决方案对我来说都不是“干净”,而在这种情况下,通常会有一个我不知道的更好的选择。有吗?

2 个答案:

答案 0 :(得分: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 :(得分:1)

关于“我有哪些替代方案?”,我不能说是一个已经学会如何正确行事的人,就像那些做事不正确的人一样。

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

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