AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dynamischer Methodenaufruf

Ein Thema von Ghostwalker · begonnen am 20. Apr 2018 · letzter Beitrag vom 21. Apr 2018
Antwort Antwort
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#1

Dynamischer Methodenaufruf

  Alt 20. Apr 2018, 13:56
Problem:

Ich möchte eine Liste definieren in der ich bestimmten Schlüsselbegriffen, Methoden eines Objektes zuordnen kann.

Mit Hilfe einer Methode eines anderen Objektes würde ich dann die Methode über den Schlüsselbegriff mit den entsprechenden Parametern (die für jede der definierten Methoden gleich ist) aufrufen.

Was ich damit vermeiden möchte ist sowas:

Delphi-Quellcode:
 begin
   if (key = 'Wert1') then
     DoWert1(param1,param2);
   if (key = 'Wert2') then
     DoWert2(Param1,Param2);
    :
 end;
Mein erster Ansatz war, ein entsprechende Array zu definieren. Dieses dann in einer Schleife durchlaufen
und die Methode über RTTI anhand des Names aufrufen. Aber irgendwie erscheint mir das ein wenig "unelegant".

Hat da jemand vielleicht einen anderen Ansatz ?
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Dynamischer Methodenaufruf

  Alt 20. Apr 2018, 13:59
Benutz ein TDictionary<string, TDoWertProc>
Delphi-Quellcode:
type
  TDoWertProc = procedure(AParam1: Integer; AParam2: TObject) of object; // Natürlich Parameter anpassen

var doWertDict: TDictionary<string, TDoWertProc>;
begin
  // 1x Initialisieren:
  doWertDict := TDictionary<string, TDoWertProc>.Create;
  doWertDict.Add('Wert1', DoWert1);
  doWertDict.Add('Wert2', DoWert2);

  // Aufruf
  doWertDict[key](param1, param2);
end;
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (20. Apr 2018 um 14:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Dynamischer Methodenaufruf

  Alt 20. Apr 2018, 20:40
Reicht da nicht auch ein normales case aus?
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Dynamischer Methodenaufruf

  Alt 20. Apr 2018, 20:51
Reicht da nicht auch ein normales case aus?
Ich schätze mal wenn er kein if benutzen will, ist ein case auch nicht so viel besser.
Außerdem funktioniert case nicht mit Strings.
Und ich schätze das Problem ist dass er nicht nur 2 Methoden hat sondern eine ganze Menge und das dann ein recht großer case oder if-Block wäre.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Dynamischer Methodenaufruf

  Alt 20. Apr 2018, 21:01
Außerdem funktioniert case nicht mit Strings.
Du hast natürlich mehr als Recht, ist ja kein Ordinaler Typ
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#6

AW: Dynamischer Methodenaufruf

  Alt 20. Apr 2018, 21:29
Nunja, mit einer Array-Konstanten und AnsiIndexText ginge auch case. Allerdings dürfte ein Dictionary performanter sein.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Dynamischer Methodenaufruf

  Alt 20. Apr 2018, 21:36
Emm

Delphi-Quellcode:
Var
  CallByName = TDictionary<String,TProc<T,T>>
  Mit Zitat antworten Zitat
MichaelT

Registriert seit: 14. Sep 2005
Ort: 4020 Linz
555 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Dynamischer Methodenaufruf

  Alt 21. Apr 2018, 11:48
Der enum erfüllt einen ähnlichen Zweck im Regelfall. Die Wahrnehmung stimmt schon, sowie das Beispiel geschrieben wurde.

Der String selbst ist eine Bag mit in der die Reihenfolge ein Rolle spielt. Im CASE selbst würde eine Stringkonstante geprüft.

Ein Programm kann nicht lernen und liefert bei selben Input immer den selben Output. Das 'Wissen' und die Fähigkeiten des Programms erweiterst du als Programmieren. Sonst ist es kein Programm.

Zwei Beispiele für die Implementierung des Case Statements
Überlegung in Pascal
C/C++

usw ...

Scripts sind keine Programme. Scripting reflektiert eher höhere Änderungsraten. Weswegen du diese eher dynamischeren CASE Konstrukte eher in 4GL und Scripting Umgebungen findest. DB Umfeld.

In Python werden Dictionaries genommen. In C# erfolgt die Umsetzung auch im Dictionary.

Wir machten auf der Uni in Compilerbau noch zwei Implementierungen von CASE und heute wuchert das Thema. (Wenn mit nicht alles täuscht mit Fädelungsliste oder nicht (ob mich richtig erinnere).

--

Wenn du ein Serverprozess jahrelang laufen hast kannst du auch hergehen und die Sprungaddressen nach Aufrufhäufigkeit eher im Vorfeld ansiedeln usw...

Kaum eine Änderung über Jahre ist auch wieder ein anderer Zugang, wobei sich die Änderung einschleicht.

---

Die Realisierung solcher Fragen als 'CASE' oder wie auch immer hängt eben an der Form wie eine Änderung implementiert wird und wie oft. Klarerweise kann Implementierung für die Wahl schöner tauschen. Eine der schnellsten Umsetzung in C# war einmal ein Funktionsaufrauf mit Übergabeparameter ein Character 1:1 mit IFs zurückgemapped auf einen Integer.


Außerdem funktioniert case nicht mit Strings.
Du hast natürlich mehr als Recht, ist ja kein Ordinaler Typ

Geändert von MichaelT (21. Apr 2018 um 12:00 Uhr)
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Dynamischer Methodenaufruf

  Alt 21. Apr 2018, 13:38
Wie schon vorher gesagt wurde, will ich auf if-Statements verzichten, da das dann in einer Orgie ausarten würde.
Von Übersichtlichkeit und Erweiterbarkeit ganz zu schweigen

Da ich als index/key einen String verwende funktioniert auch Case nicht. Und so viel übersichtlicher wird das ganze dann auch nicht.

TDictionary sieht nach dem richtigen Weg aus. So wie der General das beschrieben hat, kann ich mir sogar den ganzen Zirkus mit der RTTI sparen
Uwe
e=mc² or energy = milk * coffee²
  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 16:29 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