O que significa 'Tamanho da condição do ramo de atribuição muito alto' e como corrigi-lo?

112

No meu aplicativo Rails, eu uso Rubocoppara verificar se há problemas. Hoje ele me deu um erro como este: Assignment Branch Condition size for show is too high. Este é meu 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

O que isso significa e como posso corrigir isso?

THpubs
fonte
9
Uma breve pesquisa revela isso . É uma rubocopmaneira formal de dizer "seu método faz muito".
lado D de
Todas as variáveis ​​definidas são usadas na renderização?
Antarr Byrd

Respostas:

114

O tamanho da condição do ramo de atribuição (ABC) é uma medida do tamanho de um método. É essencialmente determinado pela contagem do número de A ssignments, B ranches e C declarações adicionais. (Mais detalhes..)

Para reduzir a pontuação ABC, você pode mover algumas dessas atribuições para chamadas 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
Chade_
fonte
1
Muito obrigado. Agora o código parece muito legível, mas não está tornando o arquivo grande? Mais código? Isso é bom?
THpubs de
Menos código se você precisar dessas variáveis ​​em outras ações.
chad_ de
2
Obrigado. Eu apontei para a Wikipedia. Isso deve ser um pouco mais confiável, espero.
chad_
Estou recebendo o mesmo neste método: # Desenhe a bola neste 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) end Não pareço ser capaz de preservar o layout do bloco de código aqui !!! O que está acontecendo aqui? Não há atribuições, ramificações e condicionais aqui !!!!
flajann de
Você tem atribuições implícitas onde você está multiplicando os números. Eu os pegaria e moveria para constantes para que você não reavaliasse a mesma aritmética nessas chamadas. Não tenho certeza se isso vai corrigir o feedback do seu linter, mas certamente limparia um pouco. :)
chad_