Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Gibt es keine generischen Proceduren? (https://www.delphipraxis.net/152256-gibt-es-keine-generischen-proceduren.html)

himitsu 16. Jun 2010 15:07

Delphi-Version: 2010

Gibt es keine generischen Proceduren?
 
n'abend,

sacht mal, kann man denn keine genereische Proceduren erstellen?

Als Methoden ginge es ja, aber mir war so, als wenn man auch "einfache" Proceduren nutzen könnte, aber anscheinend täuche ich mich grade oder mache ich nur irgendwas falsch. o.O

s.h.a.r.k 16. Jun 2010 15:09

AW: Gibt es keine generischen Proceduren?
 
Zitat:

[DCC Fehler] Project1.dpr(42): E2530 Typparameter bei globaler Prozedur oder Funktion nicht zulässig
Scheinbar gehts nicht... Schade eigentlich.

himitsu 16. Jun 2010 15:32

AW: Gibt es keine generischen Proceduren?
 
Och schade, hatte gehofft der Fehler liege bei mir :?

H4ndy 16. Jun 2010 15:34

AW: Gibt es keine generischen Proceduren?
 
Wie macht es denn z.B. Delphi-Referenz durchsuchenFormat mit den typenlosen Dateneingabe-Array?

Neutral General 16. Jun 2010 15:37

AW: Gibt es keine generischen Proceduren?
 
Zitat:

Zitat von H4ndy (Beitrag 1029404)
Wie macht es denn z.B. Delphi-Referenz durchsuchenFormat mit den typenlosen Dateneingabe-Array?

Array of Const

implementation 16. Jun 2010 15:38

AW: Gibt es keine generischen Proceduren?
 
Mit offenen Variant-Arrays (array of const)...
//edit: Zu spät, und kein roter Kasten...

s.h.a.r.k 16. Jun 2010 15:39

AW: Gibt es keine generischen Proceduren?
 
@himitsu: Kannst dich ja neulich an meine Klassenmethoden erinnern. So könntest es machen, nur musst halt auf die Benutzung achten ;) Ich weiß, das ist zwar nicht so toll, aber ein alternativer Weg.

Dieses array of const Gedöns ist ja echt gut und recht, aber wenn man Generics einsetzen kann, dann sollte man diese bevorzugen, da dann nicht so viel gecastet werden muss. Ist somit dann auch schneller in der Ausführung.

Blup 9. Jan 2025 20:22

AW: Gibt es keine generischen Proceduren?
 
Ich weis das Thema ist schon fast 15 Jahre alt.
Um so erstaunlicher das Delphi noch immer diese Einschränkung gilt.
Wenn sowas geht, gibt es wirklich keinen sinnvollen Grund globale generische Procedure und Funktionen zu verbieten:
Delphi-Quellcode:
type
  TIfThenHelper = class helper for TObject
    class function IfThen<T>(AValue: Boolean; const ATrue: T; const AFalse: T): T; static;
  end;

implementation

class function TIfThenHelper.IfThen<T>(AValue: Boolean; const ATrue: T; const AFalse: T): T;
begin
  if AValue then
    Result := ATrue
  else
    Result := AFalse;
end;
Leider ist immer nur ein Helper pro Klasse und Unit gültig, was die Nützlichkeit einschränkt.
Es ist aber möglich für eine abgeleitete Klasse einen weiteren Helper zu deklarieren.
Dann kann man beide Helper gleichzeitig in dieser Klasse nutzen.

freimatz 10. Jan 2025 15:51

AW: Gibt es keine generischen Proceduren?
 
Zitat:

Zitat von Blup (Beitrag 1544984)
Wenn sowas geht, gibt es wirklich keinen sinnvollen Grund globale generische Procedure und Funktionen zu verbieten:

Zu verbieten nicht, aber auch keinen guten den Aufwand zu treiben.
Meiner Meinung nach sollte man generell globale generische Procedure und Funktionen vermeiden.

Blup 10. Jan 2025 23:50

AW: Gibt es keine generischen Proceduren?
 
