【问题标题】:Using ruby attr_readers inside a class (versus just using instance variables)?在类中使用 ruby​​ attr_readers(而不是仅使用实例变量)?
【发布时间】:2015-10-31 21:50:57
【问题描述】:

我正在构建一个系统,该系统使用许多小类进行数据处理(每个类执行不同的处理步骤,nice & SRP 之类的)。我用一些参数初始化每个类,然后在该类上调用一个 execute() 方法,然后使用其他私有方法进行一些数据计算。

我的问题是:如果我没有访问类之外的任何参数,我应该只使用私有方法中的实例变量吗?还是定义一个 attr_reader?

例如,下面是我编写的一些人为的代码:

class Car
  attr_reader :make

  def initialize(make, model)
    @make = make
    @model = model
  end

  def execute
    apply_paint
    rotate_tires
  end

  private

  def apply_paint
    if make == "Toyota"
      Painter.paint(self, "red")
    else
      Painter.paint(self, "green")
    end
  end

  def rotate_tires
    if @model == "Sequoia"
      set_tire_size(:large)
    else
      set_tire_size(:normal)
    end
  end
end

那么哪个更好?我是如何处理“make”或如何处理“model”的?

如果我知道我根本没有在这个类之外使用这些变量中的任何一个,我应该坚持使用实例变量吗?还是使用 attr_reader 更好,因为这样我可以将它们转换为实际方法而无需更改其余代码...即由于 apply_paint 使用 make 而不是 @make,我可以将 make 更改为如果需要,可以使用本地方法,并且不要更改 apply_paint 方法。

我一直在胡思乱想,不知道哪个更好。也许这只是一个偏好问题,但我想看看其他人对这个问题有什么想法。

【问题讨论】:

  • 使用attr_reader 不会花费您任何费用,而且正如您所观察到的,它在未来可能会非常有益。那么这怎么可能是个问题呢?
  • 它确实让我付出了代价:它是额外的代码,它暴露了一个访问器(除非我将它设为私有),这意味着每次我在代码中看到“make”时,我都必须记住它是一个访问器(而不是局部变量或其他方法),而不是“@make”,后者显然是一个实例变量。所以我认为这是一个很好的问题,因为这两种方式都有明显的权衡。
  • 有趣,9 小时前我们在这个网站上遇到了几乎相同的问题:stackoverflow.com/a/33452093/2483313
  • @DanSharp:“我必须记住它是一个访问器”——你呢?如果您的方法很短(它们应该是),那么这是否是参数/本地方法将立即显而易见(在这种情况下,它是某种方法,您不关心究竟是哪种方法)。
  • 你也可以使用私有的 attr_ 方法。这样,如果它需要在类内部是只读的,您可以在不将变量暴露给外界的情况下做到这一点。

标签: ruby instance-variables accessor


【解决方案1】:

使用 attr_ 方法。如果您不在课堂之外访问它们,您可以(并且可能应该)将它们设为私有。为什么要使用它们?您可以通过说明您对如何使用它的意图来提高可读性。 attr_reader 应解释为“仅应读取此变量”。

【讨论】:

    猜你喜欢
    • 2015-07-07
    • 1970-01-01
    • 2010-10-28
    • 2012-03-07
    • 2014-03-11
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    相关资源
    最近更新 更多