Perché l'ambito è una buona cosa? [duplicare]

7

Sono un programmatore newbie. Trovo fastidioso dichiarare una variabile in 1 funzione e non essere in grado di accedervi in altre funzioni. Devo rendere molte delle mie variabili globali solo per far funzionare il mio codice. Ma molte persone dicono che lo stato globale è malvagio. Non capisco lo scopo di avere uno scopo limitato, comunque.

L'ambito sembra incoraggiare gli sviluppatori a dichiarare le variabili con lo stesso nome in luoghi diversi.

def func1():
    a = 'hello world'
    ...
def func2():
    a = 'hello universe'
    ...

Senza la necessità di distinguere le variabili in funzioni diverse, gli sviluppatori chiamano le loro variabili nomi vaghi e meno significativi. Non sarebbe meglio avere nomi di variabili più specifici?

def func1():
    func1_a = 'hello world'
    ...
def func2():
    func2_a = 'hello universe'
    ...

Perché limitare l'accesso alle variabili al di fuori del blocco in cui è definito, ovvero l'ambito, una buona cosa da avere nei linguaggi di programmazione? Come novizio, trovo conveniente rendere ogni variabile una variabile globale. Perché è così brutto nei progetti più grandi?

    
posta clickbait 13.07.2018 - 20:00
fonte

7 risposte

23

L'ingegneria è, astrattamente, la gestione della complessità.

L'ingegneria del software è, in modo astratto, la gestione della complessità nel software!

Scope è uno strumento per aiutare a gestire la complessità, come qualsiasi strumento che può essere usato o abusato, e talvolta può essere eccessivo.

Senza campo di applicazione, dovresti monitorare l'intero stato del programma in ogni momento durante la scrittura o la modifica.

Senza strumenti per gestire la complessità, la complessità aumenterà al punto da diventare schiacciante. N.B. scope è solo uno strumento in aresenel.

As a newbie, I find it convenient to make every variable a global variable. Why is that bad in bigger projects?

Con l'aumentare delle dimensioni del progetto diventerà sempre più difficile mantenere dritti lo stato, i nomi, ecc. farai più errori.

    
risposta data 13.07.2018 - 20:05
fonte
10

Ridurre al minimo l'utilizzo di variabili globali significa che non devi pensare a come queste variabili interagiscono con le tue funzioni.

Quanti punti diversi del tuo codice stanno scrivendo su quella variabile globale? La tua variabile globale è il centro di una ragnatela; ogni posto che tocca aggiunge complessità e accoppiamenti non necessari.

Elimina la variabile e la complessità scompare, perché puoi ragionare su ogni funzione in isolamento. Il test dell'unità diventa più semplice, la manutenzione diventa più semplice, tutto diventa più facile.

    
risposta data 13.07.2018 - 20:06
fonte
4

Hai detto che sei un programmatore novizio, quindi immagino che tu stia lavorando su programmi abbastanza piccoli in questo momento - abbastanza piccolo da poterlo tenere in gran parte in testa allo stesso tempo. Ma una tipica app per dispositivi mobili è costituita da circa 400k di linee di codice. Photoshop è di circa 5 milioni.

Come puoi tenere un sacco di codice nella tua testa in una volta? Non puoi Nessuno può. Quindi, incapsulamento. Costruisci una scatola sigillata che fa una cosa. Quindi, una volta verificato che la scatola funzioni, puoi smettere di pensare al contenuto della scatola. Una dozzina di linee di codice si trasforma in una sola unità. Poi lo fai di nuovo, e di nuovo, usando le caselle per creare riquadri più grandi, così che in ogni livello hai un numero abbastanza piccolo di elementi per tenerli tutti nella tua testa in una volta (idealmente, in pratica ci sono vari modi per sistemi ben disaccoppiati per diventare un pasticcio confuso).

Ecco perché vuoi mantenere l'ambito delle tue variabili il più piccolo possibile. Perché allora puoi smettere di pensarci prima.

    
risposta data 13.07.2018 - 23:21
fonte
3

