Einzelnen Beitrag anzeigen

Friday

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

Datenstruktur: Kindobjekt als Objekt oder Record

  Alt 4. Mai 2022, 14: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 14:06 Uhr)
  Mit Zitat antworten Zitat