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
Seite 1 von 2  1 2      
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 jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#3

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
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

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

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
 
#5

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.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

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 jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#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
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  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
 
#8

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
Furtbichler
(Gast)

n/a Beiträge
 
#9

AW: Welchen Sinn hat diese Assert Zeile?

  Alt 3. Jan 2014, 23:21
Nennt sich übrigens 'fail fast'. Genauergesagt sind das ca. 5% von Fail fast und noch genauer ist das nur dann fail fast, wenn die Assertions mit kompiliert werden.
Das fail fast Paradigma sorgt dafür, das ein System zum frühestmöglichen Zeitpunkt meckert. Ohne das Assert/If würde die Klasse mit Sicherhiet auch irgendwo knallen, aber erst später.

Zu fail fast gehört u.a. auch, das ein Iterator (for in) meckert, wenn versucht wird, die Enumeration (aka die Liste) zu verändern, während man durch sie durch iteriert. Ich glaube, Delphi ist hier noch nicht so weit.

Ich musste mich auch daran gewöhnen. Macht den Code ein wenig unleserlicher, finde ich, aber wenn man es kennt, ist es wirklich ein Teil der Spezifikation/Dokumentation. In C# kann man das mit Attributen (Annotations) machen. Irgendwo gabs vor kurzem hier einen interessanten Thread darüber.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#10

AW: Welchen Sinn hat diese Assert Zeile?

  Alt 3. Jan 2014, 23:41
Assertions kann man wie so eine Art Pre- oder Post-Condition verwenden. Ich habe das z.B. letztens exzessiv eingesetzt, als ich (a,b)-Bäume implementiert habe. Und da ist es durchaus sinnvoll, wenn der Assert-Code nicht in der Release-Fassung landet, weil einige der Prüfungen, ob der Baum gültig ist, recht kompliziert sind, sodass die Laufzeitgarantien mit dem Assertion-Code nicht eingehalten werden würden.

Exceptions sollte man an Stellen einsetzen, wo der Fehler durch falsche Benutzung wirklich ausgelöst werden könnte. Assertions kann man dagegen in Fällen einsetzen, die theoretisch gar nicht auftreten sollten.

Z.B. beim (a,b)-Baum sollte es ja theoretisch nie passieren, dass Invarianten des Baumes kaputt gehen, egal was der Benutzer damit anstellt. Aber bei der Entwicklung macht man immer erst mal was falsch und da hilft sowas beim Debuggen enorm. Wenn man Ende dann alles läuft, könnte man den Assertion-Code natürlich prinzipiell wieder rauslöschen, aber wenn man ihn schon mal hat, ist es doch besser, ihn gleich drinzulassen, denn das hilft ja auch dem menschlichen Leser.
  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 22:55 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