Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Constructor Rückgabewert nil-en statt Instanz zurückzugeben? (https://www.delphipraxis.net/195957-constructor-rueckgabewert-nil-en-statt-instanz-zurueckzugeben.html)

günni0 11. Apr 2018 08:12


Constructor Rückgabewert nil-en statt Instanz zurückzugeben?
 
In einem Konstruktor einer Klasse verarbeite ich eine Stringvariable. Wenn der Inhalt in irgendeiner Art und Weise korrupt ist, wird im Constructor nichts weiter verarbeitet.

Das Problem ist, dass ich diese Klasseninstanz beim Erzeugen in eine generische TObjectList<> packe:
Delphi-Quellcode:
GenerischeTObjectList.Add(Klasse.Create(Parameter));
Wenn im Konstruktor nun wegen korrupter Daten keine weiteren Daten vorbereitet werden, soll ein Schlussstrich gezogen werden und diese Instanz nicht in die generische TObjectList gepackt werden.

Wie bewerkstellige ich das?

freimatz 11. Apr 2018 08:31

AW: Constructor Rückgabewert nil-en statt Instanz zurückzugeben?
 
Im constructor eine exception raisen und außen dann entsprechend behandeln.
Oder das ganze Design überarbeiten. Solche Dinge gehören eigentlich nicht in einen Konstruktor.

günni0 11. Apr 2018 08:36

AW: Constructor Rückgabewert nil-en statt Instanz zurückzugeben?
 
Es ist nur ein String der dort verarbeitet wird. Wird so schlimm nicht sein ;)

Ansonsten hätte ich diese Verarbeitung bzw. einen Prozeduraufruf doppelt, da ich zwei Stellen habe wo ich den Constructor aufrufe.

Ist das hier ausreichend (Code ist nur zum Verständnis)

Delphi-Quellcode:
try
 InstanceX := ClassX.Create(); // raise exception im Constructor mit Nachricht für mein Log-File
except
end;

if Assigned(InstanceX) then
 GenerischeListe.Add(InstanceX);

himitsu 11. Apr 2018 10:04

AW: Constructor Rückgabewert nil-en statt Instanz zurückzugeben?
 
Kein Constructor, sondern eine Class-Function, die auch gern CreateIrgendwas heißen darf.
Da drin kannst du dann machen was du willst.

Stevie 11. Apr 2018 10:32

AW: Constructor Rückgabewert nil-en statt Instanz zurückzugeben?
 
Arbeit im Konstruktor ist ein Anti Pattern

bernau 11. Apr 2018 10:45

AW: Constructor Rückgabewert nil-en statt Instanz zurückzugeben?
 
Zitat:

Zitat von Stevie (Beitrag 1398756)

Wäre dann TFilestream.create ein Antipattern? dort wird ja auch im Constructor die Datei geöffnet.

bernau 11. Apr 2018 10:45

AW: Constructor Rückgabewert nil-en statt Instanz zurückzugeben?
 
Zitat:

Zitat von himitsu (Beitrag 1398751)
Kein Constructor, sondern eine Class-Function, die auch gern CreateIrgendwas heißen darf.
Da drin kannst du dann machen was du willst.

So würde ich das auch machen :thumb:

bzw. ich mache das so öfters.

Stevie 11. Apr 2018 10:58

AW: Constructor Rückgabewert nil-en statt Instanz zurückzugeben?
 
Zitat:

Zitat von bernau (Beitrag 1398760)
Zitat:

Zitat von Stevie (Beitrag 1398756)

Wäre dann TFilestream.create ein Antipattern? dort wird ja auch im Constructor die Datei geöffnet.

Ein TFileStream klatscht dir mit einer Exception um die Ohren, wenn die Datei aus welchen Gründen auch immer nicht geöffnet werden kann und überlässt dir nicht nil oder eine unbrauchbare Instanz - und das ist dann auch eine Ausnahme.

Da ich nicht der "niemals/immer" Typ bin, bin ich persönlich keineswegs gegen alles außer Zuweisungen im Konstruktor. Wenn das, was dort geschieht zur Objektinitialisierung dient - und ein TFileStream ist ja nunmal dafür da (gut, man könnte jetzt argumentieren, dass das eigentliche Öffnen in einer Open Methode geschehen sollte), dann lass ich das durchaus zu.

Davon abgesehen ist die RTL und VCL aber keineswegs das Maß der Dinge, wenn es um guten Stil oder Befolgung von Patterns geht ;)

günni0 11. Apr 2018 11:09

AW: Constructor Rückgabewert nil-en statt Instanz zurückzugeben?
 
Zitat:

Zitat von himitsu (Beitrag 1398751)
Kein Constructor, sondern eine Class-Function, die auch gern CreateIrgendwas heißen darf.
Da drin kannst du dann machen was du willst.

So einfach ist das nicht.
Das ist eine Klasse deren Konstruktor entweder einen Thread A oder Thread B erzeugt. Thread A hat zudem ein Notify-Event als Parameter.

Und dann kommt noch hinzu, dass meine generische Liste Instanzen dieser Klasse aufnimmt.
Einfach hier und da was ändern is nich.

bytecook 11. Apr 2018 11:13

AW: Constructor Rückgabewert nil-en statt Instanz zurückzugeben?
 
Zitat:

Zitat von Stevie (Beitrag 1398763)
Zitat:

Zitat von bernau (Beitrag 1398760)
Zitat:

Zitat von Stevie (Beitrag 1398756)

Wäre dann TFilestream.create ein Antipattern? dort wird ja auch im Constructor die Datei geöffnet.

Ein TFileStream klatscht dir mit einer Exception um die Ohren, wenn die Datei aus welchen Gründen auch immer nicht geöffnet werden kann und überlässt dir nicht nil oder eine unbrauchbare Instanz - und das ist dann auch eine Ausnahme.

Da ich nicht der "niemals/immer" Typ bin, bin ich persönlich keineswegs gegen alles außer Zuweisungen im Konstruktor. Wenn das, was dort geschieht zur Objektinitialisierung dient - und ein TFileStream ist ja nunmal dafür da (gut, man könnte jetzt argumentieren, dass das eigentliche Öffnen in einer Open Methode geschehen sollte), dann lass ich das durchaus zu.

Davon abgesehen ist die RTL und VCL aber keineswegs das Maß der Dinge, wenn es um guten Stil oder Befolgung von Patterns geht ;)

This!

Eventuell auch in diesem Zusammenhang für den Threadersteller interessant: Dependency Injections von Nick Hodges (https://leanpub.com/dependencyinjectionindelphi)
(Stevie brauchts hws nicht mehr lesen :P)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:52 Uhr.
Seite 1 von 3  1 23      

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