Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Анонимные методы. Какие дают преимущества?  [new]
Artem.1st
Member

Откуда:
Сообщений: 57
Уважаемые, delphi-гуру

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

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

function MakeAdder(y: Integer): TFuncOfInt;
begin
  Result := {start anonymous method} function(x: Integer) : Integer
  begin
    Result := x + y;
  end; {end anonymous method}
end;

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

Спасибо.
15 апр 19, 01:23    [21861823]     Ответить | Цитировать Сообщить модератору
 Re: Анонимные методы. Какие дают преимущества?  [new]
rgreat
Member

Откуда:
Сообщений: 4902
Простой пример:
List.Sort(function (A, B: TMyRec): boolean
          begin
            Result:=A.Name>B.Name;
          end)


Это проще и наглядней чем городить отдельную фунцию для сортировки в другом месте кода.
15 апр 19, 01:35    [21861828]     Ответить | Цитировать Сообщить модератору
 Re: Анонимные методы. Какие дают преимущества?  [new]
asutp2
Member

Откуда: Тюмень
Сообщений: 438
Еще пример - можно с минимальными усилиями выполнять асинхронные задачи:

    
  TThread.CreateAnonymousThread(
    procedure
    begin
      SendSms(ARecipient, AMessage);
    end
    ).Start;
15 апр 19, 08:39    [21861923]     Ответить | Цитировать Сообщить модератору
 Re: Анонимные методы. Какие дают преимущества?  [new]
Artem.1st
Member

Откуда:
Сообщений: 57
>> Это проще и наглядней

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

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

Ну, хорошо.
А какую еще выгоду дают Анонимные методы, в сравнении с процедурными типами?
15 апр 19, 08:46    [21861928]     Ответить | Цитировать Сообщить модератору
 Re: Анонимные методы. Какие дают преимущества?  [new]
Artem.1st
Member

Откуда:
Сообщений: 57
Классический вариант такой:

   function  MySortFunc
   procedure MySmsProc;
   ...
   List.Sort(MySortFunc);
   TThread.CreateAnonymousThread(MySmsProc).Start;


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

  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, заранее извините,
я специально чучь-чуть "провоцирую", но честно хочу осознать эту "наглядность"
15 апр 19, 08:54    [21861937]     Ответить | Цитировать Сообщить модератору
 Re: Анонимные методы. Какие дают преимущества?  [new]
Beltar
Member

Откуда:
Сообщений: 193
Судя по инфе от сотрудников самой Аброкадабры, практически не используются. Причина очевидна, выглядят они хорошо только для предельно короткого кода. Дополняется наличием вложенных функций, позволяющих внятно оформить код тут же рядом.

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

Среди меня, например, практически не получила распространения конструкция for each, хотя при использовании с датасетами она исключает частую ошибку с забыванием Next.
15 апр 19, 09:02    [21861942]     Ответить | Цитировать Сообщить модератору
 Re: Анонимные методы. Какие дают преимущества?  [new]
asutp2
Member

Откуда: Тюмень
Сообщений: 438
Artem.1st,

обрати внимание - в моем случае используется вызов метода SendSms. Он больше, чем одна строчка кода :-)
15 апр 19, 09:12    [21861946]     Ответить | Цитировать Сообщить модератору
 Re: Анонимные методы. Какие дают преимущества?  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3154
Artem.1st,

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

 Parallel.ForI(TempLow, TempHigh,
  procedure (i1, i2, tdi: integer)
  var
   i: integer;
  begin
   for i := i1 to i2 do
    EnsureSliceOpened(i, True);
  end,
  pfInterleaved);

Так же удобно использовать при обустройстве слоёв приложения. Когда нужно развязать какие-то модули между собой. Пример кину.
15 апр 19, 09:22    [21861950]     Ответить | Цитировать Сообщить модератору
 Re: Анонимные методы. Какие дают преимущества?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1353
Artem.1st
Про наглядность ...

Pascal-style и наглядность не совместимы.. Вот если бы они ввели маркер => как это делается в других языках..
List.Sort(a, b => Result := a.Name>b.Name)


List.Sort(a, b: Int32 => Result := a.Name > b.Name)


TThread.CreateAnonymousThread( () => SendSms(ARecipient, AMessage)).Start;
15 апр 19, 09:28    [21861958]     Ответить | Цитировать Сообщить модератору
 Re: Анонимные методы. Какие дают преимущества?  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3154
Пример. Заполнение списка в гуе из библиотеки. Библиотека не должна ничего знать про верхние слои (например - гуй) но должна быть способна с ними работать.

Часть кода библиотеки:
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;
Гуй:
procedure TSaveAsOptionsForm.FormCreate(Sender: TObject);
begin
 FillTransferSytax(procedure (const s: string)
  begin
   SpTBXComboBox1.AddItem(s, nil);
  end);
end;
Анонимный тип:
TNotifyStrReferProc    = reference to procedure (const s: string);
15 апр 19, 09:30    [21861964]     Ответить | Цитировать Сообщить модератору
 Re: Анонимные методы. Какие дают преимущества?  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3154
X-Cite,

и что здесь что? я до сих пор в этих птичьих знаках без понятия :)
15 апр 19, 09:31    [21861967]     Ответить | Цитировать Сообщить модератору
 Re: Анонимные методы. Какие дают преимущества?  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3154
X-Cite,

"()" это процедура или функция? она может что-то вернуть? судя по плюсам это скорее функция. как такую функцию(процедуру?) описать и передать куда-то? ну это первое, что вот сразу вижу.
15 апр 19, 09:47    [21861984]     Ответить | Цитировать Сообщить модератору
 Re: Анонимные методы. Какие дают преимущества?  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3154
Artem.1st,

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

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

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;


Дальше, в зависимости от надобности, вызываем поиск с разными компараторами:
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);
Можно без дополнительных ссылок, можно как у меня.
15 апр 19, 09:53    [21861989]     Ответить | Цитировать Сообщить модератору
 Re: Анонимные методы. Какие дают преимущества?  [new]
Beltar
Member

Откуда:
Сообщений: 193
В чем выразилась анонимность типа TNotifyStrReferProc?

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

И да, выглядит омерзительно.
15 апр 19, 09:59    [21861995]     Ответить | Цитировать Сообщить модератору
 Re: Анонимные методы. Какие дают преимущества?  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3442
Artem.1st
А какую еще выгоду дают Анонимные методы ?

Самое главное - это захват контекста (читай про замыкания). Можно местное почитать отсюда 17814553, и дальше, сколько осилишь :)
15 апр 19, 10:03    [21861999]     Ответить | Цитировать Сообщить модератору
 Re: Анонимные методы. Какие дают преимущества?  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3154
Beltar,

не там смотришь. анонимность не в TNotifyStrReferProc, а в переданной ему функции. выглядит отлично, использовать очень удобно. контекст захватывается, модули развязаны.
15 апр 19, 10:10    [21862017]     Ответить | Цитировать Сообщить модератору
 Re: Анонимные методы. Какие дают преимущества?  [new]
ёёёёё
Member

Откуда:
Сообщений: 101
Онанимные методы на самом деле процедуры...
15 апр 19, 10:15    [21862027]     Ответить | Цитировать Сообщить модератору
 Re: Анонимные методы. Какие дают преимущества?  [new]
RWolf
Member

Откуда: Казань
Сообщений: 424
Анонимные процедуры хорошо ложатся на паттерны Strategy/Visitor. Выгода здесь в том, что они избавляют от необходимости делать новый класс, придумывать ему имя, создавать экземпляр этого класса, следить за его временем жизни.
15 апр 19, 10:18    [21862034]     Ответить | Цитировать Сообщить модератору
 Re: Анонимные методы. Какие дают преимущества?  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3154
К слову - кому интересны паттерны в Delphi, можно глянуть свежую книгу Primož Gabrijelčič'а "Hands-On Design Patterns with Delphi" Build applications using idiomatic, extensible, and concurrent design patterns in Delphi. Ищите в интернетах, либо заходите в телеграмм-канал, там можно скачать.
15 апр 19, 10:28    [21862061]     Ответить | Цитировать Сообщить модератору
 Re: Анонимные методы. Какие дают преимущества?  [new]
Artem.1st
Member

Откуда:
Сообщений: 57
makhaon
Artem.1st,
у себя постоянно (1) распараллеливание вычислений:
Так же удобно использовать при (2) обустройстве слоёв приложения. Когда нужно (3) развязать какие-то модули между собой.

makhaon , спасибо что ответили.
см. 1, 2, 3, Вы пишите о серьезных прикладных задачах. Это то, что меня интересует.
Вопрос: Зачем в серьезных задачах, Вы пользуетесь не обычным Процедурным типом, а новым Анонимным методом?

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

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


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


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

Так что это?
15 апр 19, 10:32    [21862069]     Ответить | Цитировать Сообщить модератору
 Re: Анонимные методы. Какие дают преимущества?  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3154
Artem.1st,

преимущество сказали: захват контекста.
15 апр 19, 10:34    [21862072]     Ответить | Цитировать Сообщить модератору
 Re: Анонимные методы. Какие дают преимущества?  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3154
Artem.1st,

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


в обычном варианте нет доступа к экземпляру класса, это только локальная процедура. в анонимном же варианте (как у меня все) есть доступ к экземпляру класса (к селфу), откуда идёт вызов:
EnsureSliceOpened - это метод класса, а не просто какая-то локальная процедура
SpTBXComboBox1.AddItem - это метод конкретного комбобокса, который в данный момент заполняем.
В компораторах доступны FSearchStr и NodeData, к которым в случае вызова обычной процедуры было бы сложнее достучаться.
15 апр 19, 10:40    [21862080]     Ответить | Цитировать Сообщить модератору
 Re: Анонимные методы. Какие дают преимущества?  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5193
        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);
15 апр 19, 10:48    [21862094]     Ответить | Цитировать Сообщить модератору
 Re: Анонимные методы. Какие дают преимущества?  [new]
vavan
Member

Откуда: Казань
Сообщений: 3252
X-Cite
маркер => как это делается в других языках
не во всех других такой маркер используетсяКартинка с другого сайта.
15 апр 19, 10:52    [21862102]     Ответить | Цитировать Сообщить модератору
 Re: Анонимные методы. Какие дают преимущества?  [new]
Artem.1st
Member

Откуда:
Сообщений: 57
Kazantsev Alexey
Самое главное - это захват контекста (читай про замыкания)

Большое спасибо за ссылку.
Буду изучать.

Пока плохо ориентируюсь в терминах: "Захват контекста" - это отдать область видимости наружу?
Если "Да" , то опять же обычный Процедурный Тип может быть вложенным(т.е. процедура внутри процедуры).
А значит "Захват контекста" можно делать и без Анонимных методов, при помощи обычного вложенного Процедурного Типа.
Так? Нет?
15 апр 19, 10:53    [21862106]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Delphi Ответить