#10 Refactoring User Name Part 1
In questo episodio discuteremo di refactoring. Il refactoring è il miglioramento del progetto del codice senza cambiare le sue funzionalità. Può essere fatto per rimuovere duplicazioni di codice o per migliorare la leggibilità o la manutenibilità.
In questa applicazione abbiamo una lista di utenti. Cliccando su un utente, viene mostrato il suo profilo. Si noti che alcuni utenti hanno una iniziale di doppio nome, mentre altri no.
Le viste index e show per il modello User.
Diamo un’occhiata al codice della vista. Per prima cosa, il codice della vista 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>
Il codice della vista index
Il codice precedente prende tutti gli utenti, poi itera su di loro. Le tre linee all’interno dell’elemento <a> mostra il nome dell’utente. Ora vediamo la pagina del profilo.
<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 %>
Il codice della vista per l’action show
La pagina di profilo ha le stesse tre linee di codice per mostrare il nome di un utente come la pagina index. Si tratta evidentemente di una duplicazione e quindi di un buon candidato per il refactoring. Il codice per mostrare il nome dell’utente divide il nome in tre parti. Ciò è fatto poichè in questo modo l’iniziale del secondo nome può essere mostrata con un ritorno a capo subito dopo, a meno che l’utente non sia privo di iniziale del secondo nome.
Da dove si parte per il refactoring?
Uno dei modi per rivedere il codice sarebbe quello di spostare il codice in un metodo helper, ma non c’è HTML nel codice, solamente il nome dell’utente che è associato ad un’istanza del modello User
. Il posto migliore dove spostare questo codice duplicato dovrebbe perciò essere la classe di modello dell’utente. Creiamo un metodo nel modello utente chiamato full_name
. Cominceremo a spostare il codice duplicato dalle viste index e show, metteremo le tre parti del nome in una variabile locale, e infine restituiremo tale variabile.
class User < ActiveRecord::Base def full_name name = first_name + ' ' name += "#{middle_initial}. " unless middle_initial.nil? name += last_name name end end
Il modello User dopo l’aggiunta del metodo full_name
.
Siccome abbiamo spostato il codice nel modello user
, la variabile @user
non può essere referenziata. Ma dal momento che stiamo chiamando metodi nel modello User
, possiamo semplicemente rimuovere tale riferimento.
Funziona?
Ora che abbiamo scritto il nostro metodo full_name
, possiamo sostituire il codice nei nostri metodi index
e show
. Diamo un’occhiata alla parte significativa della vista index
.
<a href="<%= user_path(user) %>"> <%= user.full_name %> </a>
La vista index con il richiamo al metodo full_name
.
C’è un altro modo in cui possiamo migliorare il codice sopra. Poichè avevamo del codice così, complesso per generare il nome dell’utente, abbiamo dovuto ricorrere all’utilizzo del tag standard HTML <a>, anzichè il link_to
. Ora possiamo invece usare il link_to
e semplificare ulteriormente il codice della vista.
<%= link_to user.full_name, user_path(user) %>
La vista index con il link_to
.
Il codice nella classe di modello User
e nelle sue viste è ora molto migliorato rispetto alla versione da cui eravamo partiti. Abbiamo rimosso le duplicazioni e spostato il codice legato al modello utente nella classe di modello User
. C’è ancora spazio per migliorie, e vedremo in che modo nel prossimo episodio.
Il codice dopo il refactoring
class User < ActiveRecord::Base def full_name name = first_name + ' ' name += "#{middle_initial}. " unless middle_initial.nil? name += last_name name end end
La classe di modello User
dopo il refactoring.
<h1>Users</h1> <ul> <% for user in @users %> <li><%= link_to user.full_name %></li> <% end %> </ul>
La vista index
dopo il refactoring.
<h1>Profile</h1> <p>Name: <%= @user.full_name %></p> <%= link_to 'Users List', users_path %>
La vista show
dopo il refactoring.