Ci sono un paio di scuole di metodologia di programmazione, ma quasi tutti sono d'accordo sul fatto che le funzioni dovrebbero avere una responsabilità ben definita e ristretta. Per uno, rende il test molto più semplice, per un altro, rende il codice più modulare.

È probabile che in un'applicazione di grandi dimensioni si desideri ottenere un conteggio di più di una volta. Se non avevi scope, dovresti sovrascrivere la variabile count, probabilmente prima che avessi finito di usarla in un altro contesto.

Potresti rispondere dicendo "non è un problema, sono un buon programmatore, uso solo nomi di variabili molto descrittivi". Tuttavia, considera una situazione in cui stai lavorando a un team per creare software. Che garanzia hai che nessun altro abbia mai usato la tua variabile? Puoi cercare l'intero progetto per qualsiasi istanza, ma cosa succede quando trovi un'occorrenza. Invece di nominare la tua variabile PostCount potresti finire col chiamarlo PostCountInBlogController . Stiamo diventando più lontano dal codice leggibile.

    
risposta data 13.07.2018 - 22:29
fonte
2

Oltre all'osservazione che lo stato globale è cattivo, ciò che stai cercando, se vuoi condividere le variabili tra diversi metodi, è la nozione di istanza della classe e dell'oggetto!

Una classe ci consente di raggruppare lo stato e i metodi che funzionano insieme.

Inoltre, la creazione di istanze (creando un'istanza di un oggetto di una classe) ci consente di

  • gestisci la durata dello stato, quindi non è necessariamente globale,
  • supporta più istanze simultanee separate,
  • gestisci l'accesso allo stato, quindi un'istanza non interferisce con un altro

La classe & Il meccanismo di istanza fornisce ciò che stai cercando, e altro ancora, e, evita molte delle insidie delle variabili globali.

    
risposta data 13.07.2018 - 20:34
fonte
1

Se senti la necessità di accedere a una variabile dichiarata in un'altra funzione, la tua funzione potrebbe avere troppe responsabilità.

Invece di concentrarti sul numero di linee, prova a pensare a una funzione come a un processore che fa una cosa. Se produce un risultato, puoi restituire il risultato e passarlo alla funzione successiva come argomento di input. Questo è un altro modo di condividere i dati, ma senza che una funzione debba conoscere l'altra funzione.

Ora tutto in una funzione sarà indipendente dalle altre funzioni. È possibile modificare e spostare elementi in una funzione senza influire (dovendo cambiare anche) altre funzioni. Questa è una buona cosa, rende il codice più facile da mantenere.

È come costruire qualcosa dai componenti. I componenti sono autonomi, possono esistere ed essere aggiornati ignorando l'intero sistema.

    
risposta data 13.07.2018 - 21:00
fonte
1

Molte funzioni hanno alcune variabili che usano durante l'esecuzione, ma che nulla nell'universo avrà motivo di preoccuparsi di una volta che ritorneranno. Mentre potrebbe essere possibile per un'implementazione mantenere tali variabili per sempre, o almeno fino alla prossima volta che viene chiamata la funzione, farlo con variabili a cui nessuno si preoccuperà mai rappresenterebbe uno spreco di spazio. Limitare l'ambito delle variabili consente di scartarle quando una funzione viene chiusa, consentendo a qualsiasi spazio che hanno occupato di essere utilizzato per altri scopi.

Anche se sarebbe possibile etichettare i nomi delle variabili con un prefisso che indica la funzione in cui vengono utilizzati, ciò non avrebbe molto senso per le variabili utilizzate solo all'interno della funzione in cui sono state create. Il fatto che una dichiarazione per x appaia in una funzione foo() indica che qualsiasi utilizzo dell'identificatore x all'interno di quella funzione farà riferimento alla variabile privata di foo di quel nome. Non è necessario contrassegnare il nome con il nome foo perché la variabile non può appartenere a nessuna altra funzione.

    
risposta data 13.07.2018 - 22:37
fonte

Leggi altre domande sui tag