Чому так багато шумів про закриття? [зачинено]


9

Чому так багато шумів щодо закриттів серед розробників? У своїй кар’єрі я ніколи навмисно не використовував їх, хоча чітко не розумію, що вони є.

UPD: просто для уточнення. Питання полягає в тому, чому в цей час концепція закриття стала такою розмовною.


3
Як би ви могли навмисно використовувати щось, чого ви не знаєте, що це? Тож по суті, слід спочатку запитати (або скоріше шукати), що таке закриття.
Стівен Євріс

1
Ви читали статтю у Вікіпедії? Що ви про це не зрозуміли?
кевін клайн

2
На чому базується ваша кар’єра?

4
Що це за питання? Що за "кайф"? Чого ти не розумієш? Чому ти не поставив це питання замість цього?
Aaronaught

4
На захист ОП закриття є давньою концепцією, але лише нещодавно про них говорили про місто, так би мовити. І концепція насправді дуже проста для тих, хто навчився трохи більше математики, я також не можу зрозуміти, чому люди говорять про них так, ніби вони щось дуже важко зрозуміти. Можливо, це просто спосіб зробити себе виглядати розумнішими: "дивись, я заграю закриття, які так важко стоїть, так я гойдаюся"
Quant_dev

Відповіді:


22

Закриття - це код, який запам’ятовує світ, звідки він з’явився, поки ще є корисним для того, куди його привезли.

Прикладом є визначення анонімної функції на Java, яка знає, що вона знаходиться у YourObject і може маніпулювати її методами та функціями. Потім ця функція передається, наприклад, Swing, де вона заглиблюється всередину, наприклад, слухача, але все ж має рятувальний круг до своїх коренів.

Це дуже потужна концепція, оскільки дозволяє доставити код, який - невідомий коду, використовуючи його - може повернутися до інших частин коду.


1
Так. Це спосіб ввести не тільки процедуру, але й стан, в інший код. Це дозволяє забезпечити дуже високу ступінь гнучкості в розробці алгоритмів; Ви можете розробити шаблонні методи, які залежать від стану підпрограм, про які він може навіть не знати під час компіляції. Мінус полягає в тому, що посилання на вихідне джерело цього методу, а отже, стан, може бути розірвано, не використовуючи споживчого методу; коли це станеться, ви отримаєте важко знайти помилки виконання.
KeithS

1
Ха-ха, анонімна функція на Java ... Смішно.
конфігуратор

1
@configurator, не смішно, факт.


java 7 не має закриття.

6

Закриття - це щось, що дозволяє вирішити різноманітні проблеми елегантним чином. Власне, в мовах програмування, де немає закриттів, створюються методи для реалізації подібних функцій.

Подумайте лише про функторів на C ++ або Runnables на Java. Вони просто методи, які дозволяють функціонувати аналогічно закриттю. Якесь «ручне закриття».

Закриття стають все більш популярними, оскільки вони інтегровані в популярні мови: Javascript зростає завдяки онлайн-програмам (наприклад, google doc), C # реалізує його, PHP впроваджує його з 5.3 та ін.

Тепер, коли закриття доступні у все більшій кількості технологій, стає зовсім очевидним, що все більше людей цікавляться ними.

Отже, що таке закриття? Це досить просто. Закриття - це функція та контекст для її виконання в межах. Цим маніпулюється як об’єкт. Чому це корисно? Це корисно для підключення власного коду до існуючого коду.

Ось дві поширені ситуації, які вимагають цього: коли діями керується інший фрагмент коду, як, наприклад, у багатопотоковому читанні з пулом потоків, або коли дія повинна бути виконана на обраній події (часто використовується в javascript для інтерфейсу користувача).


Я чітко тебе зрозумів? Чи є якісь «ручні закриття» (насправді не закриття, а щось, що нагадує їх поведінку) і є якісь «ПРАВИЛЬНІ закриття»?

Закриття - це можливість мови. Деяка мова не має такої можливості, тому ви робите закриття вручну, використовуючи інструменти, які надає вам мова. Сказати, що вони ПРАВИЛЬНІ чи ні, це не дуже цікава дискусія IMHO.
deadalnix

2
@gasan, ви завжди можете виконати збірку та вручну виконати будь-яку схему, яку ви хочете, за допомогою групи операторів GOTO. Аналогічно, ви можете вручну виконати цикл "for" з циклом "while" (в C ++). Більш просунуті, вищі рівні пропонують стандартизований спосіб робити звичайні речі.
Філіп

6

Днями я побачив кумедну цитату, це було за рядками "класи - це дані з функціями. Закриття - це функції з даними".

Так, це надмірне спрощення, але це допомагає зрозуміти точку.


+1 Хороший спосіб дізнатися, що таке закриття: D
deadalnix
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.