![]() |
Delphi-Version: 10.4 Sydney
constructor (variable Aufrufe)
Hallo zusammen,
mal eine Optimierungsfrage. Ich habe ein Objekt, das ein paar Datenobjekte beim Create übergeben bekommt oder, falls nicht, selber erzeugt. Dazu gibt es wohl min. 2 Ansätze. Der Quellcode ist nur symbolisch und daher unvollständig. Ein Ziel ist aber auf jeden Fall, dass der Code im constructor nur einmal geschrieben werden soll. Bloß nicht doppelt. (Ich habe hier auch keinerlei Warungen bekommen, bzgl. override. Im Vorgänger ist nur "constructor create( Axy: string);" deklariert.) Version 1 - diese würde ich bevorzugen
Delphi-Quellcode:
type
TMyObject = class( TMyVorgänger) private FObj1 : TObject1; FObj2 : TObject2; FObj3 : TObject3; public constructor Create; overload; constructor Create( AObj1: TObject1; AObj2: TObject2; AObj3: TObject3); overload; end; /////////// constructor TMyObject.Create; begin Create( nil, nil, nil); end; constructor TMyObject.Create( AObj1: TObject1; AObj2: TObject2; AObj3: TObject3); begin inherited Create( 'xy'); FObj1 := AObj1; FObj2 := AObj2; FObj3 := AObj3; end; Version 2 - ist das besser? schlechter? gleich?
Delphi-Quellcode:
type
TMyObject = class( TMyVorgänger) private FObj1 : TObject1; FObj2 : TObject2; FObj3 : TObject3; public constructor Create( AObj1: TObject1 = nil; AObj2: TObject2 = nil; AObj3: TObject3 = nil); end; /////////// constructor TMyObject.Create( AObj1: TObject1 = nil; AObj2: TObject2 = nil; AObj3: TObject3 = nil); begin inherited Create( 'xy'); FObj1 := AObj1; FObj2 := AObj2; FObj3 := AObj3; end; |
AW: constructor (variable Aufrufe)
kommt drauf an,
ob dich die paar Byte bei jedem Aufruf stören (Parameter) und die gefühlt 1000tel Millisekunde, die das Länger dauert, und 4 Byte mehr auf dem Stack, weil nicht alle 4 Parameter (inkl. Self) in die Register passen. |
AW: constructor (variable Aufrufe)
Zitat:
Bis bald... Thomas |
AW: constructor (variable Aufrufe)
Im zweiten Fall kann man auch nur 1 oder 2 Objekte übergeben.
Wenn das nicht Teil der Anforderung ist würde ich Variante 1 wählen (wäre dann eindeutiger). |
AW: constructor (variable Aufrufe)
Zitat:
Delphi-Quellcode:
und
override
Delphi-Quellcode:
nicht?
reintroduce
Und ist es von der Übersichtlichkeit her in Ordnung, wenn man eine Methode beim Überschreiben nicht nur erweitert oder modifiziert, sondern komplett ändert? Natürlich geht das ohne Probleme, aber für mich wäre es überraschend, wenn die Parameter von zwei verwandten Methoden überhaupt nichts mehr miteinander zu tun haben. |
AW: constructor (variable Aufrufe)
Man das vorige Create auch überladen und dort eine exception raisen.
|
AW: constructor (variable Aufrufe)
Zitat:
|
AW: constructor (variable Aufrufe)
Danke schon mal für eure Hinweise.
@stahli: Entweder übernimmt der Aufrufer die Verwaltung von ALLEN Objekten und übergibt diese ober eben überhaupt nicht. Nur ein oder zwei Objekte kommt nicht in Frage. Ich tendiere zur 1. Möglichkeit, da ich es übersichtlicher finde und die Anforderung (alles oder nichts) besser und vor allem eindeutig regeln kann. Da ich es jetzt erst einbaue habe ich außer dem kompilieren noch keine Ergebinisse bzgl. Korrektheit, Nebenwirkungen oder Ähnliches. Aber ich gebe zu, dass das Lesen wenn man sich das "create ..." bzw. "inherited create ..." ansieht, leidet. |
AW: constructor (variable Aufrufe)
@Uwe Raabe: Danke!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:13 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