Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在类中使用ruby attr_读取器(与仅使用实例变量相比)?_Ruby_Instance Variables_Accessor - Fatal编程技术网

在类中使用ruby attr_读取器(与仅使用实例变量相比)?

在类中使用ruby attr_读取器(与仅使用实例变量相比)?,ruby,instance-variables,accessor,Ruby,Instance Variables,Accessor,我正在构建一个系统,它使用许多小类来进行数据处理(每个类都执行不同的处理步骤,类似nice&SRP)。我使用一些参数初始化每个类,然后对该类调用execute()方法,然后该类使用其他私有方法进行一些数据计算 我的问题是:如果我没有访问类之外的任何参数,我应该只使用私有方法中的实例变量吗?或者定义属性读取器 例如,下面是我编写的一些人为代码: class Car attr_reader :make def initialize(make, model) @make = make

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

我的问题是:如果我没有访问类之外的任何参数,我应该只使用私有方法中的实例变量吗?或者定义属性读取器

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

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
那么哪一个更好呢?我是如何处理“制造”还是如何处理“模型”

如果我知道我根本没有在这个类之外使用任何一个变量,我应该只使用实例变量吗?或者使用attr_阅读器更好,因为这样我就可以将它们转换为实际的方法,而无需更改其余的代码。。。i、 e.由于
apply_-paint
使用
make
而不是
@make
,我可以根据需要将
make
更改为本地方法,而不更改
apply_-paint
方法


我老是唠叨个不停,不知道哪一个更好。也许这只是一种偏好,但我想看看其他人对这个问题有什么想法。

使用attr_uu方法。如果不在类外访问它们,则可以(而且可能应该)将它们设置为私有。为什么要使用它们?你可以通过陈述你对如何使用它的意图来提高可读性。属性读取器应解释为“仅应读取此变量”

使用
attr\u reader
不会花费任何成本,而且正如您所观察到的,它在将来可能会非常有益。那么这是一个什么样的问题呢?它确实让我付出了代价:它是额外的代码,它公开了一个访问器(除非我将其设置为私有),这意味着每次我在代码中看到“make”,我都必须记住它是一个访问器(而不是局部变量或其他方法),而“@make”显然是一个实例变量。所以我认为这是一个很好的问题,因为两种方式都有明显的折衷。有趣的是,9小时前我们在这个网站上遇到了几乎相同的问题:@DanSharp:“我必须记住它是一个访问者”-但你呢?如果您的方法很短(它们应该很短),那么这是否是一个参数/本地(在这种情况下,它是某种方法,您不关心具体是哪种方法)。您还可以使用私有attr_u方法。这样,如果它需要在类内部是只读的,您就可以在不向外界公开变量的情况下实现。