¿Qué se entiende por 'Tamaño de condición de rama de asignación demasiado alto' y cómo solucionarlo?

112

En mi aplicación Rails, utilizo Rubocoppara comprobar si hay problemas. Hoy en día me dio un error como este: Assignment Branch Condition size for show is too high. Aquí está mi código:

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

¿Qué significa esto y cómo puedo solucionarlo?

THpubs
fuente
9
Una breve búsqueda descubre esto . Es una rubocopforma formal de decir "su método hace demasiado".
Lado D
¿Se utilizarán todas las variables definidas en la representación?
Antarr Byrd

Respuestas:

114

El tamaño de la condición de rama de asignación (ABC) es una medida del tamaño de un método. Esencialmente se determina contando el número de asignaciones A , ranchos B y declaraciones C ondicionales. (mas detalle..)

Para reducir la puntuación ABC, puede mover algunas de esas asignaciones a llamadas 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
Chad_
fuente
1
Muchas gracias. Ahora el código parece muy legible, pero ¿no agranda el archivo? ¿Más código? ¿Esta bien?
THpubs
Menos código si necesita esas variables en otras acciones.
chad_
2
Gracias. Lo apunté a Wikipedia. Eso debería ser un poco más confiable, espero.
chad_
Obtengo lo mismo con este método: # Dibuja la bola en este contexto de 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) final ¡¡¡Parece que no puedo conservar el diseño del bloque de código aquí !!! ¿Que esta pasando aqui? ¡No hay asignaciones, ni sucursales, ni condicionales aquí!
flajann
Tienes asignaciones implícitas en las que estás multiplicando los números. Los tomaría y los movería a constantes para que no vuelva a evaluar la misma aritmética en esas llamadas. No estoy seguro de si esto solucionará los comentarios de su linter, pero ciertamente lo limpiaría un poco. :)
chad_