![]() |
AW: Constructor Rückgabewert nil-en statt Instanz zurückzugeben?
Ich gebe mal etwas vor. Wie sähe das denn korrekt aus mit einer Factory-Class?
Delphi-Quellcode:
type
TMyClass = class public constructor Create(Parameter); destructor Destroy; override; end; implementation constructor TMyClass .Create(Parameter); begin prüfe dies prüfe das WENN Fehler/korrupte Daten, dann raise exception und abbrechen SONST am Ende erstelle Thread -A- oder -B- end; destructor TMyClass .Destroy; begin if Assigned(ThreadA) then begin ThreadA.Stop; // Funktion in der Thread-Unit selber - hat schon seinen Sinn :P ThreadA.Free; end; // ThreadB, wenn Assigned, wird an anderer Stelle von Hand freigegeben inherited Destroy; end;
Delphi-Quellcode:
TMyClass: TList;
try myClass := TMyClass.Create(Parameter); except end; if Assigned(myClass) then // wenn oben rause ausgelöst wird, ist myClass not Assigned und muss nicht hinzugefügt werden MyGenericTList.Add(myClass); |
AW: Constructor Rückgabewert nil-en statt Instanz zurückzugeben?
Warum nicht so?
Delphi-Quellcode:
try
myClass := TMyClass.Create(Parameter); MyGenericTList.Add(myClass); except // hier sollte schon och was passieren, oder? end; |
AW: Constructor Rückgabewert nil-en statt Instanz zurückzugeben?
Da du im Konstruktor bist und als input also nur "parameter" zur Verfügung hast und nicht irgendwelchen State einer schon vorhandenen Instanz frage ich mich, warum "prüfe dies" und "prüfe das" dort drin sein muss und nicht vorgelagert, so dass eine Instanzerstellung erst dann durchgeführt werden muss, wenn auch alles i.O ist? Aber das hängt davon ab, wie häufig nun dieser Ausnahmefall auftritt.
Wenn das in der gleichen Kategorie wie "Datei beim Erstellen eines TFileStreams konnte nicht geöffnet werden" anzuordnen ist, dann ist das mMn schon in Ordnung. Ablauf dann so wie Uwe schon schrieb. |
AW: Constructor Rückgabewert nil-en statt Instanz zurückzugeben?
Zitat:
Zitat:
Dann wäre ich zudem auch das try-except los. Zum Schluss könnte ich, da ich den Aufruf zweimal habe, das alles in eine Prozedur packen. Dann muss ich nur an einer Stelle ändern, wenn es was zu ändern gibt. Ist schluss-endlich alles viel einfacher als Factory-Konstrukte o.ä. Edit klappt soweit ganz gut. Code ist sauber, im Konstruktor wird nur noch den Properties-Variablen zugewiesen und alle Überprüfungen sind raus. |
AW: Constructor Rückgabewert nil-en statt Instanz zurückzugeben?
Zur Ergänzung noch die Lösung per Factory-Methode:
Delphi-Quellcode:
Vorteil ist, dass du zur Verwendung nur brauchst:
TMyClass = class
public class function TryGetInstance(const AValue: string; out AInstance: TMyClass): Boolean; end; class function TMyClass.TryGetInstance(const AValue: string; out AInstance: TMyClass): Boolean; var NewInstance: TMyClass; begin NewInstance := TMyClass.Create; Result := NewInstance.Init(AValue); if Result then AInstance := NewInstance else NewInstance.Free; end;
Delphi-Quellcode:
var
MyObject: TMyClass; begin if TMyClass.TryGetInstance('blub', MyObject) then List.Add(MyObject); Besser wäre natürlich, wenn die Prüfung wie schon genannt wurde auch z.B. per Klassenmethode möglich wäre, dann müsste bei einem Fehler gar nicht erst eine dann nicht benötigte Instanz erstellt werden. |
AW: Constructor Rückgabewert nil-en statt Instanz zurückzugeben?
Zitat:
Ich habe den Code ordentlich in verschiedene Units aufgeteilt. Erst rufe ich eine Prozedur aus der ersten Unit auf. Die überprüft alle Daten und wenn alles OK ist, ruft Prozedur 1 den Constructor in einer anderen Prozedur auf. Genau eine Zeile brauche ich für diesen Aufruf. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:25 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