AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Anonyme Methoden, Wann,warum, Vorteile
Thema durchsuchen
Ansicht
Themen-Optionen

Anonyme Methoden, Wann,warum, Vorteile

Ein Thema von Alex_ITA01 · begonnen am 29. Sep 2014 · letzter Beitrag vom 30. Sep 2014
Antwort Antwort
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#1

Anonyme Methoden, Wann,warum, Vorteile

  Alt 29. Sep 2014, 21:29
Hallo zusammen,
gesehen habe ich es schon öfters, hier auch wieder:
http://www.delphipraxis.net/1273831-post4.html

Ich wollte mal fragen, warum macht man sowas eigentlich bzw. wann und was ist der Vorteil?
Warum nicht einfach die Procedure oder Funktion wie gewohnt im privat oder public Teil deklarieren und aufrufen wie gewohnt?
Wenn ich diese Procedure/Funktion vielleicht noch an mehreren Stelle benötige, dann macht man sowas doch erst Recht nicht oder?

Vielleicht könnt ihr mir hierzu ja mal eure Meinung/Erfahrungen mitteilen.

Grüße
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#2

AW: Anonyme Methoden, Wann,warum, Vorteile

  Alt 29. Sep 2014, 21:50
Na ja, manchmal ist die kleine Methode so unwichtig, das man sie nicht benennen muss. Es bringt dann nicht notwendigerweise einen Mehrwert, sie 'extra' zu deklarieren.

Bezüglich einer Mehrfachverwendung hast Du natürlich Recht, aber auch hier ist -wegen der extremen Kürze (1 Zeile)- meist auch kein Mehrwert erkennbar, zumal die Lesbarkeit bei expliziter Deklaration nicht wesentlich erhöht wird. Allerdings fördert die Delphi-Syntax nicht gerade die Lesbarkeit. C# ist da mit seinen Lambda-Ausdrücken einfach besser.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#3

AW: Anonyme Methoden, Wann,warum, Vorteile

  Alt 29. Sep 2014, 22:53
Der wahre Wert Anonymer Methoden liegt in ihrer Fähigkeit, lokale Variablen des Scopes mitzunehmen, in denen sie (die Anonyme Methode) deklariert werden.

Wird eine Anonyme Methode mehrfach benötigt, kann man auch eine Funktion schreiben, die einfach diese Anonyme Methode zurückgibt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#4

AW: Anonyme Methoden, Wann,warum, Vorteile

  Alt 29. Sep 2014, 23:09
Man sollte das meistens sowieso nur für kurze Methoden verwenden
und wenn diese Methode auch nur an einer Stelle verwendet wird.

IMHO ist der Code so eventuell sogar besser lesbar, da der Code so direkt lesbar ist, als wenn man erst zu der Methode springen muß.
Delphi-Quellcode:
...
if Tasks.Count > 0 then begin
  Tasks[0].RunTask(OverViewF.cmdProgressBackground);
  Text := Log.GetLastRow;
end else
  Text := 'Nothing to do';
SpringeInHauptthread;
begin // man kann gern noch ein logisches begin/end einfügen ... muß man aber nicht
  if Text <> OverviewF.lblTaskBackground.Caption then
    Log.AddLog('Setting label to from "' + OverviewF.lblTaskBackground.Caption + '" to "' + Text + '"');
  OverviewF.lblTaskBackground.Caption := Text;
end;
SpringeZurückInDenEigentlichenThread;
...
Und grade bei der Synchronisierung ist hier der Vorzeil, daß man lokale Variablen, der übergeordneten Methode, direkt und sogar treadsave an die anonyme Methode übergeben kann, während man bei einer "richtigen" Methode keine Parameter übergeben kann und somit das praktisch mindestens thread-global übergeben muß, inkl. externer Variablen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (29. Sep 2014 um 23:17 Uhr) Grund: *schnarsch*
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#5

AW: Anonyme Methoden, Wann,warum, Vorteile

  Alt 30. Sep 2014, 08:19
Ok, also ist es für den "normalen" Anwendungszweck weder von Vorteil, noch von Nachteil.

@Uwe: Kannst du mir mal ein Beispiel zeigen, wo diese Fähigkeit ("lokale Variablen des Scopes mitzunehmen") mal mit ein bisschen Quelltext drum rum anschaulicher wird? Also wo man vielleicht besser dran erkennt, was wirklich der Vorteil davon ist?
Das Beispiel auf der von dir verlinkten Seite ist ja eher "spärlich". Ich hätte ja auch einfach eine Methode deklarieren können, der ich direkt x und y mitgebe als Parameter

