2011-10-14 10 views
5

Ho un costruttore piuttosto lungo che sta eseguendo vari lavori di inizializzazione e, in quanto tale, ho voluto suddividere parte di questo lavoro in alcune funzioni. Questo mi ha portato a chiedermi se dovrei rendere le suddette funzioni istanza o metodi statici. Capisco il rischio di chiamare una funzione virtuale da un costruttore, ma penso anche che non ci sia qualcosa di giusto nel chiamare un metodo di istanza su un oggetto che non è al 100% istanziato. Sicuramente questa è una contraddizione in termini.Chiamare il metodo di istanza da un costruttore in C#

Sarei interessato all'opinione della gente su questo argomento. Ho anche scoperto che utilizzando un metodo statico per restituire una variabile inizializzata, potrei rendere il membro target di sola lettura. Ecco un'illustrazione semplificata del mio scenario.

public class A 
{ 
    private readonly string _foo; 

    public A() 
    { 
     _foo = InitialiseFoo(); 
    } 

    private static InitialiseFoo() 
    { 
     // Do stuff 
     return new string ("foo"); 
    } 
} 
+1

Perché hai un lungo costruttore? Non è così che dovrebbero essere i costruttori. Dovresti usare metodi per eseguire lunghe operazioni. È sempre molto frustrante provare a utilizzare alcune API e questa API esegue l'accesso al database e le cose nel suo costruttore e potenzialmente genera eccezioni e altro. Fallo È veramente noioso. I costruttori dovrebbero essere semplici. –

+0

Sono assolutamente d'accordo con te su questo, ma sto codificando un servizio Windows che deve prima ottenere il suo nome di servizio da un file di configurazione. Puoi solo impostare il nome di un servizio all'interno del suo costruttore, quindi sono un po 'bloccato con questo. – user738134

risposta

4

Questo è abbastanza normale per chiamare metodo di istanza in un costruttore, inoltre metodo che fare di inizializzazione. Quindi, in pratica si tratta di una sorta di Extract Method refactorig per ridurre un corpo metodo di costruzione, quindi si estrae parte di inizializzazione in un metodo separato e costruttore è a conoscenza sul risparmio degli argomenti di input, ecc ...

Per quanto riguarda il modificatore static .. a volte (credo che quando non ci sono altri modi per refactor perché questo non sembra buono - dal mio punto di vista) è necessario chiamare un metodo per passare i risultati in un costruttore di base, quindi in questo caso è necessario contrassegnarlo come statico per chiamare in un contesto statico in altri casi lasciare senza il modificatore static

public A() 
: base(GetLogger()) 
{ 
} 

private static ILog GetLogger() ... 
+0

+1 per menzionare il metodo di estrazione, ovvero tutto questo è –

1

posso capire il desiderio di utilizzare solo membri statici in un costruttore, beca usarlo rende il codice più semplice da usare senza dover tenere traccia di ciò che è stato inizializzato e cosa no, ma probabilmente stai rendendo inutilmente complicate le cose per te stesso. Chiamare un metodo di istanza in C# va bene finché hai una buona ragione per farlo. Ad esempio, se si dispone di un numero di costruttori che eseguono tutte le attività comuni, la creazione di una singola funzione membro per eseguire il lavoro è più semplice da gestire rispetto al copia e incolla del codice per ogni costruttore. Puoi anche immaginare un caso in cui il metodo può essere riutilizzato al di fuori del costruttore per qualcosa come il reset della classe allo stato inizializzato.

Il metodo statico, è valido, ma funzionerà solo nel caso in cui si stia lavorando in modo isolato e si inserisca il risultato in una variabile membro. Fornisce una sensazione di programmazione molto pulita e funzionale. Se uno qualsiasi dei lavori coinvolge uno stato di classe, comunque, diventerà brutto.

+0

'se si dispone di un numero di costruttori che eseguono tutti alcuni compiti comuni'- di solito è più ordinario concatenarli con chiamate a' MyCTor: this (arg1, arg2) 'da il costruttore. – nicodemus13

Problemi correlati