Cosa si intende per "Dimensione della condizione del ramo di assegnazione troppo alta" e come risolverla?


112

Nella mia app Rails, utilizzo Rubocopper verificare la presenza di problemi. Oggi mi ha dato un errore come questo: Assignment Branch Condition size for show is too high. Ecco il mio codice:

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

Cosa significa e come posso risolverlo?


9
Una ricerca scopre brevemente questo . È un rubocopmodo formale per dire "il tuo metodo fa troppo".
Lato D

Tutte le variabili definite vengono utilizzate nel rendering?
Antarr Byrd

Risposte:


114

La dimensione ABC (Assignment Branch Condition) è una misura della dimensione di un metodo. È essenzialmente determinato contando il numero di A ssignments, B ranches e C onditional statements. (più dettaglio..)

Per ridurre il punteggio ABC, potresti spostare alcune di queste assegnazioni nelle chiamate 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
Grazie mille. Ora il codice sembra molto leggibile ma non sta aumentando le dimensioni del file? Più codice? È buono?
THpubs

Meno codice se hai bisogno di quelle variabili in altre azioni.
ciad_

2
Grazie. L'ho indicato a Wikipedia. Dovrebbe essere un po 'più affidabile, spero.
ciad_

Sto ottenendo lo stesso con questo metodo: # Disegna la palla in questo contesto di dispositivo 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) fine Non mi sembra di essere in grado di preservare il layout del blocco di codice qui !!! Che cosa sta succedendo qui? Non ci sono incarichi, rami e niente condizionali qui !!!!
Flajann

Hai compiti impliciti in cui stai moltiplicando i numeri. Li prenderei e li sposterei in costanti in modo da non rivalutare la stessa aritmetica in quelle chiamate. Non sono sicuro che questo risolverà il feedback del tuo linter, ma lo pulirà sicuramente un po '. :)
chad_
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.