Dovrei annidare le funzioni in lingue che mi permettono di farlo o dovrei piuttosto evitarlo?


12

In JavaScript, PL / SQL e alcune altre lingue, le funzioni possono essere nidificate, ovvero dichiarate all'interno di un'altra funzione. Questo potrebbe essere usato per spezzare una grande funzione in pezzi più piccoli, ma mantenerli 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, ciò potrebbe facilmente passare a una versione in cui tutte le funzioni non sono state verificate.

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

Supponendo che quelle funzioni nidificate non debbano essere utilizzate altrove, è meglio tenerle nel contesto della funzione grande o è un male perché questo è esattamente ciò che rende la funzione grande, beh, grande?

Risposte:


8

È una questione di opinione, ma eviterei le funzioni di annidamento se non fosse in realtà una parte necessaria e deliberata del tuo progetto.

Quando annidate 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 altre (ad esempio: visibilità della funzione) si presentano anche alcune volte.

Questi sono in genere strumenti fantastici, se usati nel modo giusto - ma sono strumenti complessi, perché possono dare origine a effetti non locali o non ovvi quando si guarda per la prima volta il codice.

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

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

Infine, se la dichiarazione di funzione dichiara una funzione denominata al di fuori dell'ambito della funzione che la racchiude, evitatela. È molto confuso per tutti.

Per quanto riguarda la nota finale: perché il codice singole funzioni di aiuto delimitano, le funzioni di nidificazione è meno fastidioso di una singola funzione gigante, ma alla fine fa media la lettura di un codice molto di più per capire doTooMuch()- specialmente se è possibile nascondere codice tra le dichiarazioni di funzione annidati, o è necessario verificare che nessuno lo abbia fatto.


-1: Javascript non è "la maggior parte delle lingue". Le funzioni di nidificazione in Javascript sono pratiche normali.
Kevin Cline,

2
Le funzioni di nidificazione di @kevincline in JavaScript sono una cattiva pratica comune
Raynos

@Raynos: se non li annidi, dove li metti? Non ci sono classi per contenerli. Ecco un codice tipico:jquery(function($){ $('#id').click(function(){...}); }
Kevin Cline

@kevincline ... Codice tipico per noob, hai bisogno di funzioni nidificate in profondità. E questo perché javascript non ha ambito del modulo, quindi hai bisogno di quella chiusura anonima.
Raynos

E se quel clic esegue una chiamata Ajax, con un callback di completamento? Ora hai funzioni nidificate su due livelli. Certo, potresti limitare l'annidamento assegnando le chiusure anonime alle variabili. È davvero meglio?
Kevin Cline

2

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


0

Questa domanda non ha una risposta giusta, poiché nessuna delle due scelte massimizza l'incapsulamento. Se li annidate, avranno comunque accesso alle variabili che non dovrebbero. In caso contrario, altre funzioni hanno accesso a funzioni che non dovrebbero. Ad ogni modo, perdi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.