samnang
5/23/2013 - 11:14 AM

Refactoring Ruby Edition Chapter6: Split Temporary Variable

Refactoring Ruby Edition Chapter6: Split Temporary Variable

class App
  def initialize(primary_force, secondary_force, delay, mass)
    @primary_force = primary_force
    @secondary_force = secondary_force
    @delay = delay
    @mass = mass
  end

  def distance_traveled(time)
    acc = @primary_force / @mass
    primary_time = [time, @delay].min
    result = 0.5 * acc * primary_time * primary_time
    secondary_time = time - @delay
    if secondary_time > 0
      primary_vel = acc * @delay
      acc = (@primary_force + @secondary_force) / @mass
      result += primary_vel * secondary_time + 5 * acc * secondary_time *
        secondary_time
    end

    result
  end
end
class App
  def initialize(primary_force, secondary_force, delay, mass)
    @primary_force = primary_force
    @secondary_force = secondary_force
    @delay = delay
    @mass = mass
  end

  def distance_traveled(time)
    secondary_time(time) > 0 ? secondary_distance(time) : primary_distance(time)
  end

  private

  def primary_acc
    @primary_force / @mass
  end

  def secondary_acc
    (@primary_force + @secondary_force) / @mass
  end

  def primary_vel
    primary_acc * @delay
  end

  def primary_distance(time)
    primary_time = [time, @delay].min
    0.5 * primary_acc * primary_time * primary_time
  end

  def secondary_distance(time)
    _secondary_time = secondary_time(time)
    result = primary_distance(time)
    result += primary_vel * _secondary_time + 5 * secondary_acc * _secondary_time *
      _secondary_time
  end

  def secondary_time(time)
    time - @delay
  end
end
class App
  def initialize(primary_force, secondary_force, delay, mass)
    @primary_force = primary_force
    @secondary_force = secondary_force
    @delay = delay
    @mass = mass
  end

  def distance_traveled(time)
    primary_acc = @primary_force / @mass
    primary_time = [time, @delay].min
    result = 0.5 * primary_acc * primary_time * primary_time
    secondary_time = time - @delay
    if secondary_time > 0
      primary_vel = primary_acc * @delay
      secondary_acc = (@primary_force + @secondary_force) / @mass
      result += primary_vel * secondary_time + 5 * secondary_acc * secondary_time *
        secondary_time
    end

    result
  end
end