
Exemple : corriger des offenses simples remontées par RuboCop
Voyez RuboCop en action avec un exemple concret. Apprenez à interpréter le rapport de RuboCop et à corriger des offenses de style courantes. Cette compétence pratique vous permettra de rendre votre code Ruby plus propre.
Le code de départ : un exemple fonctionnel mais imparfait
La meilleure façon de comprendre l'utilité de RuboCop est de le voir en action. Prenons un morceau de code Ruby qui fonctionne parfaitement, mais qui ne respecte pas plusieurs conventions de style. C'est une situation très courante, surtout quand on débute.
Imaginez que nous ayons le fichier `greeter.rb` suivant. Son objectif est de créer un message de salutation et d'afficher un avertissement si le nom est trop long.
# greeter.rb
class Greeter
def say_hello( name )
message = "Hello " + name
if message.length > 20 then puts "C'est un nom plutôt long !" end
return message
end
endA première vue, ce code semble correct. Il ne génère aucune erreur et fait ce qu'on lui demande. Cependant, un développeur Ruby expérimenté y verrait plusieurs points d'amélioration stylistique. Voyons ce qu'en pense notre expert automatisé, RuboCop.
Lancer l'analyse et déchiffrer le rapport de RuboCop
Plaçons-nous dans notre terminal à la racine du projet et lançons la commande que nous avons apprise précédemment :
bundle exec rubocop greeter.rbRuboCop analyse le fichier et nous retourne un rapport détaillé. Ne soyez pas intimidé par la sortie ; chaque ligne est une instruction claire pour nous guider.
Inspecting 1 file
C
Offenses:
greeter.rb:2:17: C: Layout/SpaceInsideParens: Do not use space inside parentheses.
def say_hello( name )
^^^^^^^
greeter.rb:3:15: C: Style/StringConcatenation: Prefer string interpolation to string concatenation.
message = "Hello " + name
^^^^^^^^^^^^^^
greeter.rb:5:31: C: Style/Then: Do not use `then` for multi-line `if`.
if message.length > 20 then puts "C'est un nom plutôt long !" end
^^^^
greeter.rb:7:5: C: Style/RedundantReturn: Redundant `return` detected.
return message
^^^^^^^
1 file inspected, 4 offenses detectedCe rapport est notre feuille de route. Il a identifié 4 "offenses" (infractions aux règles de style) et nous indique précisément où elles se trouvent et comment les corriger.
La correction guidée : une offense après l'autre
Corrigeons maintenant chaque offense en suivant les recommandations de RuboCop. C'est un excellent exercice pour intégrer les bonnes pratiques.
1. `Layout/SpaceInsideParens` à la ligne 2 :
RuboCop nous dit de ne pas mettre d'espaces à l'intérieur des parenthèses d'une définition de méthode. C'est une règle de pure lisibilité. La correction est simple :
Avant : def say_hello( name )
Après : def say_hello(name)
2. `Style/StringConcatenation` à la ligne 3 :
L'opérateur `+` pour assembler des chaînes de caractères est fonctionnel, mais en Ruby, la manière idiomatique et souvent plus performante est d'utiliser l'interpolation avec `"#{...}"`. Cela rend aussi le code plus lisible quand plusieurs variables sont impliquées.
Avant : message = "Hello " + name
Après : message = "Hello #{name}"
3. `Style/Then` à la ligne 5 :
Le mot-clé `then` est généralement considéré comme superflu en Ruby moderne pour des conditions `if`. Il alourdit la ligne sans apporter de clarté.
Avant : if message.length > 20 then puts ... end
Après : if message.length > 20; puts ... end (notez que RuboCop pourrait même suggérer une autre forme, comme le modificateur `if`).
4. `Style/RedundantReturn` à la ligne 7 :
C'est une caractéristique clé de Ruby que nous avons déjà vue : la dernière expression évaluée dans une méthode est automatiquement sa valeur de retour. Le mot-clé `return` est donc inutile ici.
Avant : return message
Après : message
Le résultat final : un code propre, lisible et idiomatique
Après avoir appliqué toutes les corrections, notre fichier `greeter.rb` ressemble maintenant à ceci :
# greeter.rb
class Greeter
def say_hello(name)
message = "Hello #{name}"
puts "C'est un nom plutôt long !" if message.length > 20
message
end
endNotez que nous avons même amélioré la condition `if` en utilisant un modificateur en fin de ligne, une forme très courante et appréciée en Ruby pour sa concision. Le comportement du code est strictement identique à l'original, mais sa qualité s'est nettement améliorée. Il est plus court, plus clair et suit les conventions que n'importe quel autre développeur Ruby s'attendrait à voir.
Cet exercice démontre parfaitement le rôle de RuboCop : il n'est pas seulement un contrôleur, mais un véritable mentor qui vous enseigne activement à écrire un meilleur code.