Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Анонимные методы. Какие дают преимущества? / 25 сообщений из 63, страница 1 из 3
15.04.2019, 01:23
    #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
15.04.2019, 01:35
    #39801180
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимные методы. Какие дают преимущества?
Простой пример:
Код: pascal
1.
2.
3.
4.
List.Sort(function (A, B: TMyRec): boolean
          begin
            Result:=A.Name>B.Name;
          end)



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

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

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

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

Ну, хорошо.
А какую еще выгоду дают Анонимные методы, в сравнении с процедурными типами?
...
Рейтинг: 0 / 0
15.04.2019, 08:54
    #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
15.04.2019, 09:02
    #39801250
Beltar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимные методы. Какие дают преимущества?
Судя по инфе от сотрудников самой Аброкадабры, практически не используются. Причина очевидна, выглядят они хорошо только для предельно короткого кода. Дополняется наличием вложенных функций, позволяющих внятно оформить код тут же рядом.

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

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

обрати внимание - в моем случае используется вызов метода SendSms. Он больше, чем одна строчка кода :-)
...
Рейтинг: 0 / 0
15.04.2019, 09:22
    #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
15.04.2019, 09:28
    #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
15.04.2019, 09:30
    #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
15.04.2019, 09:31
    #39801267
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимные методы. Какие дают преимущества?
X-Cite,

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

"()" это процедура или функция? она может что-то вернуть? судя по плюсам это скорее функция. как такую функцию(процедуру?) описать и передать куда-то? ну это первое, что вот сразу вижу.
...
Рейтинг: 0 / 0
15.04.2019, 09:53
    #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
15.04.2019, 09:59
    #39801281
Beltar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимные методы. Какие дают преимущества?
В чем выразилась анонимность типа TNotifyStrReferProc?

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

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

не там смотришь. анонимность не в TNotifyStrReferProc, а в переданной ему функции. выглядит отлично, использовать очень удобно. контекст захватывается, модули развязаны.
...
Рейтинг: 0 / 0
15.04.2019, 10:15
    #39801299
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимные методы. Какие дают преимущества?
Онанимные методы на самом деле процедуры...
...
Рейтинг: 0 / 0
15.04.2019, 10:18
    #39801303
RWolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимные методы. Какие дают преимущества?
Анонимные процедуры хорошо ложатся на паттерны Strategy/Visitor. Выгода здесь в том, что они избавляют от необходимости делать новый класс, придумывать ему имя, создавать экземпляр этого класса, следить за его временем жизни.
...
Рейтинг: 0 / 0
15.04.2019, 10:28
    #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
15.04.2019, 10:32
    #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
15.04.2019, 10:34
    #39801315
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимные методы. Какие дают преимущества?
Artem.1st,

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

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

в обычном варианте нет доступа к экземпляру класса, это только локальная процедура. в анонимном же варианте (как у меня все) есть доступ к экземпляру класса (к селфу), откуда идёт вызов:
EnsureSliceOpened - это метод класса, а не просто какая-то локальная процедура
SpTBXComboBox1.AddItem - это метод конкретного комбобокса, который в данный момент заполняем.
В компораторах доступны FSearchStr и NodeData, к которым в случае вызова обычной процедуры было бы сложнее достучаться.
...
Рейтинг: 0 / 0
15.04.2019, 10:48
    #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
15.04.2019, 10:52
    #39801327
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимные методы. Какие дают преимущества?
X-Citeмаркер => как это делается в других языкахне во всех других такой маркер используется
...
Рейтинг: 0 / 0
15.04.2019, 10:53
    #39801330
Artem.1st
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анонимные методы. Какие дают преимущества?
Kazantsev AlexeyСамое главное - это захват контекста (читай про замыкания)
Большое спасибо за ссылку.
Буду изучать.

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


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