powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Анонимные методы. Какие дают преимущества?
25 сообщений из 63, страница 1 из 3
Анонимные методы. Какие дают преимущества?
    #39801179
Artem.1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые, delphi-гуру

Кто-нибудь использует Анонимные методы ?
Поделитесь опытом, какие у них преимущества в сравнении с процедурными типами?

Вот, например: Анонимные методы можно объявлять, прямо в месте использования. Но, неужели кто-то этим пользуется?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
function MakeAdder(y: Integer): TFuncOfInt;
begin
  Result := {start anonymous method} function(x: Integer) : Integer
  begin
    Result := x + y;
  end; {end anonymous method}
end;


А какую еще выгоду дают Анонимные методы ?

Спасибо.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801180
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простой пример:
Код: pascal
1.
2.
3.
4.
List.Sort(function (A, B: TMyRec): boolean
          begin
            Result:=A.Name>B.Name;
          end)



Это проще и наглядней чем городить отдельную фунцию для сортировки в другом месте кода.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801234
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще пример - можно с минимальными усилиями выполнять асинхронные задачи:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
    
  TThread.CreateAnonymousThread(
    procedure
    begin
      SendSms(ARecipient, AMessage);
    end
    ).Start;
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801238
Artem.1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> Это проще и наглядней

rgreat, asutp2,
спасибо, что откликнулись.

Про наглядность ..., любой дотошный читатель :-) обратит внимание, что Ваши примеры(как и примеры в официальном Help) выглядят наглядно, если это функция из одной короткой строки .

Ну, хорошо.
А какую еще выгоду дают Анонимные методы, в сравнении с процедурными типами?
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801246
Artem.1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Классический вариант такой:

Код: pascal
1.
2.
3.
4.
5.
   function  MySortFunc
   procedure MySmsProc;
   ...
   List.Sort(MySortFunc);
   TThread.CreateAnonymousThread(MySmsProc).Start;



А так стало наглядней ?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  List.Sort(function (A, B: TMyRec): boolean
          begin
            Result:=A.Name>B.Name;
          end)

  TThread.CreateAnonymousThread(
    procedure
    begin
      SendSms(ARecipient, AMessage);
    end
    ).Start;



rgreat, asutp2, заранее извините,
я специально чучь-чуть "провоцирую", но честно хочу осознать эту "наглядность"
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801250
Beltar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по инфе от сотрудников самой Аброкадабры, практически не используются. Причина очевидна, выглядят они хорошо только для предельно короткого кода. Дополняется наличием вложенных функций, позволяющих внятно оформить код тут же рядом.

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

Среди меня, например, практически не получила распространения конструкция for each, хотя при использовании с датасетами она исключает частую ошибку с забыванием Next.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801253
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1st,

обрати внимание - в моем случае используется вызов метода SendSms. Он больше, чем одна строчка кода :-)
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801255
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1st,

у себя постоянно распараллеливание вычислений:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
 Parallel.ForI(TempLow, TempHigh,
  procedure (i1, i2, tdi: integer)
  var
   i: integer;
  begin
   for i := i1 to i2 do
    EnsureSliceOpened(i, True);
  end,
  pfInterleaved);


Так же удобно использовать при обустройстве слоёв приложения. Когда нужно развязать какие-то модули между собой. Пример кину.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801261
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1stПро наглядность ...
Pascal-style и наглядность не совместимы.. Вот если бы они ввели маркер => как это делается в других языках..
Код: pascal
1.
List.Sort(a, b => Result := a.Name>b.Name)



Код: pascal
1.
List.Sort(a, b: Int32 => Result := a.Name > b.Name)



Код: pascal
1.
TThread.CreateAnonymousThread( () => SendSms(ARecipient, AMessage)).Start;
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801264
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример. Заполнение списка в гуе из библиотеки. Библиотека не должна ничего знать про верхние слои (например - гуй) но должна быть способна с ними работать.

Часть кода библиотеки:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure FillTransferSytax(OnTransferSyntaxFound: TNotifyStrReferProc);
var
 i: integer;
begin
 for i := 0 to DICOMDictonary.NUMBER_OF_DCMUIDS - 1 do
  if DICOMDictonary.DCMUIDDictonary[i].UIDType = utTRANSFERSYNTAX then
   OnTransferSyntaxFound(DICOMDictonary.DCMUIDDictonary[i].UIDName);
end;

Гуй:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TSaveAsOptionsForm.FormCreate(Sender: TObject);
begin
 FillTransferSytax(procedure (const s: string)
  begin
   SpTBXComboBox1.AddItem(s, nil);
  end);
end;

Анонимный тип:
Код: pascal
1.
TNotifyStrReferProc    = reference to procedure (const s: string);
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801267
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

и что здесь что? я до сих пор в этих птичьих знаках без понятия :)
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801274
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

"()" это процедура или функция? она может что-то вернуть? судя по плюсам это скорее функция. как такую функцию(процедуру?) описать и передать куда-то? ну это первое, что вот сразу вижу.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801279
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1st,

Поиск при помощи анонимной функции:

Само тело поиска:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
function TDICOMParserMainForm.DoSearch(Comparer: TSearchTree): boolean;
begin
 ...
 ...
 ...
 ...
 ...
  while Assigned(TempNode) do
  begin
   if (TObject(TempNode.Data) is TDICOMElement) and Comparer(TempNode) then
    Break;
   TempNode := TempNode.GetNext;
  end;
 ...
 ...
 ...
end;



Дальше, в зависимости от надобности, вызываем поиск с разными компараторами:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
type
 TSearchTree = reference to function (TreeNode: TTreeNode): boolean;

var
 Comparer: TSearchTree;

 Comparer :=
  function (TreeNode: TTreeNode): boolean
  begin
   Result := Pos(AnsiUpperCase(FSearchStr), AnsiUpperCase(TreeNode.Text)) <> 0;
  end;

 if not DoSearch(Comparer) then
  ShowNotFound(FSearchStr);
 ...
  Comparer :=
   function (TreeNode: TTreeNode): boolean
   begin
    Result := TreeNode.Data = NodeData;
   end;

  DoSearch(Comparer);

Можно без дополнительных ссылок, можно как у меня.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801281
Beltar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В чем выразилась анонимность типа TNotifyStrReferProc?

Это просто расширенный функционал процедурных типов, когда вызываемый метод лениво нормально описывать.

И да, выглядит омерзительно.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801285
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1stА какую еще выгоду дают Анонимные методы ?
Самое главное - это захват контекста (читай про замыкания). Можно местное почитать отсюда 17814553 , и дальше, сколько осилишь :)
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801293
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Beltar,

не там смотришь. анонимность не в TNotifyStrReferProc, а в переданной ему функции. выглядит отлично, использовать очень удобно. контекст захватывается, модули развязаны.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801299
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Онанимные методы на самом деле процедуры...
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801303
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анонимные процедуры хорошо ложатся на паттерны Strategy/Visitor. Выгода здесь в том, что они избавляют от необходимости делать новый класс, придумывать ему имя, создавать экземпляр этого класса, следить за его временем жизни.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801310
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К слову - кому интересны паттерны в Delphi, можно глянуть свежую книгу Primož Gabrijelčič'а "Hands-On Design Patterns with Delphi" Build applications using idiomatic, extensible, and concurrent design patterns in Delphi. Ищите в интернетах, либо заходите в телеграмм-канал, там можно скачать.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801313
Artem.1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonArtem.1st,
у себя постоянно (1) распараллеливание вычислений:
Так же удобно использовать при (2) обустройстве слоёв приложения. Когда нужно (3) развязать какие-то модули между собой.
makhaon , спасибо что ответили.
см. 1, 2, 3, Вы пишите о серьезных прикладных задачах. Это то, что меня интересует.
Вопрос: Зачем в серьезных задачах, Вы пользуетесь не обычным Процедурным типом, а новым Анонимным методом?

Вот обычный вариант. Процедурный Тип:
Код: pascal
1.
2.
3.
4.
5.
6.
procedure MyProc(i1, i2, tdi: integer);
begin
   ....
end,

Parallel.ForI(TempLow, TempHigh, MyProc, pfInterleaved);



Вот новый вариант. Анонимный Метод. Это стало "наглядней" ?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
 Parallel.ForI(TempLow, TempHigh,
  procedure (i1, i2, tdi: integer)
  var
   i: integer;
  begin
   for i := i1 to i2 do
    EnsureSliceOpened(i, True);
  end,
  pfInterleaved);



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

Так что это?
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801315
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1st,

преимущество сказали: захват контекста.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801317
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1st,

авторВот обычный вариант. Процедурный Тип:

в обычном варианте нет доступа к экземпляру класса, это только локальная процедура. в анонимном же варианте (как у меня все) есть доступ к экземпляру класса (к селфу), откуда идёт вызов:
EnsureSliceOpened - это метод класса, а не просто какая-то локальная процедура
SpTBXComboBox1.AddItem - это метод конкретного комбобокса, который в данный момент заполняем.
В компораторах доступны FSearchStr и NodeData, к которым в случае вызова обычной процедуры было бы сложнее достучаться.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801323
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
        Take(C).Plugin<TAQPControlAnimations>
          .BackgroundColorAnimation(clRed, 700, 76, TAQ.Ease(etCubic, emInOut))
          .Each(function(AQ: TAQ; O: TObject): Boolean
            begin
              TWinControl(C).SetFocus;
              Result := False
            end);
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801327
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Citeмаркер => как это делается в других языкахне во всех других такой маркер используется
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801330
Artem.1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyСамое главное - это захват контекста (читай про замыкания)
Большое спасибо за ссылку.
Буду изучать.

Пока плохо ориентируюсь в терминах: "Захват контекста" - это отдать область видимости наружу?
Если "Да" , то опять же обычный Процедурный Тип может быть вложенным(т.е. процедура внутри процедуры).
А значит "Захват контекста" можно делать и без Анонимных методов, при помощи обычного вложенного Процедурного Типа.
Так? Нет?
...
Рейтинг: 0 / 0
25 сообщений из 63, страница 1 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Анонимные методы. Какие дают преимущества?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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