Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi constructor (variable Aufrufe) (https://www.delphipraxis.net/208026-constructor-variable-aufrufe.html)

t2000 29. Mai 2021 13:58

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;

himitsu 29. Mai 2021 14:38

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.

mytbo 29. Mai 2021 21:51

AW: constructor (variable Aufrufe)
 
Zitat:

Zitat von t2000 (Beitrag 1490364)
Version 2 - ist das besser? schlechter? gleich?

Ich würde in 99% der Fälle instinktiv für Version 2 plädieren. Auch würde ich dem neuen Konstruktor ein "reintroduce" spendieren. Ich warte manchmal noch Quellcode, der schon fast 20 Jahre alt ist. Wenn ich Änderungen einpflegen muss, bin ich immer froh, wenn mir der Original-Programmier (das war ich meistens selbst) seine Absichten klar mitzuteilen vermag. Bei der zweiten Version würde es mit Hilfe der Code-Vervollständigung für mich schneller klar werden. Ok, auch bei mir kommt manchmal ein "reintroduce; overload; virtual; abstract;" raus. :)

Bis bald...
Thomas

stahli 29. Mai 2021 22:02

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).

Benmik 30. Mai 2021 12:36

AW: constructor (variable Aufrufe)
 
Zitat:

Zitat von t2000 (Beitrag 1490364)
(Ich habe hier auch keinerlei Warungen bekommen, bzgl. override. Im Vorgänger ist nur "constructor create( Axy: string);" deklariert.)

Warum kommen die trotz fehlenden
Delphi-Quellcode:
override
und
Delphi-Quellcode:
reintroduce
nicht?

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.

freimatz 31. Mai 2021 08:26

AW: constructor (variable Aufrufe)
 
Man das vorige Create auch überladen und dort eine exception raisen.

Uwe Raabe 31. Mai 2021 09:05

AW: constructor (variable Aufrufe)
 
Zitat:

Zitat von Benmik (Beitrag 1490391)
Warum kommen die trotz fehlenden
Delphi-Quellcode:
override
und
Delphi-Quellcode:
reintroduce
nicht?

Solange ein constructor nicht virtuell ist, bekommt man auch keine Warnung wenn man in einer abgeleiteten Klasse einen neuen deklariert. Andernfalls gäbe es ja bei jedem constructor eine, da alle mindestens ein TObject.Create im Vorfahren haben.

t2000 31. Mai 2021 09:45

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.

Benmik 31. Mai 2021 18:42

AW: constructor (variable Aufrufe)
 
@Uwe Raabe: Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf