|
|
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Уважаемые, delphi-гуру Кто-нибудь использует Анонимные методы ? Поделитесь опытом, какие у них преимущества в сравнении с процедурными типами? Вот, например: Анонимные методы можно объявлять, прямо в месте использования. Но, неужели кто-то этим пользуется? Код: pascal 1. 2. 3. 4. 5. 6. 7. А какую еще выгоду дают Анонимные методы ? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 01:23 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Простой пример: Код: pascal 1. 2. 3. 4. Это проще и наглядней чем городить отдельную фунцию для сортировки в другом месте кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 01:35 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Еще пример - можно с минимальными усилиями выполнять асинхронные задачи: Код: pascal 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 08:39 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
>> Это проще и наглядней rgreat, asutp2, спасибо, что откликнулись. Про наглядность ..., любой дотошный читатель :-) обратит внимание, что Ваши примеры(как и примеры в официальном Help) выглядят наглядно, если это функция из одной короткой строки . Ну, хорошо. А какую еще выгоду дают Анонимные методы, в сравнении с процедурными типами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 08:46 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Классический вариант такой: Код: pascal 1. 2. 3. 4. 5. А так стало наглядней ? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. rgreat, asutp2, заранее извините, я специально чучь-чуть "провоцирую", но честно хочу осознать эту "наглядность" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 08:54 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Судя по инфе от сотрудников самой Аброкадабры, практически не используются. Причина очевидна, выглядят они хорошо только для предельно короткого кода. Дополняется наличием вложенных функций, позволяющих внятно оформить код тут же рядом. А если люди что-то используют очень редко, то они будут забывать о самой наличии возможности, даже если иногда она работает. Так-то ведь даже у Label есть одно применение, где оно радикально уменьшает число строк кода, - мгновенный выход из вложенных циклов. Но я не думаю, что люди помнят об этом. Среди меня, например, практически не получила распространения конструкция for each, хотя при использовании с датасетами она исключает частую ошибку с забыванием Next. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 09:02 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Artem.1st, обрати внимание - в моем случае используется вызов метода SendSms. Он больше, чем одна строчка кода :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 09:12 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Artem.1st, у себя постоянно распараллеливание вычислений: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Так же удобно использовать при обустройстве слоёв приложения. Когда нужно развязать какие-то модули между собой. Пример кину. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 09:22 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Artem.1stПро наглядность ... Pascal-style и наглядность не совместимы.. Вот если бы они ввели маркер => как это делается в других языках.. Код: pascal 1. Код: pascal 1. Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 09:28 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Пример. Заполнение списка в гуе из библиотеки. Библиотека не должна ничего знать про верхние слои (например - гуй) но должна быть способна с ними работать. Часть кода библиотеки: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Гуй: Код: pascal 1. 2. 3. 4. 5. 6. 7. Анонимный тип: Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 09:30 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
X-Cite, и что здесь что? я до сих пор в этих птичьих знаках без понятия :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 09:31 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
X-Cite, "()" это процедура или функция? она может что-то вернуть? судя по плюсам это скорее функция. как такую функцию(процедуру?) описать и передать куда-то? ну это первое, что вот сразу вижу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 09:47 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Artem.1st, Поиск при помощи анонимной функции: Само тело поиска: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Дальше, в зависимости от надобности, вызываем поиск с разными компараторами: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Можно без дополнительных ссылок, можно как у меня. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 09:53 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
В чем выразилась анонимность типа TNotifyStrReferProc? Это просто расширенный функционал процедурных типов, когда вызываемый метод лениво нормально описывать. И да, выглядит омерзительно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 09:59 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Artem.1stА какую еще выгоду дают Анонимные методы ? Самое главное - это захват контекста (читай про замыкания). Можно местное почитать отсюда 17814553 , и дальше, сколько осилишь :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 10:03 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Beltar, не там смотришь. анонимность не в TNotifyStrReferProc, а в переданной ему функции. выглядит отлично, использовать очень удобно. контекст захватывается, модули развязаны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 10:10 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Онанимные методы на самом деле процедуры... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 10:15 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Анонимные процедуры хорошо ложатся на паттерны Strategy/Visitor. Выгода здесь в том, что они избавляют от необходимости делать новый класс, придумывать ему имя, создавать экземпляр этого класса, следить за его временем жизни. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 10:18 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
К слову - кому интересны паттерны в Delphi, можно глянуть свежую книгу Primož Gabrijelčič'а "Hands-On Design Patterns with Delphi" Build applications using idiomatic, extensible, and concurrent design patterns in Delphi. Ищите в интернетах, либо заходите в телеграмм-канал, там можно скачать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 10:28 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
makhaonArtem.1st, у себя постоянно (1) распараллеливание вычислений: Так же удобно использовать при (2) обустройстве слоёв приложения. Когда нужно (3) развязать какие-то модули между собой. makhaon , спасибо что ответили. см. 1, 2, 3, Вы пишите о серьезных прикладных задачах. Это то, что меня интересует. Вопрос: Зачем в серьезных задачах, Вы пользуетесь не обычным Процедурным типом, а новым Анонимным методом? Вот обычный вариант. Процедурный Тип: Код: pascal 1. 2. 3. 4. 5. 6. Вот новый вариант. Анонимный Метод. Это стало "наглядней" ? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Я искренне подозреваю, что у Анонимных Методов должно быть еще другое преимущество , т.к. их "наглядность" очень сомнительна... Так что это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 10:32 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Artem.1st, преимущество сказали: захват контекста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 10:34 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Artem.1st, авторВот обычный вариант. Процедурный Тип: в обычном варианте нет доступа к экземпляру класса, это только локальная процедура. в анонимном же варианте (как у меня все) есть доступ к экземпляру класса (к селфу), откуда идёт вызов: EnsureSliceOpened - это метод класса, а не просто какая-то локальная процедура SpTBXComboBox1.AddItem - это метод конкретного комбобокса, который в данный момент заполняем. В компораторах доступны FSearchStr и NodeData, к которым в случае вызова обычной процедуры было бы сложнее достучаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 10:40 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 10:48 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 10:52 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyСамое главное - это захват контекста (читай про замыкания) Большое спасибо за ссылку. Буду изучать. Пока плохо ориентируюсь в терминах: "Захват контекста" - это отдать область видимости наружу? Если "Да" , то опять же обычный Процедурный Тип может быть вложенным(т.е. процедура внутри процедуры). А значит "Захват контекста" можно делать и без Анонимных методов, при помощи обычного вложенного Процедурного Типа. Так? Нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 10:53 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Artem.1stу Анонимных Методов должно быть еще другое преимущество в некоторых оптимизирующих компайлерах их применение позволяет иногда сгенерить код оптимальнее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 10:54 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Artem.1stКлассический вариант такой: Код: pascal 1. 2. 3. 4. 5. А так стало наглядней ? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. rgreat, asutp2, заранее извините, я специально чучь-чуть "провоцирую", но честно хочу осознать эту "наглядность"Так - не стало. Но ты забыл реализацию неанонимных функций в код добавить. Если добавишь и правильно отформатируешь - наглядней будет именно анонимно. Ибо код функции сортировки будет лежать сразу перед взглядом а не где-то еще. Но это работает на коротких функциях и процедрурах. Более десятка строк это будет выглядеть слишком тяжеловесно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 11:06 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
X-CitePascal-style и наглядность X-Cite, спасибо, что участвуете в теме. Я помню, Вы хорошо разбираетесь в C++. Скажите, в C++ есть возможность описать функцию в любом месте кода, например, внутри цикла “for” ? Вот, в Delphi это стало возможно. Я искренне пытаюсь осознать какие дает преимущества ... :-/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 11:40 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Artem.1st, В си++ даже лямды появились :) Стандарт расширяется :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 11:45 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Artem.1stX-CitePascal-style и наглядность X-Cite, спасибо, что участвуете в теме. Я помню, Вы хорошо разбираетесь в C++. Скажите, в C++ есть возможность описать функцию в любом месте кода, например, внутри цикла “for” ? Вот, в Delphi это стало возможно. Я искренне пытаюсь осознать какие дает преимущества ... :-/ Вы меня с кем-то путаете... Я не разбираюсь в С++ Чтобы понять как работают замыкания и почему анонимные функции как нельзя лучше подходят для "Функций высшего порядка" https://habr.com/ru/post/244945 Например каррирование или мемоизация - очень мощные штуки, но к сожалению в delphi не работающие нормально... Я уже в QC запостил пару багов с захватом контекста.. Захват контекста нужен, чтобы в другие классы не передавать параметры, которые там не должны жить, т.к. каждый класс должен выполнять ровно одну задачу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 12:03 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Artem.1st...в C++ есть возможность описать функцию в любом месте кода, например, внутри цикла “for” ? ... Конечно, есть. Более того, в состав стандартной библиотеки включили специальные формы, основанные на лямбдах: https://ru.cppreference.com/w/cpp/algorithm/for_each Лябды в с++ в миллион раз мощнее того, что имеем в дельфи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 12:06 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Проблема реализации анонимных функций в Delphi заключается в том, что они реализованы через интерфейсы и не совместимы с реализацией в других языках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 12:07 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
ziv-2014, за это бы им следовала оторвать в руки, и всунуть их на место (в задний проход) . В c# к примеру анонимные функции легко запоминают переданные в них локальные значения, и при вызове сразу нескольких функций, с разными переменными будут давать разный результат, который был передан А в Delphi что????? Смех один. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 13:16 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Вот так более эстетичнее Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 13:31 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Artem.1st "Захват контекста" - это отдать область видимости наружу? Если "Да" , то опять же обычный Процедурный Тип может быть вложенным(т.е. процедура внутри процедуры). А значит "Захват контекста" можно делать и без Анонимных методов, при помощи обычного вложенного Процедурного Типа. Так? Нет? Нет. Процедурный Тип в Delphi применим только для автономных процедур(не для вложенных). Т.е. вложенные процедуры(компилятор называет “локальными”) не являются Процедурным Типом, и их нельзя использовать в качестве переменных или параметров. А вот новые Анонимные методы - это вариант вложенных процедур, которые совместимы с Процедурным Типом, и их можно присваивать и передать наружу(с Захваченным контекстом). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 13:38 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Foxpcziv-2014, за это бы им следовала оторвать в руки, и всунуть их на место (в задний проход) . В c# к примеру анонимные функции легко запоминают переданные в них локальные значения, и при вызове сразу нескольких функций, с разными переменными будут давать разный результат, который был передан А в Delphi что????? Смех один. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 14:01 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Массово использую анонимные методы. Например для исключения while not DS.Eof do DS.Next; End; и вообще практически везде, где требуются процедурные типы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 14:04 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
ааа, поторопился) конечно же, это не с++ билдер) но и не делфи. Foxpc , приведи пример на делфи, который будет работать некорректно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 14:06 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
asutp2ааа, поторопился) конечно же, это не с++ билдер) но и не делфи. Foxpc , приведи пример на делфи, который будет работать некорректно Это применимо к асинхронному выполнению, когда к примеру захват контекста в одной нити, а выполнение в другой. Сравните ниже. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 14:18 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Хотя в C# тоже самое... Захват контекста из другой нити работает также Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 14:58 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
X-CiteЗахват контекста из другой нити работает также А ява тут сругается, что переменная должна быть финализированной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 15:18 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Artem.1st, авторА значит "Захват контекста" можно делать и без Анонимных методов, при помощи обычного вложенного Процедурного Типа. Так? Нет? Я не знаю что ты называешь процедурным типом. Но вот так сделать нельзя:: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Компилятор выдаст ошибку (собственно - из-за отсутствия возможности захватить контекст). И вот что бы это стало возможным как раз анонимные функции и нужны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 18:25 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Использую редко. Но очень классно их использовать для всяких callback Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 19:23 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Метод как метод только без имени. Но если часто использовать паттерны Visitor, Dependency Injection, Control Inversion и тд, то: * меньше писать кода; * код не размазан по юниту а в месте его использования. PS: Все можно и на ASM написать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 20:56 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Кто-то выше сказал, что Эмба не использует анонимные методы. Все с точностью наоборот ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2019, 20:57 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
В Java Script без анонимных/стрелочных функций сейчас как без рук. Все фреймворки под них заточены. Смотрятся они в JS очень красиво (изящнее и читабельнее, чем в лямбды C# из-за динамической типизации). Зато в JS нет классов (есть только эмуляция за счёт сахара) и такой классной штуки как "function of object" (TMethod) в JS нету, что ведёт в постоянным извращениям типа bind. Я к тому, что в Delphi анонимные функции нужны куда реже, чем в других языках. Имхо, и слава богу. Такое ощущение, что некоторые, особенно молодые C# - программисты, начинают забывать (или не знают), как объявить поле класса без лямбд или как сделать обычный метод. Везде лямбды лепят. Это хорошо видно из статей на Хабре, посвящённых C#. В C# сделать анонимный метод с нормальным описанием параметров куда сложнее, чем вставить лямбду. Ведь там нет ключевого слово function / func / fn и т.п., поэтому приходится городить огород. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2019, 00:11 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Эмба у себя использует, они-то свой продукт лучше всех знают. Потом их спецы едут в народ, опрашивают его, узнают, что народ не очень понимает, зачем это всё надо, и очень расстраиваются. Ну кому понравится, когда старались, работали, а результат не ценят. авторПроцедурный Тип в Delphi применим только для автономных процедур(не для вложенных). Т.е. вложенные процедуры(компилятор называет “локальными”) не являются Процедурным Типом, и их нельзя использовать в качестве переменных или параметров. Дык вот это само по себе странность. Причем странность неочевидная, если про нее не знать, как та же невозможность передать property в var параметр. И вообще непонятная. Если можно прямо в центре процедурки зафигачить другую процедурку, которая будет иметь точку входа и при этом еще и захватывать контекст, то что мешает сделать то же самое для вложенных функций, которые с точки зрения их пользователя есть то же самое, только записанное чуть в стороне? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2019, 09:14 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Beltar, Совместимость с легаси ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2019, 09:20 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Мы тоже у себя всё чаще используем. Ибо иногда удобнее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2019, 09:41 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
X-Cite, С одной стороны бесспорно то, что Делфи всегда был хорош обратной совместимостью. И до 90% кода еще первых версий соберется либо сразу (если изначально был хорошо написан - то скорее всего и соберется) либо с минимальными правками. Для долгоиграющих проектов отличный язык. Для сравнения путь Гугл: постоянно ломается совместимость, а потом программеры плачут: https://habr.com/ru/post/446346/ С другой, я сам слабо понимаю, какая совместимость может сломаться если локальные процедуры будет разрешено передавать как процедурный тип (если, конечно, подходят параметры). Или почему запрещено передавать проперти как переменные. Особенно те, которые без сеттеров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2019, 10:21 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
makhaonИли почему запрещено передавать проперти как переменные. Особенно те, которые без сеттеров. Потому что свойство это абстракция. Сегодня у тебя сеттера нет, а завтра он есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2019, 10:31 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, отлично. Будет сеттер - будет ошибка. Нет сеттера - нет ошибки. Известно, что без сеттера проперти трактуется как обычная переменная без какой-либо дополнительной обвязки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2019, 10:50 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Да и сеттер могли бы обвязать, что уж... Чай не бином Ньютона. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2019, 10:51 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
makhaonИзвестно, что без сеттера проперти трактуется как обычная переменная без какой-либо дополнительной обвязки. Известно, что свойство это абстракция усиливающая инкапсуляцию (сокрытие деталей реализации). Декларируя свойство, программист говорит компилятору, что это не переменная, не поле, а именно способ доступа к некотором данным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2019, 11:02 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
BeltarавторПроцедурный Тип в Delphi применим только для автономных процедур(не для вложенных). Т.е. вложенные процедуры(компилятор называет “локальными”) не являются Процедурным Типом, и их нельзя использовать в качестве переменных или параметров. Дык вот это само по себе странность. Причем странность неочевидная, если про нее не знать, как та же невозможность передать property в var параметр. И вообще непонятная. Если можно прямо в центре процедурки зафигачить другую процедурку, которая будет иметь точку входа и при этом еще и захватывать контекст, то что мешает сделать то же самое для вложенных функций, которые с точки зрения их пользователя есть то же самое, только записанное чуть в стороне? Это странность тогда, когда рассматривают язык только с точки зрения синтаксиса, а не реализации, что часто очень удобно: представляшь, какой код должен получиться после компиляции, а из этого уже создаешь синтаксическую конструкцию, которая к этому приводит. Var и property - это синтаксический "сахар", без которого можно обойтись ( var - очень древний "сахар", property - чуть новее), поэтому если представить, что var - это просто адрес переменной, а property это вызов соотвествующих гетеров и сетеров, становится понятно, почему property нельзя передать как var параметр. С локальными процедурами аналогично - локальная процедура отличается от "независимой" процедуры именно указателем на контескт "родителя", она видима, только пока контекст родителя доступен, поэтому ее нельзя вернуть "наружу". Как реализованны анонимные процедуры с захватом контекста, я не изучал (пока) и с трудом представляю, т.к. (обычно) локальные переменные - это просто кусок стека, который при завершении процедуры освободится, а значит контекст должен быть где-то в другом месте, что должно приводить ко всяким проблемам со времени жизни этого контекста и пр. Написанное относится к обычным компилируемым реализациям, в которых нет RTTI: информация об именах переменных и функций не попадает в результирующий код, однако необходимость удобной сериализации привела к некоторому сближению компилируемых и интерпретируемых концепций - появились published свойства и RTTI, соответсвенно. Дальше - больше, подозреваю, скоро появится еще и функция eval(SourceCode:string):TVariant, которая в runtime выполняет код :) Сумбурно как-то получилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2019, 11:05 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
DmSerВ Java Script без анонимных/стрелочных функций сейчас как без рук. Все фреймворки под них заточены. Смотрятся они в JS очень красиво (изящнее и читабельнее, чем в лямбды C# из-за динамической типизации). Оффтоп, правда, но я вот никак не оценю плюшки стрелочных. На какой-то элементарщине в один оператор из примеров да, они дают большое сокращение. Но потом в реальном коде добавляется еще один оператор, а значит, и скобки, потом еще один, вынуждая делать тело функции многострочным, а потом вдруг и this понадобится... в итоге все сокращение выливается лишь в => вместо function. Учитывая лучшую воспринимаемость слова и автогенерацию кода средой, преимущество так себе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2019, 11:07 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Захват контекста + ручная реализация анонимки 21836708 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2019, 11:22 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, если соблюдать принципы инкапсуляции, то я не могу создать переменную в public вообще. нет выбора: переменная или свойство, вот в чем проблема. да, можно нарушить инкапсуляционные принципы и вытянуть часть переменных наружу. но как-то так себе идея. ну да ладно. обсуждаем не это :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2019, 11:28 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Василий 2DmSerВ Java Script без анонимных/стрелочных функций сейчас как без рук. Все фреймворки под них заточены. Смотрятся они в JS очень красиво (изящнее и читабельнее, чем в лямбды C# из-за динамической типизации). Оффтоп, правда, но я вот никак не оценю плюшки стрелочных. На какой-то элементарщине в один оператор из примеров да, они дают большое сокращение. Но потом в реальном коде добавляется еще один оператор, а значит, и скобки, потом еще один, вынуждая делать тело функции многострочным, а потом вдруг и this понадобится... в итоге все сокращение выливается лишь в => вместо function. Учитывая лучшую воспринимаемость слова и автогенерацию кода средой, преимущество так себе. Посмотрите учебный курс ReactJS. Там стрелочные функции очень активно используются и очень наглядно смотрятся. Там, где строк много, можно объявить таким образом: const MyFunc = function(a,b) { ...... } либо так: const MyFunc = (a, b) => ({}) Не обязательно стрелочную функцию объявлять по месту использования, можно раньше. Если сравнивать с C# (сужу по статьям на том же Хабре), то там лямбды объявляются в основном (или всегда?) именно по месту использования (а раньше видимо и не получится, т.к. нужно заранее знать какие типы). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2019, 12:52 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Ну к примеру самый яркий пример псевдокода (через стрелочные, чтобы нагляднее было) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2019, 13:29 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Проблема того же TTask в том, что там Run принимает процедурный тип без аргументов т.е. если есть какой-то метод без параметров, который хотим вызвать асинхронно - проблем нет Если метод с параметрами, то уже его указать нельзя, т.к. TTask.Run ожидает TProc Приходится писать что-то вроде Код: pascal 1. 2. 3. 4. 5. 6. Как бы без анонимного метода не обойтись, т.к. сам класс ни про какой Item может не знать, если Item как входной параметр в текущем методе Но, если к примеру применить карирование, то получим вполне красивый код Код: pascal 1. Но к сожалению карирование на дженериках - работает не верно, контекст параметров захватывается некорректно. (Уже в QC) А писать карирующую функцию под каждый метод со своими параметрами - нет смысла, проще анонимками разрулить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2019, 13:41 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
DmSerПосмотрите учебный курс ReactJS. Там стрелочные функции очень активно используются и очень наглядно смотрятся. Там, где строк много, можно объявить таким образом: const MyFunc = function(a,b) { ...... } либо так: const MyFunc = (a, b) => ({}) Посмотрел. О чем я и говорил - на мелкоте - дает выигрыш в краткости. И это не полноценный код, а обвязка интерфейса. А вот когда начинается что-то посерьезнее Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. особой разницы с Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. нету. Второй вариант даже выигрывает в наглядности, т.к. слово function подсвечивается. В Delphi за счет куда большей многословности краткая форма могла бы выиграть существенней, но едва ли на это пойдут - это не в стиле языка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2019, 14:40 |
|
||
|
Анонимные методы. Какие дают преимущества?
|
|||
|---|---|---|---|
|
#18+
Даже в php пошли на сахар в виде стрелочных функций... Было Код: php 1. 2. 3. Стало Код: php 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2019, 13:23 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2039515]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
157ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
112ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 520ms |

| 0 / 0 |
