Dove dovrebbero essere dichiarate le variabili [duplicato]

3

Considerando che ho un ciclo for in un metodo di una classe. Se la variabile incrementata deve essere dichiarata come member of the class , o dovrebbe essere dichiarata in the method , la usa (o anche nel ciclo for , direttamente)? Mentre dichiararlo all'interno del metodo sembra più facile e più pulito, non dichiararlo all'inizio della classe ti rende più controllato? Qualcosa come dichiararlo int var_used_for_loop_in_method_x . Qual è una buona pratica di programmazione?

Tieni presente che non sto chiedendo specificamente il ciclo for . Sto chiedendo se dovremmo provare a mettere la maggior parte delle variabili come membri della classe il più possibile o meno.

    
posta George Irimiciuc 25.03.2014 - 23:08
fonte

1 risposta

44

Regola empirica: le variabili dovrebbero sempre essere - o il più vicino possibile a - l'ambito in cui sono necessarie. Un altro modo per esprimerlo è che le variabili dovrebbero essere racchiuse all'interno del contesto in cui hanno senso e sono effettivamente utili.

Molto spesso vorrete dichiarare la vostra variabile incrementale insieme all'istruzione for . A volte lo dichiarerai un po 'più alto nella gerarchia perché hai bisogno di sapere quante occorrenze hai fatto in loop o a che punto il ciclo è stato interrotto.

In quasi tutti gli scenari, avendo una variabile di incremento del ciclo dichiarata come campo di una classe è una cattiva idea. Non ti darà alcun tipo di ulteriore "controllo"; semmai, inquinerà la tua classe e renderà più difficile capire dal punto di vista di un estraneo. Inoltre, se lo usi inavvertitamente in più di un ciclo, potrebbe addirittura violare il codice.

UPDATE:

Riguardo a quest'ultimo, poiché keshlam spiega molto bene nei commenti sottostanti, un ambito più piccolo ridurrà al minimo il rischio che la tua variabile venga modificata dove non ti aspetteresti. Inoltre, come spiega ulteriormente, le variabili possono liberare in modo sicuro la memoria utilizzata quando si esce dal campo di applicazione. La maggior parte delle lingue moderne lo farà automaticamente per te (il tuo chilometraggio può variare).

Inoltre, dal momento che hai chiesto a quale scopo potevano servire le variabili a livello di classe, ecco due esempi in :

Backend di proprietà

Questo è probabilmente il caso d'uso più popolare.

public class ConnectionHolder
{
    // ...

    IDbConnection _connection;

    public IDbConnection Connection
    {
        get { return _connection; }
    }

    // ...
}

Titolare di informazioni sullo stato dell'istanza

Qui abbiamo la proprietà nell'esempio sopra che accede a una fabbrica che a sua volta produrrà un'istanza di IDbConnection . La variabile _connectionAccessed booleana funge da flag per indicare se è già stato effettuato un tentativo di ottenere una connessione di una connessione.

public class ConnectionHolder
{
    // ...

    bool _connectionAccessed = false;
    IDbConnection _connection;

    public IDbConnection Connection
    {
        get
        {
            if (!_connectionAccessed)
            {
                _connectionAccessed = true;
                _connection = ConnectionFactory.Create();
            }

            return _connection;
        }
    }

    // ...
}

Come puoi vedere nei due esempi sopra, è logico che le variabili vengano dichiarate nell'ambito di una classe completa.

Spero che queste informazioni siano utili.

    
risposta data 25.03.2014 - 23:14
fonte