AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Welchen Sinn hat diese Assert Zeile?
Thema durchsuchen
Ansicht
Themen-Optionen

Welchen Sinn hat diese Assert Zeile?

Ein Thema von Popov · begonnen am 3. Jan 2014 · letzter Beitrag vom 5. Jan 2014
Antwort Antwort
Popov
(Gast)

n/a Beiträge
 
#1

Welchen Sinn hat diese Assert Zeile?

  Alt 3. Jan 2014, 20:18
Ich sehe gelegentlich im Internet in fremden Prozeduren gleich am Anfang eine Assert Zeile. Das sieht in etwa so aus wie hier im Beispiel:
Delphi-Quellcode:
procedure Beispiel(Font: TFont);
begin
  Assert(Assigned(Font));
  ...
Was Assert macht ist mir klar, auch was Assigned macht. Somit ist mir durchaus klar was die Zeile bewirkt, bzw. bewirken könnte. Ist das Objekt hier nil, gibt es eine Fehlermeldung.

Was ich aber nicht erkenne ist der Sinn dahinter. Ich kenne etwa eine halbe Million Prozeduren in denen Objekte per Parameter übergeben werden und sie kommen ohne diese Zeile aus. Es kann schon mal vorkommen, dass ein Objekt nil ist. Dann gibt es eine Fehlermeldung (auch ohne Assert), dann sucht man den Fehler, korrigiert ihn und gut ist es.

Erzählt mir einer, dass das nützlich in der Entwicklung ist, weil man dann eine eigene Fehlermeldung bekommt, dann stimme ich dem zu. Wie gesagt, während der Entwicklung. Dann aber raus.

Denn ich erkenne nicht den Sinn der Zeile im funktionierendem Programm. Entweder ist das Objekt nil, dann erkennt man das vermutlich schon in der Entwicklung, oder nicht, dann stellt sich die Frage wieso die Zeile in einer funktionierenden Prozeduren steht.

Aber vielleicht erkenne ich nur den tieferen Sinn nicht.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#2

AW: Welchen Sinn hat diese Assert Zeile?

  Alt 3. Jan 2014, 20:34
Ich glaube dass es sich hier um eine (unnötige) Optimierung handelt: Asserts werden, wenn ausgeschaltet und soweit ich mich richtig erinnere, gar nicht erst reinkompiliert!

Wenn man also nicht im Debugmodus mit Asserts arbeitet sondern im Release, dann fällt genau die eine Zeile weg.

Kann sein, dass ich falsch liege; aber sonst ergäbe es wirklich keinen SInn!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#3

AW: Welchen Sinn hat diese Assert Zeile?

  Alt 3. Jan 2014, 20:39
Kann sein, dass ich falsch liege; aber sonst ergäbe es wirklich keinen SInn!
Doch, nennt sich selbstdokumentierender Code - so sehe ich auf den ersten Blick, ob ich als Caller diesen Fall nun selber abfangen muss, oder nicht.

Abgesehen davon kann man mit solchen Asserts nicht erlaubte Zustände nahe an der potentiellen Fehlerquelle abfangen - der auftretende Defekt ist ja in der Praxis sehr oft an einer völlig anderen Stelle zu beobachten, und dann spart man sich durch solche Asserts viel Zeit und Nerven.
Leo S.

Geändert von Meflin ( 3. Jan 2014 um 20:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Welchen Sinn hat diese Assert Zeile?

  Alt 3. Jan 2014, 20:57
Korrekterweise müsste diese Zeile so im Code stehen
Delphi-Quellcode:
{$IFDEF DEBUG}
Assert( ... );
{$ENDIF}
damit diese korrekterweise nicht in den Produktivcode fließt.

Da man diese Zeilen aber in Code von Anderen für Andere findet, werden diese Zeilen dort mit eingewoben um unbedarften Programmierern so früh wie möglich die Fehler bei der Benutzung des Codes um die Ohren zu hauen.
(gerade falls der Fehler erst später in den Standard-Units zum Tragen kommt, dann heißt es öfter mal "dein Code tut nicht")

Somit ist diese Zeile nur dafür da RTFM-Rückfragen zu minimieren
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 3. Jan 2014 um 20:59 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.191 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Welchen Sinn hat diese Assert Zeile?

  Alt 3. Jan 2014, 21:12
Ohne mich damit richtig auseinandergesetzt zu haben, konnte ich mich damit nie anfreuden. Ich dokumentiere es und werfe eine EArgumentNilException wenn jemand doch eine leere Referenz reinsteckt. Läuft doch im Endeffekt aufs Gleiche raus, oder?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Welchen Sinn hat diese Assert Zeile?

  Alt 3. Jan 2014, 21:19
Ohne mich damit richtig auseinandergesetzt zu haben, konnte ich mich damit nie anfreuden. Ich dokumentiere es und werfe eine EArgumentNilException wenn jemand doch eine leere Referenz reinsteckt. Läuft doch im Endeffekt aufs Gleiche raus, oder?
Ja, allerdings ist das auch nur für den Entwickler, denn der hat einen Fehler bei der Programmierung gemacht und dann ist das Assert besser/gleichwertig/einfacher, weil dort auch die Zeilennummer mitkommt

Andere Exceptions (z.B. Socketfehler) können teilweise auch vom Anwender behoben werden (Netzwerkkabel einstecken, Server einschalten, Internetverbindung prüfen, ...) und sind nicht zwangsweise Programmierfehler sondern können auch Kontext-Fehler sein

Korrekterweise müsste diese Zeile so im Code stehen
Delphi-Quellcode:
{$IFDEF DEBUG}
Assert( ... );
{$ENDIF}
damit diese korrekterweise nicht in den Produktivcode fließt.
Nein, gerade nicht...
Wenn du Assertions in den Projektoptionen deaktivierst, wird an der Stelle kein entsprechender Code erzeugt. Das ist daher genau nicht notwendig. Genau deshalb ist es sinnvoll Assertions statt sonstigem Code beim Entwickeln zu nutzen.
Ok, übergeredet
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.869 Beiträge
 
Delphi 12 Athens
 
#7

AW: Welchen Sinn hat diese Assert Zeile?

  Alt 3. Jan 2014, 21:18
Korrekterweise müsste diese Zeile so im Code stehen
Delphi-Quellcode:
{$IFDEF DEBUG}
Assert( ... );
{$ENDIF}
damit diese korrekterweise nicht in den Produktivcode fließt.
Nein, gerade nicht...
Wenn du Assertions in den Projektoptionen deaktivierst, wird an der Stelle kein entsprechender Code erzeugt. Das ist daher genau nicht notwendig. Genau deshalb ist es sinnvoll Assertions statt sonstigem Code beim Entwickeln zu nutzen.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.869 Beiträge
 
Delphi 12 Athens
 
#8

AW: Welchen Sinn hat diese Assert Zeile?

  Alt 3. Jan 2014, 20:38
Assertions sind dafür gedacht, dass man bei der Entwicklung bestimmte problematische Werte abfangen kann, ohne dass diese Prüfungen im fertigen Programm anschlagen. Denn für ein Release kompiliert man normalerweise ohne aktivierte Assertions. Das ist in den Projektoptionen auf der Seite Compilieren und somit ohne weitere Anpassungen im Quelltext einstellbar.

Und man erhält bei einem Assert auch die Position im Quelltext, an der das Problem aufgetreten ist, ohne dafür Stacktraces usw. bemühen zu müssen.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:13 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 by Thomas Breitkreuz