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.

 

 

 

posted @ lunedì 26 maggio 2008 21.48

Print

Comments on this entry:

# re: Replace Constructors with Creation Methods

Left by marco at 27/05/2008 9.48
Gravatar
sinceramente non trovo tutta sti gran vantaggi nei metodi statici rispetto ai costruttori, ad esempio supera certi limiti nei costruttori ma ne aggiunge altri tuttaltro che trascurabili come il fatto che non ne è possibile farne l'override in una sottoclasse.

il fatto che è più facile trovare il codice non usato o studiarne i parametri sinceramente per me nn ha alcun fondamento, a mio parere i due modi sono equivalenti a queato scopo.

ti dò ragione sul fatto che si può dare nomi significativi ai costruttori, ad esempio GetEmptyIstance(), e che in molte occasioni è notevolmente più utile usare un costruttore statico, ma bisogna fare attenzione a non abusarne

# re: Replace Constructors with Creation Methods

Left by Luca Minudel at 27/05/2008 15.57
Gravatar
> il fatto che è più facile trovare il codice non usato ... per me nn ha alcun fondamento

questo punto non mi è chiaro, Salvatore potresti fare un esempio ?


> sinceramente non trovo tutta sti gran vantaggi nei metodi statici rispetto ai costruttori

mi piace l'approccio di Salvatore che indica vantaggi e svantaggi. è compito del developer pesare vantaggi e svantaggi in ogni singolo caso concreto che affronta e fare la scelta più conveniente

# re: Replace Constructors with Creation Methods

Left by Salvatore Di Fazio at 27/05/2008 23.10
Gravatar
Sto dormendo in piedi... cmq faccio un esempio :D

Facciamo finta d'aver 3 costruttori:

public Class1(string a) { }

public Class1(string a, string b) { }

public Class1(int a, string b) { }

Ed adesso dovete cercare per il codice quale di questo non è istanziato.

Se avete gli strumenti adatti (VS2008) allora trovare i costruttori non usati è alquanto semplice.
1 click x ogni costruttore e fate "Find All Reference"... se avessimo 25 costruttori avremmo 25 click :D

Se non abbiamo VS2008 dobbiamo andare di Find... come cerchiamo quei 3 costruttori per tutto il codice, magari in un grosso progetto?

In più un creation method è autoesplicativo un costruttore no...

Io personalmente preferisco avere un metodo statico Init e il costruttore privato.

# re: Replace Constructors with Creation Methods

Left by marco at 28/05/2008 9.52
Gravatar
ah ho finalmente capito perchè era + facile trovarli :)

cmq a sto punto conviene ancora di + usare il buon vecchio metodo commenta il costruttore, cerca di compilare e guarda gli errori dove stanno (in tal caso metodo statico/costruttore sono cmq equivalenti)

# re: Replace Constructors with Creation Methods

Left by Salvatore Di Fazio at 28/05/2008 10.16
Gravatar
Ancora a commentare???
Ma basta sti commenti :D

Your comment:



 (will not be displayed)


 
 
 
Please add 3 and 5 and type the answer here:
 

Live Comment Preview: