Devo nidificare le funzioni in lingue che mi consentono di farlo o dovrei piuttosto evitarlo?

11

In JavaScript, PL / SQL e in alcuni altri linguaggi, le funzioni possono essere annidate, ossia dichiarate in un'altra funzione. Questo potrebbe essere usato per suddividere una grande funzione in pezzi più piccoli, ma mantenere quei pezzi nel contesto della funzione più grande.

function doTooMuch() {
    function doSomething () {
       ...
    }
    function doSomethingElse() {
       ...
    }
    function doYetAnotherThing() {
       ...
    }

    // doTooMuch body

    doSomething();
    doSomethingElse();
    doYetAnotherThing();
}

In alcuni casi, quando quelle funzioni più piccole non usano le variabili locali della funzione più grande, questo potrebbe facilmente essere cambiato in una versione in cui tutte le funzioni sono inoppugnate.

function doSomething () {
   ...
}
function doSomethingElse() {
   ...
}
function doYetAnotherThing() {
   ...
}
function doTooMuch() {
    doSomething();
    doSomethingElse();
    doYetAnotherThing();
}

Supponendo che quelle funzioni annidate non debbano essere utilizzate da nessun'altra parte, è meglio tenerle nel contesto della funzione grande o è cattiva perché questo è esattamente ciò che rende la funzione grande, beh, grande?

    
posta user281377 29.02.2012 - 09:15
fonte

3 risposte

8

È una questione di opinione, ma eviterei le funzioni di nidificazione a meno che non fosse in realtà una parte necessaria e deliberata del tuo progetto.

Quando si nidificano le funzioni, nella maggior parte delle lingue, si ottiene una sorta di effetto meccanico. Il più comune, e interessante, è chiudere l'ambito lessicale di una variabile che può essere utilizzata all'interno del corpo, ma anche altri (ad esempio: visibilità della funzione) mostrano un po 'di tempo.

Questi sono in genere strumenti fantastici, se usati correttamente, ma sono strumenti complessi, perché possono causare effetti non locali o non ovvi quando si esamina per la prima volta il codice.

Se non li usi, molte persone leggeranno il codice e non vedranno nulla di simile, quindi presumeranno di averlo perso e di guardare di nuovo, cercando di capire perché l'hai fatto in quel modo, e non in un ambito separato.

Rischi anche che i futuri programmatori chiudano intenzionalmente o addirittura accidentalmente qualcosa che non intendevano, non notando il rischio proprio lì.

Infine, se la dichiarazione della funzione dichiara una funzione con nome al di fuori dell'ambito della funzione di inclusione, basta evitarla. Questo è super confusionario per tutti.

Per quanto riguarda la nota finale: poiché le singole funzioni aiutano a delimitare il codice, le funzioni di nidificazione sono meno problematiche di una singola funzione gigante, ma alla fine fa significa leggere molto più codice per capire doTooMuch() - specialmente se è possibile nascondere il codice tra le dichiarazioni di funzioni nidificate o controllare che nessuno lo abbia fatto.

    
risposta data 29.02.2012 - 09:20
fonte
2

Questa è una di quelle domande che non hanno una risposta corretta e vengono in mente parole come "preferenza personale", "pratica di squadra". A mio parere, le piccole funzioni (ora ecco un'altra cosa soggettiva) che non vengono utilizzate in nessuna parte appartengono alle loro funzioni genitore, specialmente quando possono essere senza nome.

    
risposta data 29.02.2012 - 09:32
fonte
0

Questa domanda non ha una risposta corretta, perché nessuna delle due opzioni massimizza l'incapsulamento. Se li annidate, hanno ancora accesso a variabili che non dovrebbero. Se non lo fai, allora altre funzioni hanno accesso a funzioni che non dovrebbero. Ad ogni modo, perdi.

    
risposta data 29.02.2012 - 10:07
fonte

Leggi altre domande sui tag