AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Create abbrechen

Ein Thema von Masterj44 · begonnen am 13. Mai 2007 · letzter Beitrag vom 14. Mai 2007
Antwort Antwort
Seite 1 von 2  1 2      
Masterj44

Registriert seit: 12. Nov 2005
38 Beiträge
 
#1

Create abbrechen

  Alt 13. Mai 2007, 19:52
Hi Leute,
hab da mal ne Frage

Kann man ein Create abbrechen?

Also ich habe ein Create Methode, die sich bei bestimmten Voraussetzungen selbst mit self.destroy zerstört.

Frage:
1. Ist es so möglich die Instanz zu löschen?
2. Wenn ja, wieso gib die varible die auf die Instanz zeigt nicht nil?
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Create abbrechen

  Alt 13. Mai 2007, 20:10
Weil Destroy nur das Objekt freigibt und nicht auf Nil setzt. Verwende anstelle dessen doch FreeAndNil.
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Create abbrechen

  Alt 13. Mai 2007, 20:12
Aber vielleicht wäre es besser es erst garn icht zu erzeugen
Markus Kinzler
  Mit Zitat antworten Zitat
Masterj44

Registriert seit: 12. Nov 2005
38 Beiträge
 
#4

Re: Create abbrechen

  Alt 13. Mai 2007, 20:19
@ GuenterS FreeandNil klapt nicht da es mit self.destroy zerstört werden muss

Anders geht es leider nicht. Als ich brauch nur eine Methode die mir sagt, dass die Erzeugung des Objekts nicht geklappt hat.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Create abbrechen

  Alt 13. Mai 2007, 20:23
Moin Master,

wenn sich im Konstruktor eine Konstellation ergibt, die die Instanzierung sinnlos machen könntest Du einfach eine Exception auslösen, so dass die Stelle, die den Konstruktor aufgerufen hat darauf reagieren kann.


Delphi-Quellcode:
type
  TMyClass = class(TObject)
  public
    constructor Create;
  end;

procedure IrgendEine;

var
  tmc : TMyClass;

begin
  try
    tmc := TMyClass.Create;
    try
      // Tu was mit der Instanz
    finally
      FreeAnNil(tmc);
    end;
  except
    // Hier eine passende Meldung ausgeben
  end;
end;

constructor TMyClass.Create;
begin
  inherited;
  if FalscheVoraussetzung then raise Exception.Create('Fehler');
end;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Create abbrechen

  Alt 13. Mai 2007, 21:03
Zitat von Christian Seehase:
wenn sich im Konstruktor eine Konstellation ergibt, die die Instanzierung sinnlos machen könntest Du einfach eine Exception auslösen, so dass die Stelle, die den Konstruktor aufgerufen hat darauf reagieren kann.
Eine Ausnahme im Konstruktor sollte schon zum Freigeben des Objektes führen. Doppeltes Freigeben ist nicht so nett.
Das ist auch der Grund, warum man das Instanzieren vor den berühmt-berüchtigten try-finally-free-Block schreibt.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Create abbrechen

  Alt 13. Mai 2007, 21:05
Meiner Meinung nach sollte man keine Konsistenzprüfung in einem Konstruktor vornehmen. Das ist zwar Geschmackssache, aber in meinen Augen durchaus sinnvoll: Beim Erstellen einer Instanz weiss ich noch gar nicht, ob sie später mal konsistenz ist oder nicht (gemäß der Theorie).

Entweder implementiere ich das in einer Class Function und rufe die VOR der Instantiierung auf (praktisch, aber uncool), oder ich prüfe die Konsiszenz über eine stinknormale Methode, die die Eigenschaften, die ich ja (reine Lehre) erst zuweisen muss, naturgemäß bei der Instantiierung noch nicht bekannt sind.

In seltenen Fällen (siehe TFileStream) kann es aber durchaus Sinn machen (bzw. die Tipparbeit erheblich verkürzen und zu lesbarerem Code führen), Eigenschaften in einem Konstruktor zu übergeben und eine Prüfung während der Instantiierung vorzunehmen. Dann wird eine Exception ausgelöst, wie es hier auch schon erwähnt wurde. Es wird -soweit ich weiss- kein Speicher alloziiert, sodaß die Instanz auch nicht freigegeben werden muss.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Create abbrechen

  Alt 13. Mai 2007, 21:07
Wie Chris schon schrieb, so würd ich das auch lösen. Anstatt einer einfachen Exception würd ich eventuell eine Assertion auslösen. Denn genau dafür sind die da.

Das ist ein typisches Beispiel. Im Construtor der Klasse müssen gewisse Bedingungen erfüllt sein, damit die Klasse überhaupt Sinn macht. z.B. wenn ein Datensatz aus einem Dataset in einer Klasse abgebildet werden soll, so empfiehlt es sich, im constructor den Primary Key des Datensatz anzugeben. Gibt es den nicht, macht eine Instanz eventuell keinen Sinn.

Eine Assertion ist eine Art von exception, die Dir aber bequemerweise aber in der Fehlermeldung auch gleich noch die Zeilennummer in deinem Code ausgibt, in der die Assertion ausgelöst wurde.
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Create abbrechen

  Alt 13. Mai 2007, 21:23
Zitat von alzaimar:
Meiner Meinung nach sollte man keine Konsistenzprüfung in einem Konstruktor vornehmen. Das ist zwar Geschmackssache, aber in meinen Augen durchaus sinnvoll: Beim Erstellen einer Instanz weiss ich noch gar nicht, ob sie später mal konsistenz ist oder nicht (gemäß der Theorie).
Jain.

Für stinknormale Klassen, die transiente oder persistente Daten deines Applikationsmodelles halten mag das zutreffen.
Aber es wird immer wieder Klassen geben, die sich immer in einem konsistenten Zustand befinden müssen.
Ein FileStream wäre so ein Fall.

Zitat:
Entweder implementiere ich das in einer Class Function und rufe die VOR der Instantiierung auf (praktisch, aber uncool)...
Klassische Factory, IMHO sogar sehr cool, da de Prüfung vor dem Allozieren von Speicher passieren kann.
Zitat:
, oder ich prüfe die Konsiszenz über eine stinknormale Methode, die die Eigenschaften, die ich ja (reine Lehre) erst zuweisen muss, naturgemäß bei der Instantiierung noch nicht bekannt sind.
Das Zuweisen einzelnener Eigenschaften lässt es aber nicht zu einen konsistenten Zustand zu garantieren.
Änder ich Eigenschaft1 zu "X" wäre meine Instanz vllt ouchy banana und der Setter springt mir ins Gesicht.
Er kann ja nicht wissen, dass ich Eigenschaft2 direkt danach auch "Y" ändern wollte.
Ein Konstruktor, dem beide Werte übergeben werden, und der sie in einer "Transaktion" ändern kann ist hier natürlich vorteilhaft.
Genau wie es oben genannte Factory wäre.
Zitat:
In seltenen Fällen (siehe TFileStream) kann es aber durchaus Sinn machen (bzw. die Tipparbeit erheblich verkürzen und zu lesbarerem Code führen), Eigenschaften in einem Konstruktor zu übergeben und eine Prüfung während der Instantiierung vorzunehmen.
Selten ist Tipparbeit, sondern Konsistenz die Motivation dahinter.
Zitat:
Dann wird eine Exception ausgelöst, wie es hier auch schon erwähnt wurde. Es wird -soweit ich weiss- kein Speicher alloziiert, sodaß die Instanz auch nicht freigegeben werden muss.
Der Konstruktor wird nach NewInstance ausgeführt, also nachdem Speicher reserviert wurde.
In der Kette der einzelnen Calls, die irgendwann zu einer fertigen Instanz führen, wird aber beim Auftreten einer Exception die neue Instanz sofort freigegeben.


Zitat von Jelly:
Wie Chris schon schrieb, so würd ich das auch lösen. Anstatt einer einfachen Exception würd ich eventuell eine Assertion auslösen. Denn genau dafür sind die da.
...
Eine Assertion ist eine Art von exception, die Dir aber bequemerweise aber in der Fehlermeldung auch gleich noch die Zeilennummer in deinem Code ausgibt, in der die Assertion ausgelöst wurde.
Au weia.
Assertions sind dafür da deinen Code zu prüfen. Niemals um Dinge zu prüfen, die von außen/ von Benutzern deiner Klasse rein geworfen wurden.
Denn Assertions werden normalerweise im Release ausgeschaltet.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Create abbrechen

  Alt 13. Mai 2007, 21:26
eine assertion so wie "assert(boolean, string)"?

wird die nicht im final build deaktiviert?

//wie elvis sagte.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 14:50 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