公约防止意外调用实例变量

时间:2014-02-02 15:32:47

标签: ruby

假设我们有课

class Evaluator
  attr_reader :response

  def initialize(response)
    @response = response
  end

  def order
    @_order ||= Order.find(response.order_id)
  end
end

我想询问@_order仅用于缓存目的。此约定用于防止意外使用实例变量(例如,当它尚未初始化时)。我想强制使用order代替@order。你怎么看待这件事?你知道更好的方法来实现这个目标吗?

2 个答案:

答案 0 :(得分:0)

在Ruby中,不能使子类无法访问实例变量。默认情况下,实例变量是 protected (在通用编程术语中),这意味着它们不能从类外部访问,但可以从类层次结构中访问。

您只能使用privateprotectedpublic来控制方法的可访问性。

答案 1 :(得分:0)

你可以非常明显地表示,不应该使用该成员,例如调用它@lazy_loaded_order,或者甚至将其概括为:

def order
  @lazy_members[:order] ||= Order.find(response.order_id)
end

这样一来,显然任何试图使用@lazy_members的人都会自行承担风险......