Що означає "Розмір умови гілки призначення" завищений "і як це виправити?


112

У своєму додатку 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

Що це означає і як я можу це виправити?


9
Короткий пошук розкриває це . Це rubocopформальний спосіб сказати "ваш метод робить занадто багато".
D-side

Чи всі визначені змінні використовуються при візуалізації?
Антарр Берд

Відповіді:


114

Розмір умови відгалуження присвоєння (ABC) - це вимірювання розміру методу. Він по суті визначається підрахунком кількості A- значень, B рангів і C умовних висловлювань. (докладніше ..)

Щоб знизити показник ABC, ви можете перемістити деякі з цих завдань перед тим, як запустити дзвінки:

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_

2
Дякую. Я вказав на Вікіпедію. Я би сподівався, що це повинно бути трохи надійніше.
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

У вас присвоєні призначення, де ви перемножуєте числа. Я б взяв їх і перемістив їх до констант, щоб ви не повторно оцінювали ту саму арифметику в цих дзвінках. Я не впевнений, чи це виправить зворотний зв'язок вашої лінійки, але це, безумовно, очистить її. :)
chad_
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.