Perché alcuni programmatori mantengono valori nelle variabili globali o nelle variabili membro ma non vengono riutilizzati?

1

Sto parlando delle normali applicazioni per PC, la memoria dovrebbe essere sufficiente.

Dichiarano variabili globali o membri.

In ogni funzione / metodo, usano le stesse variabili globali / membri.

All'inizio di ogni metodo, le variabili vengono reinizializzate in modo che il vecchio valore non venga mai utilizzato.

Perché mantengono le variabili ma nessuna possibilità di riutilizzare il vecchio valore?

class A
{
    List<Car> carList;
    public List<Car> M()
    {
        // always re-init variable
        this.carList = new List<Car>();
        // ...
        // fetch from DB
        return this.carList;
    }

    public List<Car> N(string id)
    {
        // always re-init variable
        this.carList = new List<Car>();
        // ...
        // fetch from DB
        return this.carList;
    }
}
    
posta linquize 20.02.2013 - 04:44
fonte

5 risposte

3

È impossibile conoscere le motivazioni alla base di questo codice dato un singolo punto nel tempo. Potrebbe essere il risultato di logoramento della classe.

Immaginate, per esempio, che una volta che la lista delle macchine funzionasse davvero come una variabile membro, con alcuni metodi che la modificavano e alcune la recuperavano. Quindi, sono stati scoperti alcuni bug causati da diversi metodi che modificano il valore nel momento sbagliato, forse l'introduzione dell'esecuzione multithread. Ora il programmatore è andato e ha cambiato tutti i metodi di generazione di elenchi di automobili per restituire l'elenco, piuttosto che memorizzarlo nella variabile membro. Ma le persone spesso cambiano la quantità minima richiesta per far funzionare le cose, specialmente se si è affrettati a lavorare su un bug critico, e invece di creare una variabile locale, ha appena lasciato il riferimento esistente alla variabile membro. Voila!

    
risposta data 20.02.2013 - 06:53
fonte
2

Pensano di essere una variabile in grado di dichiarare ogni volta in ogni funzione. Ma questa non è una buona abitudine di programmazione per mantenere la variabile globale ogni volta che si inizializza il valore. In questo caso, il ciclo di vita della variabile globale potrebbe portare a una cattiva gestione della memoria

    
risposta data 20.02.2013 - 05:46
fonte
1

Nel tuo esempio, potrebbe essere cattivo mantenere il vecchio valore. Se hai costruito un elenco di auto in N e hai restituito l'elenco al chiamante A, e quindi il chiamante B effettua una richiesta usando M, e M ha cancellato la stessa lista e popolato un diverso set di automobili, non avrebbe Il chiamante A potrebbe essere confuso quando improvvisamente la lista viene mutata? È più probabile che il commento di Greg Hewgill alla tua domanda sia interamente valido, non avrebbe mai dovuto essere stato membro in primo luogo.

Quello che vedi è solo un sintomo di ciò che spesso accompagna questo, e questa è una grande classe con membri agli strati di astrazione sbagliati, una classe che probabilmente sta facendo troppo per troppe persone e può spesso estendersi a il punto di essere indecifrabile. Se, d'altra parte, lo stato membro reinizializzato è il tuo problema solo con la classe, allora forse stai meglio di quelli di noi che hanno visto e lavorato molto peggio.

    
risposta data 20.02.2013 - 05:55
fonte
1

Potrebbe essere che tu abbia qualcosa di simile a questo:

class A
{
    List<Car> carList;
    public List<Car> M()
    {
        // always re-init variable
        this.carList = new List<Car>();
        // the following functions modify carList
        sortTheCarList();
        filterTheCarList();
        frobnicateTheCarList();
        return this.carList;
    }
}

È possibile che abbia almeno un senso. Anche se continuo a pensare al suo cattivo stile per farlo in questo modo.

    
risposta data 20.02.2013 - 07:36
fonte
-2

Non è una buona pratica. Le variabili locali dovrebbero essere utilizzate, se si reinizializza la variabile globale ogni volta che si esegue la funzione. Le variabili globali devono essere utilizzate se si desidera mantenere i vecchi valori.

    
risposta data 20.02.2013 - 06:51
fonte

Leggi altre domande sui tag