Refactoring: tecniche applicate alle variabili

di: Gabriele Farina     11 Ottobre 2007

Nel precedente articolo ho iniziato a parlare di alcune tecniche di refactoring utilizzate più di frequente. Purtroppo il codice che possiamo trovarci di fronte non è sempre chiaro e ben organizzato, e quindi non è sempre facile capire la situazione nella quale ci si trova e quale tecnica di refactoring sarebbe necessario applicare. Per cercare di organizzare meglio il codice le operazioni di supporto più comuni sono quelle che normalmente vengono applicate alle variabili e permettono di semplificare le espressioni o rimuovere le variabili temporanee inutili. Spesso queste regole vengono utilizzate in relazione con le tecniche viste nell'articolo precedente al fine di facilitarne l'utilizzo.

In questo articolo analizzeremo alcune delle tecniche che normalmente si applicano alle variabili, partendo da quelle utilizzate più comunemente.

Inline Temp e Replace Temp with Query

Iniziamo parlando di due tecniche usate comunemente insieme. Inline Temp viene utilizzata quando si ha una variabile temporanea a cui il valore è assegnato un'unica volta. Se l'espressione assegnata è semplice e la variabile ha in qualche modo a che vedere con un'operazione di refactoring, allora possiamo sostituire l'occorrenza di questa variabile con l'espressione assegnata. Replace Temp with Query invece viene utilizzata quando usiamo una variabile temporanea per contenere il risultato di un'espressione o blocco di codice. Parliamo di queste regole in parallelo perché solitamente Inline Temp viene utilizzata dopo che Replace Temp with Query è stata applicata.

Vediamo un esempio in cui entrambe le regole sono applicate, da cui partire con l'analisi di queste tecniche.

class CartProduct
{
     // ... 

      public function calculateTotalPrice()
      {
            $base_price = $this->quantity * $this->item_price; 

            if( $base_price > 10000 )
            {
                  return $base_price * 0.90;
            } else
            {
                  return $base_price * 1;
            }
      }
}

Partendo da questo codice notiamo che il valore della variabile $base_price viene assegnato una sola volta ed oltretutto è utilizzato per contenere il risultato del nostro metodo calculateTotalPrice. in questo caso è importante notare che la variabile temporanea può creare alcuni problemi: in primis non ci permette di riutilizzare il codice utilizzato per calcolarla da un'altra parte, ma obbliga il copia-incolla dei sorgenti con il risultato che ogni modifica sul come calcolare il prezzo base vada fatta in ogni porzione di codice interessata; ed oltretutto si rischia che venga incoraggiata la scrittura di metodi molto lunghi dato che l'unico modo per accedere allo stesso valore originale è quello di ripetere la porzione di codice utilizzata per il calcolo.

Applichiamo quindi Replace Temp with Query:

class CartProduct
{
     // ... 

      public function calculateTotalPrice()
      {
            $base_price = $this->calculateBasePrice(); 

            if( $base_price > 10000 )
            {
                  return $base_price * 0.90;
            } else
            {
                  return $base_price * 1;
            }
      } 

      public function calculateBasePrice()
      {
            return  $this->quantity * $this->item_price;
      }
}

Abbiamo estratto l'espressione assegnata alla variabile temporanea in un metodo (calculateBasePrice) ed abbiamo semplicemente sostituito l'espressione con una chiamata al metodo originale. Successivamente rimuoviamo tutti i riferimenti alla variabile temporanea applicando Inline Temp:

class CartProduct
{
     // ... 

      public function calculateTotalPrice()
      {
            if(  $this->calculateBasePrice() > 10000 )
            {
                  return  $this->calculateBasePrice() * 0.90;
            } else
            {
                  return  $this->calculateBasePrice() * 1;
            }
      } 

      public function calculateBasePrice()
      {
            return  $this->quantity * $this->item_price;
      }
}

Ora siamo ad un ottimo punto per applicare, se fosse necessario, altre tecniche di refactoring, come ad esempio Extract Method. Le variabili temporanee possono creare problemi se vogliamo estrarre due porzioni di codice che hanno a che vedere con una variabile temporanea comune in due metodi differenti, mentre dopo aver applicato questa tecnica di refactoring il problema non sussite più perché la variabile temporanea è stata rimossa.

Guide PHP

Guida Zend Framework

Diventate professionisti dello sviluppo Web. Zend Framework è lo...

Guida Applicazioni Facebook con PHP

Come realizzare un'applicazione per Facebook. Dalle basi della...

Guida PHP con Windows e IIS

Installare ambienti per lo sviluppo e la produzione di applicazioni...

Altre guide

Newsletter @PHP

Ogni lunedì, direttamente nella tua e-mail: script, articoli, guide e tutorial su PHP, MySQL e Apache.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Corso Google AdWords Base

27 Febbraio 2012 a Milano
Disponibilità: 7 Posti

Corso Google AdWords Base

28 Marzo 2012 a Roma
Disponibilità: 7 Posti