Grüße
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: Anonyme Methoden, Wann,warum, Vorteile

  Alt 30. Sep 2014, 08:33
Dieser Artikel beschreibt ziemlich ausführlich, was anonyme Methoden sind und wozu man sie gebrauchen kann. Hier gibt's noch mehr Links dazu.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#7

AW: Anonyme Methoden, Wann,warum, Vorteile

  Alt 30. Sep 2014, 08:45
Der wahre Wert Anonymer Methoden liegt in ihrer Fähigkeit, lokale Variablen des Scopes mitzunehmen, in denen sie (die Anonyme Methode) deklariert werden.
Ist das bei einer Prozedur innerhalb einer Methode anders?
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#8

AW: Anonyme Methoden, Wann,warum, Vorteile

  Alt 30. Sep 2014, 08:53
Danke @Stevie. Das muss ich mir erstmal komplett durchlesen

Grüße
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: Anonyme Methoden, Wann,warum, Vorteile

  Alt 30. Sep 2014, 10:09
Der wahre Wert Anonymer Methoden liegt in ihrer Fähigkeit, lokale Variablen des Scopes mitzunehmen, in denen sie (die Anonyme Methode) deklariert werden.
Ist das bei einer Prozedur innerhalb einer Methode anders?
Ja, denn dort kannst du nur über parameter Informationen übergeben. Variable capturing läuft etwas anders - siehe Closures
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#10

AW: Anonyme Methoden, Wann,warum, Vorteile

  Alt 30. Sep 2014, 10:25
Der wahre Wert Anonymer Methoden liegt in ihrer Fähigkeit, lokale Variablen des Scopes mitzunehmen, in denen sie (die Anonyme Methode) deklariert werden.
Ist das bei einer Prozedur innerhalb einer Methode anders?
Ja! Nicht, was die Variablen betrifft, aber bei dem Zeitpunkt der Ausführung. Eine lokale Prozedur L innerhalb einer Methode M kann nur innerhalb dieser Methode M aufgerufen werden. Für alles außerhalb von M ist sie schlichtweg nicht sichtbar. Die lokalen Variablen von M sind dann, bei entsprechender Anordnung des Quelltexts, innerhalb von L verfügbar. Eine Anonyme Methode A kann aber auch außerhalb des Kontexts von M aufgerufen werden, in dem sie deklariert wurde. Trotzdem kann sie auf die lokalen Variablen von M zugreifen, obwohl M zu diesem Zeitpunkt schon längst beendet wurde.

Gerne verwendete Beispiele sind sicher die Methoden Synchronize und Queue aus TThread. Diesen kann man entweder parameterlose Methoden (procedure of object) oder eben auch parameterlose Anonyme Methoden mitgeben. Bei den simplen Methoden muss man die eigentlich benötigten Parameter in Felder der abgeleiteten Thread-Klasse stecken (Nein, globale Variablen sind da bei Todesstrafe verboten!). Das mag bei Synchronize noch gehen, da dort der Aufruf, wie der Name vermuten lässt, synchron geschieht. Bei Queue ist das aber nicht so. Da bietet sich eine Anonyme Methode an, die auf eine lokale Variable zugreift.

Hier mal ein typischerweise absolut sinnfreies Beispiel:

Delphi-Quellcode:
program Project36;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  System.Generics.Collections,
  System.Classes;

type
  TMyThread = class(TThread)
  public
    class procedure ExecuteThread;
  end;

  TMyThread1 = class(TMyThread)
  protected
    procedure Execute; override;
  end;

  TMyThread2 = class(TMyThread)
  protected
    procedure Execute; override;
    function MakeAnonMeth(Value: Integer): TThreadProcedure;
  end;

class procedure TMyThread.ExecuteThread;
var
  instance: TMyThread;
begin
  instance := Self.Create;
  try
    instance.WaitFor;
  finally
    instance.Free;
  end;
end;

procedure TMyThread1.Execute;
var
  I: Integer;
  aProc: TThreadProcedure;
begin
  aProc := Procedure
    begin
      Writeln(Format('%d Prozent', [I]));
    end;
  for I := 0 to 100 do begin
    Synchronize(aProc);
  end;
end;

procedure TMyThread2.Execute;
var
  I: Integer;
begin
  for I := 0 to 99 do begin
    Queue(MakeAnonMeth(I));
  end;
  Synchronize(MakeAnonMeth(100));
end;

function TMyThread2.MakeAnonMeth(Value: Integer): TThreadProcedure;
begin
  result := Procedure
    begin
      Writeln(Format('%d Prozent', [Value]));
    end;
end;

begin
  TMyThread1.ExecuteThread;
  TMyThread2.ExecuteThread;
  Readln;
end.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz