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

最初のものは単に間違っています。あなたが言っています

@scores = get_scores

しかしget_scores、有用な値を返さないので、これはおかしな話です。代わりに、副作用として直接および内部的にget_scores設定します。@scores

2 つ目は、少なくとも一貫性があります。

個人的には、私はあなたがすることのどちらもしません。私はあなたが最初に言うことを言うでしょう:

@scores = get_scores

しかし、私の実装はget_scoresivar には触れません。実際の値を返します。

  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 に答える
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 に答える