Was ist mit "Zuordnungszweigbedingung Größe zu hoch" gemeint und wie kann dies behoben werden?


112

In meiner Rails-App Rubocopüberprüfe ich auf Probleme. Heute gab es mir einen Fehler wie folgt : Assignment Branch Condition size for show is too high. Hier ist mein Code:

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

Was bedeutet das und wie kann ich das beheben?


9
Eine kurze Suche deckt dies auf . Es ist eine rubocopformelle Art zu sagen "Ihre Methode macht zu viel".
D-Seite

Werden beim Rendern alle definierten Variablen verwendet?
Antarr Byrd

Antworten:


114

Die ABC-Größe (Assignment Branch Condition) ist ein Maß für die Größe einer Methode. Sie wird im Wesentlichen durch Zählen der Anzahl der A- Zeichen, B- Ranches und C- Zusatzaussagen bestimmt. (Mehr Details..)

Um die ABC-Punktzahl zu verringern, können Sie einige dieser Zuweisungen in before_action-Aufrufe verschieben:

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
Vielen Dank. Jetzt sieht der Code gut lesbar aus, aber macht er die Datei nicht groß? Mehr Code? Ist es gut?
THpubs

Weniger Code, wenn Sie diese Variablen für andere Aktionen benötigen.
chad_

2
Vielen Dank. Ich habe es auf Wikipedia gezeigt. Das sollte ein bisschen zuverlässiger sein, würde ich hoffen.
chad_

Bei dieser Methode erhalte ich dasselbe: # Zeichne den Ball in diesen Gerätekontext. 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) Ende Ich scheine hier nicht in der Lage zu sein, das Codeblock-Layout beizubehalten !!! Was geht hier vor sich? Hier gibt es überhaupt keine Aufgaben, keine Zweige und keine Bedingungen !!!!
Flajann

Sie haben implizite Zuweisungen, bei denen Sie die Zahlen multiplizieren. Ich würde sie nehmen und in Konstanten verschieben, damit Sie bei diesen Aufrufen nicht dieselbe Arithmetik neu bewerten. Ich bin mir nicht sicher, ob dies das Feedback Ihres Linter korrigieren wird, aber es würde es sicherlich ein wenig aufräumen. :)
chad_
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.