#10 Refactoring User Name Part 1
Dans cet épisode, nous allons parler de refactoring. Le refactoring (ou refactorisation en français dans le texte) c'est améliorer la conception du code sans modifier sa fonctionnalité. Ca peut se faire en supprimant les duplications ou en améliorant la lisibilité ou la maintenabilité.
Dans cette application, nous avons une liste d'utilisateurs. En cliquant sur un utilisateur, on peut voir son profil. Notez que certains utilisateurs ont une initiale dans leur nom alors que les autres n'en ont pas.
Les vues index
et show
dans le navigateur.
Regardons le code de la vue. D'abord, le code de la vue index
:
<h1>Users</h1> <ul> <% for user in @users %> <li> <a href="<%= user_path(user) %>"> <%= user.first_name %> <%= "#{user.middle_initial}." unless user.middle_initial.nil? %> <%= user.last_name %> </a> </li> <% end %> </ul>
Le code de la vue index
Le code ci-dessus récupère tous les utilisateurs, puis une boucle les parcourt tous. Les trois lignes avec l'élément<a>
affichent le nom de l'utilisateur. Maintenant, regardons la page du profil.
<h1>Profile</h1> <p> Name: <%= @user.first_name %> <%= "#{@user.middle_initial}." unless @user.middle_initial.nil? %> <%= @user.last_name %> </p> <%= link_to 'Users List', users_path %>
Le code de la vue de l'action show
La page de profil a les même trois lignes pour afficher le nom de l'utilisateur que la page d'index. Ceci est clairement une duplication et est un bon candidat pour du refactoring. Le code pour afficher le nom de l'utilisateur divise le nom en trois parties. Ceci est fait pour que l'initiale puisse être affichée avec un point, sauf si l'utilisateur n'a pas d'initiale.
Comment commencer le refactoring ?
Un moyen de refactoriser ce code serait de le déplacer dans un helper mais il n'y pas de HTML dans le code, uniquement le nom de l'utilisateur qui est lié au modèle User
. La place idéale pour placer ce code serait donc dans le modèle User
. Créons une méthode dans le modèle User
nommée full_name
. Nous allons commencer par déplacer le code répété des vues index
et show
, mettre les trois parties du nom dans une variable locale puis retourner la variable locale.
class User < ActiveRecord::Base def full_name name = first_name + ' ' name += "#{middle_initial}. " unless middle_initial.nil? name += last_name name end end
Le modèle User
après avoir ajouté la méthode full_name
.
Puisque nous avons déplacé le code dans le modèle User
la variable @user
ne peut pas être référencée. Mais, puisque nous appelons les méthodes dans le modèle User
, nous pouvons tout simplement enlever cette variable.
Est-ce que notre refactoring fonctionne ?
Maintenant que nous avons écrit notre méthode full_name
nous pouvons remplacer le code dans nos méthodes index
et show
. Regardons la partie concernées de la vue index
.
<a href="<%= user_path(user) %>"> <%= user.full_name %> </a>
La vue index
avec la méthode full_name
.
Il y a une autre façon d'améliorer le code ci-dessus. Puisque nous avions un code assez complexe pour générer le nom de l'utilisateur nous devions utiliser le tag standard HTML <a>
, plutôt que link_to
. Maintenant, nous pouvons utiliser link_to
et simplifier le code de la vue encore un peu plus.
<%= link_to user.full_name, user_path(user) %>
La vue index
avec link_to
.
Le code dans le modèle User
et sa vue sont maintenant optimisé par rapport à ce que nous avions au début. Nous avons supprimé la duplication et déplacer le code lié à l'utilisateur qui appartient au modèle dans le modèle User
. Il y a toujours de la place pour de l'optimisation, et nous verrons comment le code peut encore être amélioré dans le prochain épisode.
Le code après refactorisation
class User < ActiveRecord::Base def full_name name = first_name + ' ' name += "#{middle_initial}. " unless middle_initial.nil? name += last_name name end end
Le modèle User
après refactorisation.
<h1>Users</h1> <ul> <% for user in @users %> <li><%= link_to user.full_name %></li> <% end %> </ul>
La vue index
après refactorisation.
<h1>Profile</h1> <p>Name: <%= @user.full_name %></p> <%= link_to 'Users List', users_path %>
La vue show
après refactorisation.