0

假设我有一门课,它定义了我的日子的集合以及它们的古怪程度。在初始化函数中初始化我的@scores 变量是否更好,如下所示:

class WackyDayScorer
  attr_reader :scores
  def initialize(start = Time.now, max = 90.days)
    @start  = start
    @limit  = start - max
    @scores = get_scores
  end

private
  def get_scores
    result = []
    t = @start.clone
    until t < max
      result << score_wackiness(t)
      t -= 1.day
    end
    result
  end
end

或在 get_scores 方法中初始化它,如下所示:

class WackyDayScorer
  attr_reader :scores

  def initialize(start = Time.now, max = 90.days)
    @start = start
    @limit = start - max
    get_scores
  end

private
  def get_scores
    @scores = []
    t = @start.clone
    until t < max
      @scores << score_wackiness(t)
      t -= 1.day
    end
  end
end
4

3 回答 3

0

我建议明确定义分数的吸气剂,记住计算并跳过所有仪式:

class WackyDayScorer
  def initialize(start = Time.now, max = 90.days)
    @start  = start
    @limit  = start - max
  end

  def scores
    @scores ||= begin
      result = []
      t = @start.clone
      until t < max
        result << score_wackiness(t)
        t -= 1.day
      end
      result
    end
  end
end

这基本上就是你正在做的事情,但它更直接。

于 2013-05-04T00:28:38.597 回答
0

第一个是完全错误的。你是说

@scores = get_scores

但是get_scores没有返回有用的值,所以这很疯狂。相反,直接和内部get_scores设置@scores为副作用。

第二个至少是连贯的。

不过,就我个人而言,我不会做任何做的事情。我会说你第一次说的话:

@scores = get_scores

但我的实现get_scores不会触及任何 ivar。它将返回一个实际值:

  def get_scores
    scores = []
    # do stuff to scores
    return scores # or simply, scores
  end
于 2013-05-03T23:49:53.220 回答
0

如果要在初始化中处理某些事情,请创建一个私有方法来处理计算,然后在#initialize 中设置实例变量。我不会在方法中设置它,以防您想在类的其他地方重用该计算而不清除您的实例变量。

class WackyDayScorer
  attr_accessor :scores

  def initialize(start = DateTime.now, max = 90.days)
    @start = start
    @limit = start - max
    @scores = calculate_scores
  end

private

  def calculate_scores
    (@limit..@start).to_a.map { |date_time| score_wackiness(date_time) }
  end
end

在#calculate_scores 中,我们在限制日期和开始之间创建一个范围(如您所做的那样倒数)并将每个结果发送到#score_wackiness 方法。

于 2013-05-03T23:53:38.667 回答