Dlaczego jest tyle szumu na temat zamknięć? [Zamknięte]


9

Dlaczego jest tak dużo szumu na temat zamknięć wśród programistów? W swojej karierze nigdy celowo ich nie użyłem, choć nie rozumiem, czym one są.

UPD: tylko dla wyjaśnienia. Pytanie dotyczy tego, dlaczego koncepcja zamknięcia stała się ostatnio tak rozmowna.


3
Jak mógłbyś celowo wykorzystać coś, czego nie wiesz, co to jest? Zasadniczo powinieneś najpierw zapytać (a raczej poszukać), jakie są zamknięcia.
Steven Jeuris,

1
Czy czytałeś artykuł na Wikipedii? Czego nie zrozumiałeś?
kevin cline

2
Na czym opiera się Twoja kariera?

4
Co to za pytanie? Co za „brzęczenie”? Czego nie rozumiesz Dlaczego zamiast tego nie zadałeś tego pytania?
Aaronaught

4
W obronie PO zamknięcia są starą koncepcją, ale dopiero niedawno mówi się o mieście, że tak powiem. Ta koncepcja jest naprawdę bardzo prosta dla każdego, kto nauczył się nieco więcej matematyki, nie rozumiem też, dlaczego ludzie mówią o nich tak, jakby byli czymś bardzo trudnym do zrozumienia. Może to tylko sposób na to, aby wyglądać mądrzej: „patrz, zamykam tak trudne, więc kołyszę”.
quant_dev

Odpowiedzi:


22

Zamknięcie to kod, który zapamiętuje świat, z którego pochodzi, a jednocześnie nadaje się do użytku w miejscu, do którego został doprowadzony.

Przykładem jest zdefiniowanie anonimowej funkcji w Javie, która wie, że znajduje się ona w twoim obiekcie i może manipulować jej metodami i funkcjami. Ta funkcja jest następnie dostarczana np. Do Swing, gdzie zagłębia się np. W Słuchacza, ale nadal ma linię życia z powrotem do swoich korzeni.

Jest to bardzo potężna koncepcja, ponieważ pozwala dostarczyć kod, który - bez wiedzy o używającym go kodzie - może sięgać z powrotem do innych części kodu.


1
Tak. Jest to sposób na wstrzyknięcie nie tylko procedury, ale i stanu do innego kodu. Pozwala to na bardzo wysoki stopień elastyczności w projektowaniu algorytmów; możesz projektować metody oparte na szablonach, które zależą od stanowych podprogramów, o których może nawet nie wiedzieć w czasie kompilacji. Minusem jest to, że link do oryginalnego źródła tej metody, a tym samym stanu, może zostać zerwany bez wiedzy konsumenckiej metody; gdy tak się dzieje, pojawiają się trudne do znalezienia błędy czasu wykonywania.
KeithS,

1
Ha ha, anonimowa funkcja w Javie ... Zabawne.
konfigurator

1
@ konfigurator @, nie jest zabawny, fakt.


java 7 nie ma zamknięć.

6

Zamknięcia to po prostu rozwiązanie eleganckiego rozwiązania różnych problemów. W rzeczywistości w językach programowania, w których nie ma zamknięć, tworzone są techniki implementacji podobnych funkcji.

Pomyśl tylko o funktorach w C ++ lub Runnables w Javie. Są to tylko techniki, które umożliwiają funkcje podobne do zamknięć. Pewnego rodzaju „ręczne zamykanie”.

Zamknięcia stają się coraz bardziej popularne, ponieważ są zintegrowane z popularnymi językami: JavaScript rośnie z powodu aplikacji internetowych (takich jak na przykład google doc), C # zaimplementował go, PHP zaimplementował go od 5.3 i tak dalej.

Teraz, gdy zamknięcia są dostępne w coraz większej liczbie technologii, staje się dość oczywiste, że coraz więcej osób jest nimi zainteresowanych.

Czym więc są zamknięcia? To jest dość proste. Zamknięcie jest funkcją i kontekstem do jego wykonania. Jest to manipulowane jako obiekt. Dlaczego to jest przydatne? Jest to przydatne, aby podłączyć własny kod do istniejącego kodu.

Oto dwie typowe sytuacje, które tego wymagają: gdy akcje są zarządzane przez inny fragment kodu, na przykład w wielowątkowości z pulą wątków, lub gdy akcja musi zostać wykonana na wybranym zdarzeniu (często używana w javascript dla interfejsu użytkownika).


Czy dobrze cię zrozumiałem? Są pewne „ręczne zamknięcia” (nie tak naprawdę zamknięcia, ale coś, co przypomina ich zachowanie) i są jakieś „PRAWDZIWE zamknięcia”?

Zamknięcie to umiejętność językowa. Niektóre języki nie mają takiej możliwości, więc zamykanie odbywa się ręcznie za pomocą narzędzi udostępnianych przez ten język. Mówienie, że są PRAWDĄ czy nie, nie jest bardzo interesującą debatą IMHO.
deadalnix

2
@gasan, zawsze możesz wyciągnąć zestaw i ręcznie wykonać dowolny wzór za pomocą zestawu instrukcji GOTO. Podobnie możesz ręcznie wykonać pętlę „for” za pomocą pętli „while” (w C ++). Bardziej zaawansowane, wyższe poziomy oferują ustandaryzowany sposób wykonywania typowych czynności.
Philip

6

Pewnego dnia zobaczyłem zabawny cytat, który brzmiał następująco: „klasy są danymi z funkcjami. Zamknięcia są funkcjami z danymi”.

Tak, to nadmierne uproszczenie, ale pomaga w zrozumieniu sprawy.


+1 Dobry sposób, aby zobaczyć, co to jest zamknięcie: D
deadalnix
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.