Почему так много шума по поводу закрытий? [закрыто]


9

Почему среди разработчиков так много шума по поводу замыканий? В своей карьере я никогда не использовал их преднамеренно, хотя не совсем понимаю, что это такое.

UPD: просто чтобы уточнить. Вопрос в том, почему концепция закрытия стала настолько разговорчивой в эти дни.


3
Как бы вы могли намеренно использовать то, что вы не знаете, что это такое? Таким образом, в основном вы должны сначала спросить (или скорее искать), что такое замыкания.
Стивен Джеурис

1
Вы читали статью в Википедии? Что вы не поняли по этому поводу?
Кевин Клайн

2
На чем основана ваша карьера?

4
Что это за вопрос? Что за "кайф"? Что ты не понимаешь? Почему вы не задали этот вопрос?
Ааронаут

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 для пользовательского интерфейса).


Я ясно тебя понял? Есть некоторые «ручные замыкания» (на самом деле не замыкания, но что-то, что напоминает их поведение), и есть ли «ИСТИННЫЕ замыкания»?

Закрытие является языковой способностью. Некоторые языки не имеют такой возможности, поэтому вам нужно выполнить закрытие вручную, используя инструменты, которые предоставляет вам язык. Сказать, что они ИСТИНА или нет, не очень интересная дискуссия ИМХО.
Deadalnix

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

6

На днях я увидел забавную цитату, в которой говорилось: «классы - это данные с функциями. Замыкания - это функции с данными».

Да, это упрощение, но оно помогает понять суть.


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