¿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?


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

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_
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.