skyksandr
@skyksandr
Full Stack Ruby on Rails Developer

Можно ли попросить Вас о критике кода (code review)?

Доброго времени суток.
Я разрабатываю приложение на RoR, и делаю это в одиночку. Ментора так и не нашел.
Хотел бы попросить вас помочь в части критики кода, т.к. спросить не у кого.

Чтобы лучше понять что вообще код делает можно посмотреть вот эту страницу:
https://skyderby.ru/ru/tracks/2795/replay

В общем - есть GPS трек полета, нужно на его оценить по параметрам лучшая дальность за 1000 метров высоты, лучшая скорость за 1000 метров высоты, лучшее время за 1000 метров высоты. При этом, если полета в треке меньше чем 1000 метров или это полет со скал (base jumping) то нужно рассчитать результаты за весь диапазон.

Для этих целей я разработал сервис объект:
class TrackResultsService
  attr_reader :track

  STEP_SIZE = 50
  SKYDIVE_RANGE = 1000

  def initialize(trk)
    @track = trk
  end

  def execute
    track.destroy_results  
    
    results = ranges_to_score.map do |range|
      { range: range,
        track_segment: JumpRangeFinder.new(track_points)
                                      .execute(from_altitude: range[:start_altitude],
                                               to_altitude:   range[:end_altitude])
      }
    end

    [:speed, :distance, :time].each do |task|
      best_task_result = results.max_by { |x| x[:track_segment][task] }
      track.track_result << TrackResult.new(discipline: task,
                                            range_from: range[:start_altitude],
                                            range_to: range[:end_altitude],
                                            result: best_task_result)
    end
  end

  def track_points
    @track_points ||=
      track.points.trimmed.pluck_to_hash(
        'to_timestamp(gps_time_in_seconds) AT TIME ZONE \'UTC\' as gps_time',
        "#{@track.point_altitude_field} AS altitude",
        :latitude,
        :longitude)
  end

  def ranges_to_score
    altitude_bounds = track.altitude_bounds
    
    # round to STEP_SIZE. Max to lower, min to upper value
    max_altitude = altitude_bounds[:max_altitude] - altitude_bounds[:max_altitude] % STEP_SIZE
    min_altitude = altitude_bounds[:min_altitude] + STEP_SIZE - altitude_bounds[:min_altitude] % STEP_SIZE
    elevation = max_altitude - min_altitude

    return [{
      start_altitude: altitude_bounds[:max_altitude],
      end_altitude: altitude_bounds[:min_altitude]
    }] if track.base? || elevation <= SKYDIVE_RANGE

    ranges = []
    steps = ((elevation - SKYDIVE_RANGE) / STEP_SIZE).floor
    steps.times do |step|
      altitude_change = STEP_SIZE * step
      ranges << { 
        start_altitude: altitude_bounds[:max_altitude] - altitude_change,
        end_altitude:   altitude_bounds[:max_altitude] - SKYDIVE_RANGE - altitude_change
      }
    end

    ranges
  end
end


Дайте, пожалуйста, какой-либо фидбек.
  • Вопрос задан
  • 464 просмотра
Решения вопроса 1
c3gdlk
@c3gdlk
Ментор в http://rubyboost.ru/
Привет, в принципе код неплох, можно лишь дать несколько общих советов

Короткие имена переменных - плохая привычка, даже если они сразу используются
Четко раздели публичные и приватные методы
В методе execute, results - не самое удачное имя переменной, потому что это только промежуточные результаты, сам результат строится в последнем цикле
Независимо от того, сам пишешь код, или в команде, всегда нужно стараться писать код так, как буд-то он пишется в команде. Например для функции track_points не помещает комментарием пример результирующего хеша, который она вернет. С ключами и значениями. Тот, кто будет читать этот код, сэкономит кучу времени

метод ranges_to_score хоть и слишком длинный по рубишным канонам, выглядит довольно целостным, единственное замечание - if track.base? || elevation <= SKYDIVE_RANGE в постусловии - злоупотребление сахаром. Этот if там почти не видно.
К этому методу также комментарием описал бы формат возвращаемого массива

Можешь еще глянуть мой цикл статей об ошибках новичков в rails - c3gdlk.ru/blog/rails/ruby-on-rails-samye-rasprostr...
я его писал на основе комментариев, которые оставляю к коду моих падаванов.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы