AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Constructor Rückgabewert nil-en statt Instanz zurückzugeben?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von günni0 · begonnen am 11. Apr 2018 · letzter Beitrag vom 12. Apr 2018
Antwort Antwort
Seite 1 von 3  1 23      
günni0
(Gast)

n/a Beiträge
 
#1

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

  Alt 11. Apr 2018, 08:12
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: 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?
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.380 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 11. Apr 2018, 08:31
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.
  Mit Zitat antworten Zitat
günni0
(Gast)

n/a Beiträge
 
#3

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

  Alt 11. Apr 2018, 08:36
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);

Geändert von günni0 (11. Apr 2018 um 08:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 11. Apr 2018, 10:04
Kein Constructor, sondern eine Class-Function, die auch gern CreateIrgendwas heißen darf.
Da drin kannst du dann machen was du willst.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

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

  Alt 11. Apr 2018, 10:32
Arbeit im Konstruktor ist ein Anti Pattern
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.268 Beiträge
 
Delphi 11 Alexandria
 
#6

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

  Alt 11. Apr 2018, 10:45
Wäre dann TFilestream.create ein Antipattern? dort wird ja auch im Constructor die Datei geöffnet.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.268 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 11. Apr 2018, 10:45
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

bzw. ich mache das so öfters.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

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

  Alt 11. Apr 2018, 10:58
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
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (11. Apr 2018 um 11:01 Uhr)
  Mit Zitat antworten Zitat
günni0
(Gast)

n/a Beiträge
 
#9

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

  Alt 11. Apr 2018, 11:09
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.
  Mit Zitat antworten Zitat
Benutzerbild von bytecook
bytecook

Registriert seit: 6. Aug 2010
Ort: Dornbirn
151 Beiträge
 
Delphi 11 Alexandria
 
#10

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

  Alt 11. Apr 2018, 11:13
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 )
Peter
Was mache ich, wenn ein Bär meine Frau angreift?
Nichts. Er hat sie angegriffen, soll er doch selber sehen, wie er sich verteidigt.

Geändert von bytecook (11. Apr 2018 um 11:18 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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:13 Uhr.
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