AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

constructor (variable Aufrufe)

Ein Thema von t2000 · begonnen am 29. Mai 2021 · letzter Beitrag vom 31. Mai 2021
Antwort Antwort
Benutzerbild von t2000
t2000

Registriert seit: 16. Dez 2005
Ort: NRW
161 Beiträge
 
Delphi 10.4 Sydney
 
#1

constructor (variable Aufrufe)

  Alt 29. Mai 2021, 13:58
Delphi-Version: 10.4 Sydney
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;
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2023/2024 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.731 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: constructor (variable Aufrufe)

  Alt 29. Mai 2021, 14:38
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
135 Beiträge
 
#3

AW: constructor (variable Aufrufe)

  Alt 29. Mai 2021, 21:51
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
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.236 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: constructor (variable Aufrufe)

  Alt 29. Mai 2021, 22:02
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).
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
445 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: constructor (variable Aufrufe)

  Alt 30. Mai 2021, 12:36
(Ich habe hier auch keinerlei Warungen bekommen, bzgl. override. Im Vorgänger ist nur "constructor create( Axy: string);" deklariert.)
Warum kommen die trotz fehlenden override und 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.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.032 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: constructor (variable Aufrufe)

  Alt 31. Mai 2021, 08:26
Man das vorige Create auch überladen und dort eine exception raisen.

Geändert von freimatz (31. Mai 2021 um 08:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.819 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: constructor (variable Aufrufe)

  Alt 31. Mai 2021, 09:05
Warum kommen die trotz fehlenden override und 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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von t2000
t2000

Registriert seit: 16. Dez 2005
Ort: NRW
161 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: constructor (variable Aufrufe)

  Alt 31. Mai 2021, 09:45
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.
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2023/2024 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
445 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: constructor (variable Aufrufe)

  Alt 31. Mai 2021, 18:42
@Uwe Raabe: Danke!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 07:18 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