ruby - 在类中使用 ruby​​ attr_readers (而不是仅使用实例变量)?

标签 ruby instance-variables accessor

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

我的问题是:如果我没有访问类外部的任何参数,我是否应该只使用私有(private)方法中的实例变量?或者定义一个 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_ 方法。如果您不在类外访问它们,您可以(并且可能应该)将它们设为私有(private)。为什么要使用它们?您可以通过陈述您对如何使用它的意图来提高可读性。 attr_reader 应被解释为“该变量只能被读取”。

关于ruby - 在类中使用 ruby​​ attr_readers (而不是仅使用实例变量)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33457024/

相关文章:

javascript - Javascript 类中的实例变量

c++ - Generic Mutator/Accessor 函数

javascript - d3.csv修改输入数据

ruby-on-rails - 注销前更新 current_user 时收到 "Attempted to update a stale object: User"异常

ruby - 错误 : Cookbook loaded at path(s) has invalid metadata

javascript - 在大多数 OOP 语言中,实例方法中的 "i"是否首先引用本地,然后引用全局,但从不引用实例变量或类变量?

java - Java 类和访问器方法

ruby - 如何静默启动 Sinatra + Thin?

javascript - 如何在 Rails 中输出整个 Assets 管道?

objective-c - Objective-C中的ivars和属性有什么区别