Что означает «слишком большой размер условия перехода при назначении» и как его исправить?

113

В моем приложении Rails я использую Rubocopдля поиска проблем. Сегодня он дал мне ошибку вроде этого: Assignment Branch Condition size for show is too high. Вот мой код:

def show
  @category = Category.friendly.find(params[:id])
  @categories = Category.all
  @search = @category.products.approved.order(updated_at: :desc).ransack(params[:q])
  @products = @search.result.page(params[:page]).per(50)
  rate
end

Что это значит и как это исправить?

THpubs
источник
9
Краткий поиск раскрывает это . Это rubocopформальный способ сказать «ваш метод слишком много делает».
Сторона D
Все ли определенные переменные используются при рендеринге?
Antarr Byrd

Ответы:

115

Размер условия перехода по назначению (ABC) - это мера размера метода. По сути, это определяется путем подсчета количества заключений A , B ранчо и C дополнительных заявлений. (более детально..)

Чтобы уменьшить оценку ABC, вы можете переместить некоторые из этих назначений в вызовы before_action:

before_action :fetch_current_category, only: [:show,:edit,:update] 
before_action :fetch_categories, only: [:show,:edit,:update] 
before_action :fetch_search_results, only: [:show,:edit,:update] #or whatever

def show
  rate
end

private

def fetch_current_category
  @category = Category.friendly.find(params[:id])
end

def fetch_categories
  @categories = Category.all
end

def fetch_search_results
  @search = category.products.approved.order(updated_at: :desc).ransack(params[:q])
  @products = @search.result.page(params[:page]).per(50)
end
Чад_
источник
1
Большое спасибо. Теперь код выглядит легко читаемым, но разве это не увеличивает размер файла? Еще код? Это хорошо?
THpubs
Меньше кода, если вам нужны эти переменные в других действиях.
chad_
Я получаю то же самое по этому методу: # Нарисуйте мяч в контексте этого устройства def draw (dc) dc.setForeground (color) dc.fillArc (x, y, w, h, 0, 64 * 90) dc.fillArc ( x, y, w, h, 64 * 90, 64 * 180) dc.fillArc (x, y, w, h, 64 * 180, 64 * 270) dc.fillArc (x, y, w, h, 64 * 270, 64 * 360) конец Кажется, я не могу сохранить здесь макет блока кода !!! Что здесь происходит? Здесь нет ни присваиваний, ни ветвей, ни условных выражений !!!!
flajann 01
У вас есть неявные присваивания, когда вы умножаете числа. Я бы взял их и переместил в константы, чтобы вы не переоценивали ту же арифметику в этих вызовах. Я не уверен, что это исправит обратную связь вашего линтера, но определенно немного очистит его. :)
chad_
Вы можете назначить их все одной строкой, например:RQ,RH,RT,RW=[90,180,270,360].map { |i| i * 64 }
chad_