Replace Constructors with Creation Methods

 

Motivazione al refactoring:
Sviluppare una classe con più costruttori creerà qualche disagio allo sviluppatore che dovrà decidere a quale costruttore affidarsi per istanziarla; questo comportà un certo tempo di studioe dei parametri dei costruttori e/o magari del codice stesso dei costruttori.

Più costruttori abbiamo nella nostra classe più sarà complicato capirne il comportamento.

Per di più, spesso, molti dei costruttori che creeremo non verranno mai utilizzati appunto per via della complessità nel doverne studiare il comportamento.

Soluzione:
Il Creation Method può aiutare a rendere il tutto più semplice.
Il Creation Method è un metodo statico o non statico utilizzato per creare una nuova istanza.

E' bene chiamare il metodo in maniera chiara, in modo che si capisca immediatamente cosa crea (creaConnessioneFtp(), creaConnessioneHttp() ... etc).

 

Pro e Contro

(+) Comunica meglio il tipo di istanza che creerà

(+) Supera i limiti dei costruttori. Es. non possiamo avere due costruttori con lo stesso numero di parametri

(+) E’ più facile trovare codice non usato

(-) Crea un metodo non standard di creazione di un’istanza

Come fare il refactoring:

  1. Trovare un punto dove la classe viene istanziata.
    A questo punto bisogna estrarne il codice e creare un metodo publico e statico.
    Questo sarà il nostro creation method.

    (compilare e testare)

  2. Trovare tutti i costruttori che istanziano la classe usando il costruttore di prima, cancellare l'istanza ed usare il nuovo creation method.  

    (compilare e testare)

  3. Se il costruttore scelto per il refactoring è chiamato da un'altro costruttore, modificare il costruttore inserendo il creation method

    (compilare e testare)

  4. Ripetere i punti da 1 a 3
  5. Se un costruttore non viene utilizzato fuori dalla classe, renderlo non pubblico

    (compilare e testare)

Variante:
Se durante la crazione dei creation methods vi ritrovate a lavorare con molti creation method, tipo 25, potrebbe essere noioso.
In tal caso è meglio creare un factory che ritorni l'istanza appropriata.