Qual è la migliore pratica per inizializzare le variabili: all'esterno o all'interno del costruttore?

2

Cerco di utilizzare i migliori standard / pratiche di codifica, tuttavia in tutti i miei googling e classi non ho mai imparato quale sia la forma corretta per dichiarare / definire variabili come gli esempi di seguito. Ho visto numerose persone diverse (insegnanti, compagni di classe, colleghi) definire le variabili all'interno e all'esterno del costruttore apparentemente a caso. Qualsiasi informazione su questo sarebbe fantastico!

class Foo
{
    private static int firstNumber = 1;
    private int secondNumber = 25;
    private FooBar fooBar = new FooBar();

    public Foo()
    {
    }
}

o

class Foo
{
    private static int firstNumber;
    private int secondNumber;
    private FooBar fooBar;

    public Foo()
    {
        firstNumber = 1;
        secondNumber = 25;
        fooBar = new FooBar();
    }
}
    
posta Paul Gildehaus 26.09.2018 - 15:43
fonte

3 risposte

7

Dato che hai dichiarato alcune delle variabili "statiche", usa la prima opzione.

Le variabili statiche non sono legate a un'istanza di una classe, sono condivise tra tutte loro. Esistono anche prima di aver creato un'istanza.

Il secondo li inizializza nel costruttore, il che significa che i loro valori non sono impostati sui valori desiderati finché non si chiama il costruttore. Ogni volta che chiami il costruttore, li inizializza di nuovo.

La prima opzione è più semplice e si comporta come previsto.

    
risposta data 26.09.2018 - 16:01
fonte
2

Come hai osservato, persone diverse lo fanno in modi diversi. Questo perché non esiste una "migliore pratica" per questo; è davvero solo una questione di stile.

Suppongo che il tuo codice sia C #. Per quel linguaggio specifico, opterei per una forma semplificata della prima versione, in quanto il costruttore vuoto non serve a nulla qui (si ottiene un costruttore predefinito gratuito se non lo si definisce):

class Foo
{
    private static int firstNumber = 1;
    private static int secondNumber = 25;
    private FooBar fooBar = new FooBar();
}

Per me, semplifica il codice in quanto i campi sono definiti e assegnati insieme; Non ho bisogno di saltare su e giù il file dai campi al costruttore per vedere i loro valori predefiniti.

Ma altre persone avranno validi motivi personali per preferire la tua seconda opzione.

La migliore pratica di codifica è quindi la coerenza: scegli lo stile che ti piace e segui con esso. Flippare tra i due, apparentemente a caso, non è una buona idea.

Caveat: ci sono momenti in cui potresti aver bisogno di mescolare i due per necessità. Il pragmatismo dovrebbe sempre vincere i principi qui, quindi se hai bisogno di mescolarli fallo così. Basta evitare di mescolarli se non è necessario.

    
risposta data 26.09.2018 - 15:57
fonte
1

Dove viene inizializzata una variabile dipende dal suo ambito e dalla destinazione d'uso.

Campi statici

Imposterei il loro valore predefinito quando li dichiarano per mantenere insieme la dichiarazione e l'inizializzazione.

class Foo {
    private static int firstNumber = 1;
}

Campi istanza

Se il valore predefinito sarà sempre lo stesso per tutte le istanze, non vedo nulla di sbagliato includendo l'inizializzazione con la dichiarazione.

class Foo {
    private FooBar fooBar = new FooBar();
}

Se esiste la possibilità che il valore iniziale possa variare in base ad altre logiche di inizializzazione o essere passato al costruttore, allora imposterò il valore nel costruttore. Mi chiedo se dovrei preoccuparmi del valore di fooBar quando costruisci Foo .

class Foo {
    private FooBar fooBar;

    public Foo(int number) {
        fooBar = new FooBar();
        fooBar.Size = number;
    }
}
    
risposta data 26.09.2018 - 16:31
fonte

Leggi altre domande sui tag