Quando le variabili locali devono essere utilizzate su variabili di istanza?

-2

Questa domanda è ispirata dalla risposta di Mike Nakis a una domanda che ho chiesto in precedenza: Un calcolatore dovrebbe essere un tipo di valore o un tipo di entità? . Si prega di consultare il codice qui sotto:

public class Calculator
{
    private readonly int Number1;
    private readonly int Number2;
    private readonly int Answer;

    public Calculator(int _Number1, int _Number2)
    {
        Number1 = _Number1;
        Number2 = _Number2;
        Answer = Add();
    }

    private int Add()
    {
        return Number1 + Number2; //plus 30 lines of code
    }
}

Notate che ci sono due variabili di istanza chiamate: Number 1 e Number 2. Funzionerebbe anche (dove entrambi i numeri sono variabili locali):

public class Calculator
{
    public int Add(int Number1,int Number2)
    {
        return Number1 + Number2; //plus 30 lines of code
    }
}

Comprendo la differenza tra variabili di istanza e variabili locali, ad esempio stack e heap; ambito ecc.

Quando si progetta un sistema (UML); come si decide se utilizzare una variabile locale o una variabile di istanza. I fattori che posso pensare sono i seguenti:

1) Più facile per rendere una chiamata immutabile

Il motivo per cui lo chiedo è perché ho letto un sacco di domande qui dove penso che dovrebbe essere usata una variabile di istanza; tuttavia viene utilizzata una variabile locale. Esiste una regola che non conosco simile a: "Utilizza l'aggregazione sull'ereditarietà".

Sto parlando rigorosamente dal punto di vista del DDD e delle migliori pratiche. Mi rendo conto che questo non si applica sempre nel mondo reale a causa dei limiti di tempo ecc.

    
posta w0051977 15.06.2017 - 11:05
fonte

2 risposte

5

Nel tuo primo esempio, i clienti di Calculator dovrebbero costruire un nuovo Calculator ogni volta che vogliono aggiungere numeri. Questo non è molto efficiente! Comporterà molte allocazioni dall'heap e richiederà più garbage collection.

La tua seconda soluzione è molto più semplice - la stessa istanza può essere utilizzata per l'intero programma. Hai solo bisogno di un'istanza di Calculator per l'intero sistema!

Ecco alcune linee guida che uso:

  1. Generalmente le variabili dovrebbero avere il più piccolo ambito possibile. La ragione di questo è perché è più facile ragionare. L'ambito locale è limitato e, osservando un singolo metodo, è possibile visualizzare l'intero ambito della variabile. Una variabile di istanza può essere raggiunta da tutti i metodi della classe, quindi ci sono più ragioni per le variabili di esempio.

  2. L'immutabilità è una qualità che porta a un minor numero di bug ea una migliore manutenibilità. Hai usato variabili di istanza immutabili, ma non hanno per essere immutabili. Le variabili di istanza mutabili rendono la classe a prova di stato e rendono le cose come la sicurezza dei thread e test più di una sfida. Le variabili locali non influenzano l'apolidia della classe, quindi sono migliori.

  3. Pensa alla tua classe come se avesse un'interfaccia di fronte ad essa. Pensa a come la tua classe verrebbe estratta se necessario. Questo può aiutarti a decidere quale dovrebbe essere una dipendenza iniettata dal costruttore (vale a dire il valore di un'istanza immutabile) e quale dovrebbe essere un parametro di funzione (vale a dire il valore locale)

risposta data 15.06.2017 - 11:29
fonte
3

Trasformare le variabili locali in variabili di istanza (senza alcun motivo particolare) viola il principio almeno visibilità . Causa problemi durante la refaceing, specialmente quando un metodo deve essere spostato su un'altra classe.

Anche le variabili di istanza introducono state all'oggetto.

Cerchiamo di evitare state nei nostri oggetti perché rende più difficile il riutilizzo e può causare problemi quando si tratta di concorrenza.

    
risposta data 15.06.2017 - 11:29
fonte

Leggi altre domande sui tag