Perché c'è così tanto ronzio nelle chiusure? [chiuso]


9

Perché c'è così tanto ronzio nelle chiusure tra gli sviluppatori? Nella mia carriera non li ho mai usati intenzionalmente, anche se non capisco chiaramente cosa siano.

UPD: solo per chiarire. La domanda è perché il concetto di chiusura è diventato così discutibile in questi giorni.


3
Come saresti in grado di usare intenzionalmente qualcosa che non sai di cosa si tratta? Quindi in sostanza dovresti prima chiedere (o cercare piuttosto) quali sono le chiusure.
Steven Jeuris,

1
Hai letto l'articolo di Wikipedia? Cosa non hai capito a riguardo?
Kevin Cline,

2
Su cosa si basa la tua carriera?

4
Che tipo di domanda è questa? Quale "ronzio"? Cosa non capisci? Perché invece non hai posto questa domanda?
Aaronaught,

4
A difesa dell'OP, le chiusure sono un concetto vecchio ma solo recentemente sono state le chiacchiere della città, per così dire. E il concetto è davvero molto semplice per chiunque abbia imparato un po 'più di matematica, inoltre non riesco a capire perché la gente ne parli come se fosse qualcosa di molto difficile da comprendere. Forse è solo un modo per farsi sembrare più intelligenti: "guarda, grido chiusure che sono così difficili da scuotere, quindi scuoto".
quant_dev,

Risposte:


22

Una chiusura è un codice che ricorda il mondo da cui proviene mentre è ancora utilizzabile dove è stato portato.

Un esempio è la definizione di una funzione anonima in Java che sa che si trova all'interno di YourObject e può manipolarne metodi e funzioni. Questa funzione viene quindi consegnata ad esempio a Altalena dove va in profondità all'interno, ad esempio un ascoltatore, ma ha ancora un'ancora di salvezza alle sue radici.

Questo è un concetto molto potente in quanto consente di fornire codice che, all'insaputa del codice che lo utilizza, può raggiungere altre parti del codice.


1
Sì. È un modo per iniettare non solo la procedura, ma lo stato, in un altro codice. Ciò consente un livello molto elevato di flessibilità nella progettazione di algoritmi; è possibile progettare metodi basati su modelli che dipendono da subroutine con stato, che potrebbe non conoscere al momento della compilazione. L'aspetto negativo è che il collegamento alla fonte originale di quel metodo, e quindi lo stato, può essere interrotto senza che il metodo consumante lo sappia; quando ciò accade, si verificano errori di runtime difficili da trovare.
KeithS,

1
Ah ah, funzione anonima in Java ... Divertente.
configuratore

1
@configurator, non è divertente, un dato di fatto.


java 7 non ha chiusure.

6

Le chiusure sono solo qualcosa per risolvere una varietà di problemi in modo elegante. In realtà, nei linguaggi di programmazione in cui non esistono chiusure, vengono create tecniche per implementare funzioni simili.

Basti pensare a funzioni in C ++ o Runnables in Java. Sono solo tecniche che consentono funzionalità simili alle chiusure. Una sorta di «chiusure manuali».

Le chiusure stanno diventando più popolari perché sono integrate nelle lingue più diffuse: Javascript sta crescendo a causa di applicazioni online (come ad esempio google doc), C # lo ha implementato, PHP lo ha implementato dalla 5.3 e così via.

Ora che le chiusure sono disponibili in sempre più tecnologie, diventa abbastanza chiaro che sempre più persone sono interessate a loro.

Quindi ora cosa sono le chiusure? Questo è abbastanza semplice Una chiusura è una funzione e un contesto per eseguirla all'interno. Questo è manipolato come un oggetto. Perché è utile? Questo è utile per agganciare il proprio codice al codice esistente.

Ecco due situazioni comuni che lo richiedono: quando le azioni sono gestite da un altro pezzo di codice, come nel multithreading con un pool di thread, o quando un'azione deve essere eseguita su un evento scelto (usato spesso in javascript per l'interfaccia utente).


Ti ho capito chiaramente? Ci sono alcune "chiusure manuali" (non proprio chiusure, ma qualcosa che ricorda il loro comportamento) e ci sono alcune "chiusure VERE"?

La chiusura è una capacità linguistica. Alcune lingue non hanno questa capacità, quindi devi chiudere manualmente usando gli strumenti che la lingua ti fornisce. Dire che sono VERO o no non è un dibattito molto interessante IMHO.
deadalnix,

2
@gasan, puoi sempre estrarre l'assemblaggio ed eseguire manualmente qualsiasi modello tu voglia con un secchio di istruzioni GOTO. Allo stesso modo è possibile eseguire manualmente un ciclo "for" con un ciclo "while" (in C ++). I livelli più avanzati e più alti offrono un modo standardizzato di fare le cose comuni.
Filippo

6

Ho visto una citazione divertente l'altro giorno, era sulla falsariga di "le classi sono dati con funzioni. Le chiusure sono funzioni con dati".

Sì, è una semplificazione eccessiva, ma aiuta a chiarire il punto.


+1 Bel modo di vedere cos'è una chiusura: D
deadalnix
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.