Parametrizza i metodi rispetto alle variabili globali

6

Ho una domanda molto semplice che mi perseguita da un po 'quando il mio codice inizia a crescere.

I parametri dovrebbero essere sostituiti da variabili globali quando attraversano lunghi percorsi di chiamate di funzioni nidificate?

Comprendo che l'ambiente globale può rendere imprevedibile lo stato di un programma perché molte funzioni possono modificare variabili condivise, ma tuttavia, lo spazio globale rende le cose così facili.

Lasciami spiegare:

functionA(){
   x = something
   functionB(x)
}
functionB(x){
   functionC(x)
}
functionC(x){
   finallyDoSomethingWithX(x)
}
finallyDoSomethingWithX(x){
  x += 1 //Very dummy example ignoring pass by value, not reference.
}

Sostituito da:

globalX;
functionA(){
   globalX = something
   functionB()
}
...
...
...
finallyDoSomethingWithX(){
   globalX += 1
}

Sento che la seconda via dà così tanta libertà di programmazione perché i parametri possono accumularsi facilmente e possono anche essere molto restrittivi a volte quando il codice deve essere riutilizzato, ma allo stesso tempo sento che la funzione perderà la sua modularità quando è correlata ad una variabile nell'ambiente globale, perdendo anche la riusabilità quando, ad esempio, voglio operare finallyDoSomethingWithX con un'altra variabile diversa tha globalX .

Penso che questo mi stia succedendo perché in realtà non sto usando schemi di progettazione perché sto programmando in Javascript, che per me sembra un linguaggio one-script-deal-all-all per progetti medi.

Qualche consiglio? modelli? Posso essere più specifico se necessario.

    
posta AFP_555 14.04.2017 - 23:22
fonte

2 risposte

5

Non usare variabili globali.

Inoltre, non passare i parametri giù catene di funzioni!

È difficile perché non si usa un esempio reale. Ma normalmente ci sarà un approccio migliore.

Diciamo che abbiamo una variabile password che dobbiamo usare per chiamare apis che inturn sono usate da varie funzioni di basso livello.

Approccio globale (codice psudo)

var pass;

function multiply(a,b) {
   return apiMultiply(pass,a,b);
}

Approccio al passaggio dei parametri

function multiply(a,b,pass) {
    return apiMultiply(pass,a,b);
}

Approccio all'oggetto

class math {
    var api;
    constructor(pass) {
        api = new api(pass);
    }

    function Multiply(a,b) {
        api.Multiply(a,b); //uses pass from constructor
    }
}
    
risposta data 15.04.2017 - 10:26
fonte
2

Evita i globali come la peste.

Qualsiasi codice può modificare un globale. Quindi se avessi una catena A (x) - > B (x) - > C (x) - > ... - > Z (x), e si memorizza x in una X globale e ora si ha una catena A- > B- > C- > ...- > Z, quindi ad ogni singolo passo di quella lunga catena, o in un codice completamente indipendente, qualcuno potrebbe cambiare X. E il valore che Z utilizza potrebbe essere completamente diverso da quello con cui A è iniziato.

È un incubo se vuoi essere sicuro che il tuo codice fa quello che deve fare, o che fa quello che pensi che faccia.

    
risposta data 15.04.2017 - 14:36
fonte

Leggi altre domande sui tag