Wenn man oft genug überladene Funktionen wie IfThen() für alle möglichen Typen implementiert, sieht man das vieleicht anders. :wink:

jaenicke 11. Jan 2025 07:10

AW: Gibt es keine generischen Proceduren?
 
Dafür ist es aber nicht nötig, lose umherschwirrende Funktionen zu implementieren. Man kann dafür auch Sammelklassen mit genetischen Klassenmethoden erstellen. Die kann man auch überall nutzen, aber man sieht, wo die herkommen. Dafür könnte man auch den Unitnamen vorstellen, aber das wäre dann optional, was für ein Team nicht optimal wäre.

So habe ich dann TStringTools, TMathTools, usw. in entsprechenden Units Lib.Tools.MathTools.pas usw. im Ordner lib\tools, so dass man sich intuitiv zurechtfindet.

Benmik 11. Jan 2025 11:05

AW: Gibt es keine generischen Proceduren?
 
Ich habe mich schon oft gefragt, ob es möglich ist, eine generische Funktion zu schreiben, ob ein bestimmtes Element in einer Aufzählung vorhanden ist.

EDIT: Das war jetzt etwas schlampig ins Handy geschrieben. Ich mache selten Enumerationen, ohne auch ein Set dafür zu deklarieren. Ich meinte also natürlich eine generische Funktion, um das Vorhandensein in einem Set zu prüfen.

lxo 11. Jan 2025 17:48

AW: Gibt es keine generischen Proceduren?
 
Zitat:

Zitat von Benmik (Beitrag 1545058)
Ich habe mich schon oft gefragt, ob es möglich ist, eine generische Funktion zu schreiben, ob ein bestimmtes Element in einer Aufzählung vorhanden ist.

EDIT: Das war jetzt etwas schlampig ins Handy geschrieben. Ich mache selten Enumerationen, ohne auch ein Set dafür zu deklarieren. Ich meinte also natürlich eine generische Funktion, um das Vorhandensein in einem Set zu prüfen.

Wozu so eine Funktion?
Geht doch auch so mit einem kurzen Einzeiler.
Wüsste nicht was man da für eine Funktion bauen könnte die das vereinfacht oder Mehrwert bietet.
Delphi-Quellcode:
lEnum := Enum1;
lSet := [Enum1,Enum2];
if lEnum in lSet then

Oder

if Enum1 in [Enum1,Enum2] then

oder auch

if Enum1 in [Low(TMyEnum)..High(TMyEnum)] then

Benmik 11. Jan 2025 22:27

AW: Gibt es keine generischen Proceduren?
 
Natürlich geht das. Aber es gibt auch so etwas

Delphi-Quellcode:
If (lSet1 * [Enum1, Enum2] = []) and (lSet2 * [Enum1, Enum3] = []) then begin


und Ähnliches und das hätte ich gern kürzer/übersichtlicher/eleganter/sprechender.
Aber offensichtlich geht das nicht.

Uwe Raabe 11. Jan 2025 22:57

AW: Gibt es keine generischen Proceduren?
 
Generisch mit Set geht erstmal nicht, da es keinen generischen Constraint dafür gibt. Folglich kann man auch die Operatoren nicht anwenden.
(Vielleicht könnte man mit RTTI und ein paar bösen Hacks und dem Glauben an die Unfehlbarkeit des Entwicklers was hinkriegen, aber das gehört hier nicht hin)

Du kannst aber zu einem Set einen Helper schreiben - muss halt wegen obiger Einschränkung für jedes Set separat gemacht werden:
Delphi-Quellcode:
type
  TMyEnum = (Enum1, Enum2, Enum3, Enum4);
  TMyEnums = set of TMyEnum;
  TMyEnumsHelper = record helper for TMyEnums
    function DoesNotContain(const Value: TMyEnums): Boolean;
  end;

function TMyEnumsHelper.DoesNotContain(const Value: TMyEnums): Boolean;
begin
  Result := (Self * Value) = [];
end;
Dein Beispiel würde dann so geschrieben:
Delphi-Quellcode:
If lSet1.DoesNotContain([Enum1, Enum2]) and lSet2.DoesNotContain([Enum1, Enum3]) then begin
 
end;

Benmik 11. Jan 2025 23:23

AW: Gibt es keine generischen Proceduren?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1545074)
Generisch mit Set geht erstmal nicht, da es keinen generischen Constraint dafür gibt.

Genau das schwebte mir vage vor, konnte es aber mangels des Begriffs "generischer Constraint" nicht nachsehen.

Lösungen für ein spezifisches Set wollte ich ja gerade umgehen. Immerhin weiß ich jetzt, es geht halt nicht, das ist auch etwas wert, danke dafür.

jaenicke 12. Jan 2025 00:15

AW: Gibt es keine generischen Proceduren?
 
Es gibt aber eine generische Implementierung eines Sets in Spring4D, nämlich ISet<T>. Da gibt es dann z.B. Overlaps als Methode. Das ist aber natürlich langsamer als die native Variante, funktioniert dafür aber auch mit anderen Typen.

schobihh 12. Jan 2025 09:37

AW: Gibt es keine generischen Proceduren?
 
Zitat:

Zitat von Benmik (Beitrag 1545070)
Natürlich geht das. Aber es gibt auch so etwas

Delphi-Quellcode:
If (lSet1 * [Enum1, Enum2] = []) and (lSet2 * [Enum1, Enum3] = []) then begin


und Ähnliches und das hätte ich gern kürzer/übersichtlicher/eleganter/sprechender.
Aber offensichtlich geht das nicht.

wenn das die Probleme sind, die Delphi hat, dann hat Embarcadero alles richtig gemacht.

Benmik 12. Jan 2025 19:58

AW: Gibt es keine generischen Proceduren?
 
Zitat:

Zitat von jaenicke (Beitrag 1545077)
Es gibt aber eine generische Implementierung eines Sets in Spring4D, nämlich ISet<T>. Da gibt es dann z.B. Overlaps als Methode. Das ist aber natürlich langsamer als die native Variante, funktioniert dafür aber auch mit anderen Typen.

Das ist ein toller Hinweis. Ich hatte früher mal Spring4D installiert, es aber aufgegeben, da ich es zu erschlagend fand.
Habe es mir angesehen, und tatsächlich enthält es so ziemlich das, was ich im Auge hatte. Aber ich glaube, das ganze Framework, das ist mit Kanonen auf Spatzen geschossen. Aber wer weiß ...

fisipjm 13. Jan 2025 15:37

AW: Gibt es keine generischen Proceduren?
 
Zitat:

Zitat von Benmik (Beitrag 1545097)
Zitat:

Zitat von jaenicke (Beitrag 1545077)
Es gibt aber eine generische Implementierung eines Sets in Spring4D, nämlich ISet<T>. Da gibt es dann z.B. Overlaps als Methode. Das ist aber natürlich langsamer als die native Variante, funktioniert dafür aber auch mit anderen Typen.

Das ist ein toller Hinweis. Ich hatte früher mal Spring4D installiert, es aber aufgegeben, da ich es zu erschlagend fand.
Habe es mir angesehen, und tatsächlich enthält es so ziemlich das, was ich im Auge hatte. Aber ich glaube, das ganze Framework, das ist mit Kanonen auf Spatzen geschossen. Aber wer weiß ...

Spring4D ist ein gute Framework gerade wenn es z.B. um das Thema dependency Injection geht. Wäre also nicht nur für diesen Part eine gute Sache, sondern lässt sich auch gut in anderen Sinnvollen Codeoptimierungen nutzen :)

himitsu 14. Jan 2025 08:22

AW: Gibt es keine generischen Proceduren?
 
Es wurden mehrmals Lösungen vorgeschlagen, aber Emba hat abgelehnt.

z.B.
Ja, selbst wenn Generics nur mit Klassen/Records gehen, dann gibt es dennoch keinen Grund eine einzelne Methode nicht "intern" in eine Dummy-Klasse zu verpacken. (compilermagic und so)

ODER,
würde Emba sich nicht weigern wenigstens eine minimalste Unterstützung für Makros bereitzustellen, dann könnten wir das auch selbst machen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz