是否应该在insert类中使用Ruby类中的getter方法进行计算?

时间:2017-07-04 18:18:03

标签: ruby

我正在进行面试蛋糕问题,他们在插入新值时进行了计算。我的直觉是将这种逻辑放在getter方法中,我希望能够对最佳实践有所了解。

他们的解决方案:

# Write a class TempTracker with these methods:
#
# insert()—records a new temperature
# getMax()—returns the highest temp we've seen so far
# getMin()—returns the lowest temp we've seen so far
# getMean()—returns the mean of all temps we've seen so far
# getMode()—returns a mode of all temps we've seen so far

class TempTracker
  def initialize
    # for mode
    @occurrences = [0] * 111 # array of 0s at indices 0..110
    @max_occurrences = 0
    @mode = nil

    # for mean
    @total_numbers = 0
    @total_sum = 0.0 # mean should be float
    @mean = nil

    # for min and max
    @min_temp = nil
    @max_temp = nil
  end

  def insert(temperature)
    # for mode
    @occurrences[temperature] += 1
    if @occurrences[temperature] > @max_occurrences
      @mode = temperature
      @max_occurrences = @occurrences[temperature]
    end

    # for mean
    @total_numbers += 1
    @total_sum += temperature
    @mean = @total_sum / @total_numbers

    # for min and max
    @max_temp = temperature if @max_temp.nil? || temperature > @max_temp
    @min_temp = temperature if @min_temp.nil? || temperature < @min_temp
  end

  def get_max
    @max_temp
  end

  def get_min
    @min_temp
  end

  def get_mean
    @mean
  end

  def get_mode
    @mode
  end
end

我最初写的插入和getter方法:

// ... 

  def insert(temp)
    @max = temp if @max.nil? || @max < temp
    @min = temp if @min.nil? || @min > temp

    @total_sum += temp
    @total_numbers += 1

    @occurrences[temp] += 1
  end

// ...

  def get_mean
    @total_sum / @total_numbers
  end

  def get_mode
    @occurrences.each_with_index.max[1]
  end
end

任何帮助理解是否/为什么在insert方法中使用计算逻辑会非常有用!

1 个答案:

答案 0 :(得分:2)

插入是一种状态改变操作。在现场反映所有变化是有意义的。另一方面,获取不会改变状态,它只是读取它。

想象一下,你做了一次插入和一百次读取。对每次获取重复计算效率不高,因为自上次以来结果可能不会发生变化。浪费资源,但可以使代码更清晰。

我刚刚注意到我承担了阅读繁重的工作量。在写作繁重的工作量中,你写的比你读的更多,反之亦然。效率决定了你在吸气器中进行计算。没有人真正的回答,它总是一种权衡,是我想说的。