ПО, ЭВМ и АСУ из Таможенного Союза

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Замыкания

Сообщений 1 страница 3 из 3

1

Замыкание, Википедия

Замыкание, Викиучебник

лямбда-функция представляют собой объект класса Closure

В C++14 в момент создания объекта со значениями переменных, можно указать, что и как захватывать (по ссылке или по значению). Был бы это Паскаль со вложенными функциями, тогда было бы понятно, откуда замыкание взялось - это формализация, возникшая в процессе обработки языка. А зачем замыкание использовать просто так - неясно. Ну лямбды анонимные, и чего? В чём профит-то? Примеры из туториала MS про лямбды не вдохновили.

Мне не хватает в описании википедии примеров, где этот приём "захвата контекста" бы помогал.
Как и для чего его можно массивно использовать? Вот чтобы это было основой реализации прикладной программы.
Ощущение, как будто фантастический сериал читаю: "сейчас он выстрелит тахионом и создатся пространственно-временной пузырь вокруг цели".

Сложность языка возрастает (то есть количество концепций для изучения, а значит и время изучения возрастает), а экономия при практическом использовании не расписана.

К тому же не просто вводит новую концепцию, а создаёт слова - омонимы (одинаково пишутся, но разное означают)
https://www.linux.org.ru/forum/development/9435136
замыкание в математике —  https://en.wikipedia.org/wiki/Closure_(mathematics).
замыкание в программировании — https://en.wikipedia.org/wiki/Closure_( … r_science).

Омонимия ведёт к путанице.

"Введение в PHP 5.3 замыканий — одно из главных его новшеств"

Они повсюду, Карл!

"Не совсем понятно применение такого функционала в разработке web-приложений."
вот-вот.

"использование лямбд с замыканиями в качестве функций обратного вызова (callbacks)"
эээ, делегаты и события есть, для них не нужен захват

"накладные расходы на большое количество вызовов функций дают ощутимый спад в производительности, чего и следовало ожидать."
ну тем более.

"хорошее применение замыканий — создание функций, в свою очередь тоже создающих функции"
эээ... я и через рефлекшен так могу... и не только функции, но и процедуры

"Многие из примеров выглядят натянуто. Сколько лет жили без них — и ничего."
"замыкания усложняют отладку и поддержку кода. А если неаккуратно ними пользоваться, то может еще и память течь. "
вот-вот.

"Главное использовать их с умом и только тем, где это действительно удобно и нужно, а не потому что «это круто, модно, современно»."
это например как?

Отредактировано Лис (2017-03-27 13:18:23)

0

2

https://habrahabr.ru/post/147620/

Возможные случаи использования:

1. Порционный итератор (получает абстрактный загрузчик данных, передает ему границы порции и получает в ответ данные)
2. Репозиторий сущностей, который не хранит состояние и его метод для получения данных, который требует множество параметров, кроме возможных границ порции.
3. Сервис, который использует доступ к репозиторию с помощью порционного итератора, который тоже не хранит состояние

Замыкания — элегантный способ делать Dependancy Injection (???)

Предположим, у вас есть некий интерфейс (скажем той же callback функции), который вы менять не хотите или не можете.
Но вам в каком-то месте потребовалось сделать функцию с этим интерфейсом, которой нужно зачем-то лезть в базу данных.
Откуда эта функция возьмет объект соединения с БД?

Примечательно, то что ЯП автоматом освождает переменную, как только более не окажется ссылок на нее если все функции завершились и не передали ссылку на эту переменную в другие функции. В итоге один раз написанный код с использованием замыканий при многократном вызове создаст множество копий/выделений области ОЗУ переменных. Изменения значений переменных никак не повлияют на «соседние», в отличие от глобальной переменной.
Образно можно сказать, что замыкание это инкапсуляция переменной в функцию. Как дойдешь до каррирования поймешь в чем прелесть.

эээ...

http://swizard.livejournal.com/124189.html

в лучшем случае припомнят что-то типа map и fold.
...
в некоторых задачах гораздо удобней привычного полиморфизма в ООП

- Мы не спрограммировали практически ни строчки мусорного boilerplate-кода. Почти каждый символ по делу.
- Весь алгоритм находится строго в одном месте и сразу виден глазами. Не размазан по проекту.
- Алгоритм абстрактный настолько, насколько это возможно. Реюзабельность на высоте -- нет никаких левых зависимостей.

для достижения подобной гибкости стандартный "индустриальный" программист для этой задачи выберет какое-нибудь монструозное и оверинжиниринг решение, навроде Inversion-Of-Control.

чем inversion of control сильно более монструозен, чем HOF? Имхо только самим используемым языком ;)

Тем, что надо писать кучу мусора :) Сначала всяческие соглашения по интерфейсу, потом всяческий клей для разрыва зависимостей (различные там xml-конфиги и прочее ). Это совершенно отдельная и очень даже ненулевая работа :)

Отредактировано Лис (2017-03-27 13:17:56)

0

3

Я бы скорее использовал слово "пузырь". Или "пространственный карман" (dimensional bubble из singularity).
В момент создания анонимной функции к ней добавляется пространственный карман, куда складываются нужные вещи.

Класс у нас тоже как бы мешок с вещами. Однако у класса имя есть, а у замыкания имени нет.

То есть, к безымянным функциям (лямбдам) мы добавли безымянные классы, причем создание объектов этих классов происходит без специального ключевого слова (аналогичного слову new в C++ или malloc в C).

Как можно объяснять другим людям то (как работает то), что не имеет имён?

Однако против второго закона термодинамики не попрёшь. Нужно больше хаоса!
Нельзя сопротивляться объективной тенденции. Тенденция заключается в том, что этот механизм добавляют во все языки программирования и миллионы людей по всей планете изучают эти концепции. Те кто освоил - они становятся на сторону порядка. Те, кто не освоил - остаются со стороны хаоса.

То, что лично мне не очевидно, почему всё анонимное выгодно, ничего не говорит о правильности или неправильности увеличения анонимности в языках.
В естественных языках тоже много разных умолчаний. Местоимения как ключевые слова.

Домовые и барабашки как анонимные концепции в Кумире.

"Анонимные типы — очень приятное расширение C#, появившееся в версии 3.0. С помощью анонимных типов мы можем налету создать объект-хранилище и наполнить его данными."

Код:
var o = new {Bar=2, Foo="string"};

Отредактировано Лис (2017-03-27 15:21:15)

0