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.