Qu'entend-on par «taille de condition de branche d'affectation trop élevée» et comment y remédier?

112

Dans mon application Rails, j'utilise Rubocoppour rechercher des problèmes. Aujourd'hui , il m'a donné une erreur comme ceci: Assignment Branch Condition size for show is too high. Voici mon 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

Qu'est-ce que cela signifie et comment puis-je y remédier?

THpubs
la source
9
Une brève recherche révèle cela . C'est une rubocopmanière formelle de dire "votre méthode en fait trop".
D-side
Toutes les variables définies sont-elles utilisées dans le rendu?
Antarr Byrd

Réponses:

114

La taille de la condition de branche d'affectation (ABC) est une mesure de la taille d'une méthode. Elle est essentiellement déterminée par comptage du nombre de A ssignments, B ranches et C états onditionnel. (plus de détails..)

Pour réduire le score ABC, vous pouvez déplacer certaines de ces affectations vers des appels 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_
la source
1
Grand merci. Maintenant, le code a l'air très lisible mais ne rend-il pas le fichier volumineux? Plus de code? Est-ce bien?
THpubs
Moins de code si vous avez besoin de ces variables dans d'autres actions.
chad_
2
Merci. Je l'ai signalé à Wikipedia. Cela devrait être un peu plus fiable, j'espère.
chad_
J'obtiens la même chose avec cette méthode: # Dessinez la balle dans ce contexte de périphérique def draw (dc) dc.setForeground (couleur) 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) fin Je ne semble pas être en mesure de conserver la disposition du bloc de code ici !!! Qu'est-ce qui se passe ici? Il n'y a pas d'affectations, pas de succursales et pas de conditions ici du tout !!!!
flajann
Vous avez des affectations implicites où vous multipliez les nombres. Je les prendrais et les déplacerais vers des constantes afin que vous ne réévaluiez pas la même arithmétique dans ces appels. Je ne suis pas sûr que cela corrigera les commentaires de votre linter, mais cela le nettoierait certainement un peu. :)
chad_