metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2011-06-24 03:03 pm

Лямбды и Firebird, ад продолжается

А теперь, внимание, бородатая женщина будет есть червей мнение разработчика Firebird о лямбда-функциях:

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

[identity profile] osdm.livejournal.com 2011-06-27 01:43 pm (UTC)(link)
Дело столько не в том, что медленно, сколько в том, что неудобно. Конструкции получаются громоздкими (удвоение кавычек, переносы строк и прочая фигня). Переменные не в фильтре приходится явно биндить, а переменные в фильтре переводить в строку, рискуя получить injection vulnerability. Ошибки выявляются в runtime, а не в процессе компиляции и т.п.

Ну и со скоростью - это все хорошо, пока SQL вызывается десятки раз, а вот когда его приходится вызывать сотню тысяч раз за расчет, то тут операций к диску быть не должно (все сто раз будет закэшировано), и на парсинге тоже стоит поэкономить. Это в основном теория, на моей практике такие массовые SQL запросы (типа получения курсов валют) не требовали переменных фильтров, но у кого-то практика может отличаться.

[identity profile] volodymir-k.livejournal.com 2011-06-27 07:00 pm (UTC)(link)
> Переменные не в фильтре приходится явно биндить, а переменные в фильтре переводить в строку, рискуя получить injection vulnerability.

По-моему это невалидный аргумент, уже лет 20 как передаётся строка и массив объектов в любое API.

> Конструкции получаются громоздкими (удвоение кавычек, переносы строк и прочая фигня).

Да, во многих языках нету литералов, и некрасивенько.

> когда его приходится вызывать сотню тысяч раз за расчет... и на парсинге тоже стоит поэкономить

Как правило такое вычисление экономят на клиенте и не пересекают 10 слоев, а БД обычно делается сетевое с 50 мс задержкой.

А кто делает расчёты на T/PL-SQL на сервере...тот ценитель извращений.


А знаете, какая самая проблема передать лямбду? потому что будет хотеться передать с контекстом, и непредсказуемой сложности вычисление. А ведь одно дело -- условие where a < b и другое where factorial(x) < 12345678. То есть лямбду в общем случае не оптимизируешь, как условие.