powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Анонимные методы. Какие дают преимущества?
13 сообщений из 63, страница 3 из 3
Анонимные методы. Какие дают преимущества?
    #39801926
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonИли почему запрещено передавать проперти как переменные. Особенно те, которые без сеттеров.
Потому что свойство это абстракция. Сегодня у тебя сеттера нет, а завтра он есть.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801947
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

отлично. Будет сеттер - будет ошибка. Нет сеттера - нет ошибки. Известно, что без сеттера проперти трактуется как обычная переменная без какой-либо дополнительной обвязки.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801951
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и сеттер могли бы обвязать, что уж... Чай не бином Ньютона.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801959
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonИзвестно, что без сеттера проперти трактуется как обычная переменная без какой-либо дополнительной обвязки.
Известно, что свойство это абстракция усиливающая инкапсуляцию (сокрытие деталей реализации). Декларируя свойство, программист говорит компилятору, что это не переменная, не поле, а именно способ доступа к некотором данным.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801965
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BeltarавторПроцедурный Тип в Delphi применим только для автономных процедур(не для вложенных). Т.е. вложенные процедуры(компилятор называет “локальными”) не являются Процедурным Типом, и их нельзя использовать в качестве переменных или параметров.

Дык вот это само по себе странность. Причем странность неочевидная, если про нее не знать, как та же невозможность передать property в var параметр. И вообще непонятная. Если можно прямо в центре процедурки зафигачить другую процедурку, которая будет иметь точку входа и при этом еще и захватывать контекст, то что мешает сделать то же самое для вложенных функций, которые с точки зрения их пользователя есть то же самое, только записанное чуть в стороне?
Это странность тогда, когда рассматривают язык только с точки зрения синтаксиса, а не реализации, что часто очень удобно: представляшь, какой код должен получиться после компиляции, а из этого уже создаешь синтаксическую конструкцию, которая к этому приводит. Var и property - это синтаксический "сахар", без которого можно обойтись ( var - очень древний "сахар", property - чуть новее), поэтому если представить, что var - это просто адрес переменной, а property это вызов соотвествующих гетеров и сетеров, становится понятно, почему property нельзя передать как var параметр. С локальными процедурами аналогично - локальная процедура отличается от "независимой" процедуры именно указателем на контескт "родителя", она видима, только пока контекст родителя доступен, поэтому ее нельзя вернуть "наружу". Как реализованны анонимные процедуры с захватом контекста, я не изучал (пока) и с трудом представляю, т.к. (обычно) локальные переменные - это просто кусок стека, который при завершении процедуры освободится, а значит контекст должен быть где-то в другом месте, что должно приводить ко всяким проблемам со времени жизни этого контекста и пр. Написанное относится к обычным компилируемым реализациям, в которых нет RTTI: информация об именах переменных и функций не попадает в результирующий код, однако необходимость удобной сериализации привела к некоторому сближению компилируемых и интерпретируемых концепций - появились published свойства и RTTI, соответсвенно. Дальше - больше, подозреваю, скоро появится еще и функция eval(SourceCode:string):TVariant, которая в runtime выполняет код :)
Сумбурно как-то получилось.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801971
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerВ Java Script без анонимных/стрелочных функций сейчас как без рук. Все фреймворки под них заточены. Смотрятся они в JS очень красиво (изящнее и читабельнее, чем в лямбды C# из-за динамической типизации).
Оффтоп, правда, но я вот никак не оценю плюшки стрелочных. На какой-то элементарщине в один оператор из примеров да, они дают большое сокращение. Но потом в реальном коде добавляется еще один оператор, а значит, и скобки, потом еще один, вынуждая делать тело функции многострочным, а потом вдруг и this понадобится... в итоге все сокращение выливается лишь в => вместо function. Учитывая лучшую воспринимаемость слова и автогенерацию кода средой, преимущество так себе.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801981
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Захват контекста + ручная реализация анонимки 21836708
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801986
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

если соблюдать принципы инкапсуляции, то я не могу создать переменную в public вообще. нет выбора: переменная или свойство, вот в чем проблема. да, можно нарушить инкапсуляционные принципы и вытянуть часть переменных наружу. но как-то так себе идея. ну да ладно. обсуждаем не это :)
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39802049
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2DmSerВ Java Script без анонимных/стрелочных функций сейчас как без рук. Все фреймворки под них заточены. Смотрятся они в JS очень красиво (изящнее и читабельнее, чем в лямбды C# из-за динамической типизации).
Оффтоп, правда, но я вот никак не оценю плюшки стрелочных. На какой-то элементарщине в один оператор из примеров да, они дают большое сокращение. Но потом в реальном коде добавляется еще один оператор, а значит, и скобки, потом еще один, вынуждая делать тело функции многострочным, а потом вдруг и this понадобится... в итоге все сокращение выливается лишь в => вместо function. Учитывая лучшую воспринимаемость слова и автогенерацию кода средой, преимущество так себе.

Посмотрите учебный курс ReactJS. Там стрелочные функции очень активно используются и очень наглядно смотрятся. Там, где строк много, можно объявить таким образом:
const MyFunc = function(a,b) {
......
}

либо так:
const MyFunc = (a, b) => ({})

Не обязательно стрелочную функцию объявлять по месту использования, можно раньше.
Если сравнивать с C# (сужу по статьям на том же Хабре), то там лямбды объявляются в основном (или всегда?) именно по месту использования (а раньше видимо и не получится, т.к. нужно заранее знать какие типы).
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39802099
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну к примеру самый яркий пример псевдокода (через стрелочные, чтобы нагляднее было)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
  var Item := 'Товар1';
  var Context := GetContext(blabla);
  var PriceStorage := TTask.Future<TPrice>( () => Result := Context.GetPriceStorage(Item));
  var PriceCache := TTask.Future<TPrice>( () => Result := Context.GetPriceCache(Item));
  var PriceApi := TTask.Future<TPrice>( () => Result := Context.GetPriceApi(Item));
  тут еще куча кода на получение нужных объектов и кое-какая логика. Пока она работает мы получаем из разных источников цены.
  var Prices := TPrices.Agregate([PriceStorage.Value, PriceCache.Value, PriceApi.Value]);
  Context.Send(Prices);
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39802108
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема того же TTask в том, что там Run принимает процедурный тип без аргументов
т.е. если есть какой-то метод без параметров, который хотим вызвать асинхронно - проблем нет
Если метод с параметрами, то уже его указать нельзя, т.к.
TTask.Run ожидает TProc
Приходится писать что-то вроде
Код: pascal
1.
2.
3.
4.
5.
6.
TTask.Run(
  procedure
  begin
    MyProc(Item);
  end
);


Как бы без анонимного метода не обойтись, т.к. сам класс ни про какой Item может не знать, если Item как входной параметр в текущем методе
Но, если к примеру применить карирование, то получим вполне красивый код
Код: pascal
1.
TTask.Run(Curry<string>(MyProc)(Item)());


Но к сожалению карирование на дженериках - работает не верно, контекст параметров захватывается некорректно. (Уже в QC)
А писать карирующую функцию под каждый метод со своими параметрами - нет смысла, проще анонимками разрулить.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39802178
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerПосмотрите учебный курс ReactJS. Там стрелочные функции очень активно используются и очень наглядно смотрятся. Там, где строк много, можно объявить таким образом:
const MyFunc = function(a,b) {
......
}

либо так:
const MyFunc = (a, b) => ({})

Посмотрел. О чем я и говорил - на мелкоте - дает выигрыш в краткости. И это не полноценный код, а обвязка интерфейса. А вот когда начинается что-то посерьезнее
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    const moves = history.map((step, move) => {
      const desc = move ?
        'Go to move #' + move :
        'Go to game start';
      return (
        <li>
          <button onClick={() => this.jumpTo(move)}>{desc}</button>
        </li>
      );
    });


особой разницы с
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    const moves = history.map(function(step, move) {
      const desc = move ?
        'Go to move #' + move :
        'Go to game start';
      return (
        <li>
          <button onClick={() => this.jumpTo(move)}>{desc}</button>
        </li>
      );
    });


нету. Второй вариант даже выигрывает в наглядности, т.к. слово function подсвечивается.
В Delphi за счет куда большей многословности краткая форма могла бы выиграть существенней, но едва ли на это пойдут - это не в стиле языка.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39810171
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже в php пошли на сахар в виде стрелочных функций...
Было
Код: php
1.
2.
3.
$result = array_filter($paths,  function ($v) use ($names) {
    return in_array($v, $names);
});


Стало
Код: php
1.
$result = array_filter($paths,  fn($v) => in_array($v, $names));
...
Рейтинг: 0 / 0
13 сообщений из 63, страница 3 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Анонимные методы. Какие дают преимущества?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]