AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Wird gerne vergessen: Gleichheit bei Collections von Records

Wird gerne vergessen: Gleichheit bei Collections von Records

Ein Thema von Der schöne Günther · begonnen am 6. Feb 2019 · letzter Beitrag vom 7. Feb 2019
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
4.855 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Wird gerne vergessen: Gleichheit bei Collections von Records

  Alt 6. Feb 2019, 10:10
Eine ganz dumme Frage:

Angenommen man hat eine Collection (List, Dictionary, …) von Records, z.B. TMyRecord . Wenn man bei diesen Collections keinen IEqualityComparer<TMyRecord> angibt dann wird ein Default-Comparer genommen der stumpf die Bytes im Speicher vergleicht.

Bei Records mit Padding kann so eine Gleichheitsprüfung natürlich funktionieren, muss aber nicht. Das Problem: Hier wird im Code gerne vergessen bei solchen Collections auch den Comparer anzugeben. Unit-Tests decken das meist auch nicht auf da hier Records frisch angelegt werden, die Padding-Bytes alle Null sind und alles klappt.

In den Unit-Tests kann man natürlich explizit hingehen, die Padding-Bytes manuell mit Mustern beschreiben und schauen ob dann noch alles klappt - Aber da muss man auch erst einmal dran denken!


Gibt es einen Trick? Oder hilft hier nur Haue?
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
2.080 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: Wird gerne vergessen: Gleichheit bei Collections von Records

  Alt 6. Feb 2019, 13:42
Gewalt ist immer eine Lösung!

Ich habe schlechte Erfahrung mit Records in Collections gemacht. Dadurch das beim Zugriff nicht das eigentliche Record angefasst wird, sondern man eine Kopie bekommt, ist halt irgendwie oll.
Am Ende nehme ich immer Klassen als stumpfe DTOs. Nur öffentliche Felder, ohne Properties. Die kommen dann ggf. sogar einfach in TObjectList/Dict/Whatever und mit Verwaltung und gut.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
2.080 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: Wird gerne vergessen: Gleichheit bei Collections von Records

  Alt 6. Feb 2019, 13:43
Nachtrag: Wenn man nicht will, das die Container-Klasse die Speicherverwaltung übernimmt, bekommt das DTO ein niedliches Interface dran und alles weiter läuft dann nur darüber.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
4.855 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Wird gerne vergessen: Gleichheit bei Collections von Records

  Alt 6. Feb 2019, 17:36
Werttypen sind mir oft eigentlich ganz sympathisch da ich mir keine Sorgen machen muss dass jemand die Dinger verändert da jeder nur eine Kopie bekommt. Das jetzt auf Referenztypen (TObject/IInterface) umzubauen graut es mir etwas vor...

Vielleicht kommen in Delphi ja tatsächlich irgendwann die impliziten Record-Konstrukturen, hier könnte man dann in jedem DTO seinen Speicher erstmal mit einem gepflegten self := Default(TMyRecord) initialisieren und wäre all diese Sorgen los...
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
517 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

AW: Wird gerne vergessen: Gleichheit bei Collections von Records

  Alt 7. Feb 2019, 07:16
Ich habe mir einen Generator für solche Klassen gemacht. Erstmal ein interface mit properties was man haben will (ohne Getter). Dann gibts dazu Klassen, mit readonly properties, Daten kommen beim Konstruktor rein. (Dazu kommen 1:1 Records mit Methoden um von und in eine solche Klasse zu wandeln. Die Records sind aber nur für temporäre Zwecke gedacht.)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Wird gerne vergessen: Gleichheit bei Collections von Records

  Alt 7. Feb 2019, 09:57
Eigene Ableitungen und im falle von tkRecord einen etwas schlaueren comparer bauen, der Feld für Feld vergleicht oder auf einen vorhandenen equals operator zurückgreift.

P.S. Hab ich auf meiner Liste für Spring4D
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
4.855 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Wird gerne vergessen: Gleichheit bei Collections von Records

  Alt 7. Feb 2019, 10:11
Unterklassen von Collections zu bilden bin ich normalerweise kein Freund von, aber hier klingt das schon sinnig. Ich tüftel da mal etwas herum... 🤔

Kannst du bei Gelegenheit ausführen was du vorhast?

Ich versuche bei Spring4D in den nächsten Tagen auch mal eine ganz konkrete Problembeschreibung mit PR was ich an den Dictionaries ändern würde einzureichen. Die TValueCollection eines TDictionary<X,Y> schert sich z.B. überhaupt nicht um den übergebenen Comparer wenn man mit Contains(..) schaut ob sie etwas enthält...

Geändert von Der schöne Günther ( 7. Feb 2019 um 10:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Wird gerne vergessen: Gleichheit bei Collections von Records

  Alt 7. Feb 2019, 10:53
Kannst du bei Gelegenheit ausführen was du vorhast?
Für comparer dasselbe machen, wie in Spring.EqualsRec2Rec: zuerst nach equals operator schauen, ansonsten Feldvergleich (bisschen anders als dort, fällt mir grad auf, damit evtl Feld paddings berücksichtigt werden).

Die TValueCollection eines TDictionary<X,Y> schert sich z.B. überhaupt nicht um den übergebenen Comparer wenn man mit Contains(..) schaut ob sie etwas enthält...
Das ist in 1.3 (develop) schon gefixt.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie ( 7. Feb 2019 um 11:02 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
4.855 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Wird gerne vergessen: Gleichheit bei Collections von Records

  Alt 7. Feb 2019, 11:16
Und ich dachte ich kann endlich auch mal etwas beitragen, und wenn es nur zwei Zeilen sind 😪

Das nächste mal schaue ich direkt in den aktuellen Zweig...
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 19:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf