homeASCIIcasts

10: Refactorisation: Première 

(view original Railscast)

Other translations: En It Es

Other formats:

Written by Adrien Giboire (adriengiboire.com)

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.

The index and show views for the User model.

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.