AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Datenstruktur: Kindobjekt als Objekt oder Record
Thema durchsuchen
Ansicht
Themen-Optionen

Datenstruktur: Kindobjekt als Objekt oder Record

Ein Thema von Friday · begonnen am 4. Mai 2022 · letzter Beitrag vom 4. Mai 2022
Antwort Antwort
Friday

Registriert seit: 6. Mai 2008
97 Beiträge
 
Delphi 11 Alexandria
 
#1

Datenstruktur: Kindobjekt als Objekt oder Record

  Alt 4. Mai 2022, 13:03
Hallo,

ich habe ein InterfacedObject mit vielen Eigenschaften, wobei die Eigenschaften vermutlich noch weiter anwachsen werden.
Um das einigermaßen übersichtlich und wartbar zu halten, wollte ich entsprechend Kindobjekte mit Eigenschaften erstellen. Hierbei stellt sich die Frage ob Objekt oder Record.

Objekt:
Delphi-Quellcode:
TMyObj = class(TInterfacedObject, MyInterface)
 Field_A0
 Field_A1
 ...
 Field_A9
 Field_B0
 ...
 Field_B9
 ...
 Field_F9
Hier sind beispielhaft nur die Feldnamen gelistet, properties, getter und setter bitte dazu denken. In dem Beispiel sind das also 60 Eigenschaften.
Eine Möglichkeit wäre für alle A, B, C, D, E, F - Eigenschaften je ein Objekt oder Record als Kindobjekt zu definieren.
Als Interfaces:
Delphi-Quellcode:
TMyObj = class(TInterfacedObject, MyInterface)
 Field_A: IGrpA;
 Field_B: IGrpB;
 Field_C: IGrpC;
 Field_D: IGrpD;
 Field_E: IGrpE;
 Field_F: IGrpF;
Um der Dependency Injection gerecht zu werden, würde der constructor also so aussehen:
constructor TMyObj.create(aGrpA: IGrpA; aGrpB: IGrpB; aGrpC: IGrpC; aGrpD: IGrpD; aGrpE: IGrpE; aGrpF: IGrpF); Unnötig zu sagen, das grenzt wieder an Unübersichtlichkeit und überschreitet eine vernünftige Anzahl an Parametern.
Statt dessen alle Kindobjekte als Records erstellen scheint fast naheliegender. Der Nachteil ist, dass es eher langlebige Daten sind und so doch einige Daten (es kommen auch einige Instanzen von TMyObj zusammen) auf dem Stack landen ohne dessen Geschwindigkeit zu benötigen. Die Kindobjekte selbst werden keine Interfaces als Eigenschaften haben, womit Records grundsätzlich möglich sind. Auch Vererbung ist hier kein Thema.
Ach ja: Das Thema ByValue oder ByRef spiel hier auch eher eine untergeordnete Rolle, da es nicht zu großen Kopiervorgängen kommt. Zumindest nicht von den Kindobjekten, sondern wenn dann von TMyObj.

Zu welcher Lösung würdet ihr greifen? Oder nochmal zu einer anderen?

Danke schonmal.

Geändert von Friday ( 4. Mai 2022 um 13:06 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.062 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Datenstruktur: Kindobjekt als Objekt oder Record

  Alt 4. Mai 2022, 13:14
Als Interfaces:
Delphi-Quellcode:
TMyObj = class(TInterfacedObject, MyInterface)
 Field_A: IGrpA;
 Field_B: IGrpB;
 Field_C: IGrpC;
 Field_D: IGrpD;
 Field_E: IGrpE;
 Field_F: IGrpF;
Um der Dependency Injection gerecht zu werden, würde der constructor also so aussehen:
constructor TMyObj.create(aGrpA: IGrpA; aGrpB: IGrpB; aGrpC: IGrpC; aGrpD: IGrpD; aGrpE: IGrpE; aGrpF: IGrpF); Unnötig zu sagen, das grenzt wieder an Unübersichtlichkeit und überschreitet eine vernünftige Anzahl an Parametern.
Delphi-Quellcode:
type
  TMyObjData = record
      GrpA: IGrpA;
      GrpB: IGrpB;
      GrpC: IGrpC;
      GrpD: IGrpD;
      GrpE: IGrpE;
      GrpF: IGrpF;
  end;

//...

constructor TMyObj.Create(const AMyObjData: TMyObjData);
begin
  Self.FMyData := AMyObjData;
  // Tataa, fertig! Super erweiterbar, man muss die Methodensignatur des Constructors nicht mehr anpacken!
end;
Jetzt kannst du dir noch aussuchen, ob du deine öffentlichen Properties auf das gesamte Sammel-Record zeigen lässt oder auf die einzelnen Bestandteile davon.
  Mit Zitat antworten Zitat
Friday

Registriert seit: 6. Mai 2008
97 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Datenstruktur: Kindobjekt als Objekt oder Record

  Alt 4. Mai 2022, 13:21

Delphi-Quellcode:
type
  TMyObjData = record
      GrpA: IGrpA;
      GrpB: IGrpB;
      GrpC: IGrpC;
      GrpD: IGrpD;
      GrpE: IGrpE;
      GrpF: IGrpF;
  end;
TMyObj enthält mind. 2 einzelne Interface Eigenschaften, von daher darf es kein Record sein. Die Frage stellt sich also wirklich nur für die Kindobjekte.
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.181 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Datenstruktur: Kindobjekt als Objekt oder Record

  Alt 4. Mai 2022, 13:34
Hmm. Ich kenn deine Anforderung nicht, aber ich würde eine dynamische Struktur bauen:

TMyObj = class(TInterfacedObject, MyInterface)
fEigenschaften: TList<TEigenschaft,TWert>;
end;

Ob TList oder sonstwas ist da jetzt eagl.
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Datenstruktur: Kindobjekt als Objekt oder Record

  Alt 4. Mai 2022, 14:11
Es sind doch nur Daten, sie tun nichts. "Plain Old Data", in Delphi praktisch immer ein Record, z.B. TMySettings .

Deinem tatsächlichen Objekt verpasst du nicht fünf Dutzend Properties, sondern du kannst die TMySettings lesen, und du kannst sie setzen. Später willst du diese Einstellungen dauerhaft speichern und laden oder übers Netz übertragen, und kümmerst dich um die Serialisierung von TMySettings . Wer oder was das benutzt ist unerheblich.

Wenn du wirklich meinst dass sich messbare Performance-Einbußen über das Pass by value ergeben lässt sich das ganze ja notfalls auch noch über einen Referenztyp wrappen, aber die Daten selbst - Da sehe ich nie was man dadurch gewinnt, das in ein TObject oder gar interface-basiertes Objekt zu verpacken, außer noch mehr Tipparbeit und Komplexität.
  Mit Zitat antworten Zitat
Friday

Registriert seit: 6. Mai 2008
97 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Datenstruktur: Kindobjekt als Objekt oder Record

  Alt 4. Mai 2022, 14:21
Deinem tatsächlichen Objekt verpasst du nicht fünf Dutzend Properties, sondern du kannst die TMySettings lesen, und du kannst sie setzen.
Du sprichst dich also für die Lösung von TiGü aus. Aber wie gesagt, das funktioniert nicht weil TMyObj mind. 2 Interfaces als properties hat.
  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 08:11 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