Co oznacza określenie „Zbyt wysoki rozmiar gałęzi przypisania” i jak to naprawić?

113

W mojej aplikacji Rails używam Rubocopdo sprawdzania problemów. Dziś dał mi błąd jak poniżej: Assignment Branch Condition size for show is too high. Oto mój kod:

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

Co to oznacza i jak mogę to naprawić?

THpubs
źródło
9
Krótkie wyszukiwanie ujawnia to . To rubocopformalny sposób powiedzenia „Twoja metoda robi za dużo”.
D
Czy w renderowaniu są używane wszystkie zdefiniowane zmienne?
Antarr Byrd

Odpowiedzi:

115

Rozmiar warunku gałęzi przypisania (ABC) jest miarą rozmiaru metody. Zasadniczo jest określona przez policzenie liczby A ssignments, B rancza i C warunkowy instrukcji. (więcej szczegółów..)

Aby zmniejszyć wynik ABC, możesz przenieść niektóre z tych zadań do wywołań przed zadziałaniem:

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
chad_
źródło
1
Wielkie dzięki. Teraz kod wygląda na bardzo czytelny, ale czy nie powoduje to, że plik jest duży? Więcej kodu? Czy to jest dobre?
THpubs
Mniej kodu, jeśli potrzebujesz tych zmiennych w innych akcjach.
chad_
2
Dzięki. Wskazałem na Wikipedię. Mam nadzieję, że to powinno być trochę bardziej wiarygodne.
chad_
Otrzymuję to samo na tej metodzie: # Narysuj piłkę w kontekście tego urządzenia 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) koniec Wydaje się, że nie jestem w stanie zachować tutaj układu bloku kodu !!! Co tu się dzieje? Nie ma tu żadnych przydziałów, oddziałów ani warunków warunkowych !!!!
flajann
Masz niejawne przypisania, w których mnożysz liczby. Wziąłbym je i przeniósł do stałych, abyś nie oceniał ponownie tej samej arytmetyki w tych wywołaniach. Nie jestem pewien, czy to naprawi opinie twojego lintera, ale z pewnością trochę by to wyczyściło. :)
chad_