Ist Assert Sinnvoll / Assert Und Exceptions
 
StartSeite | IstAssertSinnvoll/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

"Ein assert(), das eine Funktion hat und deswegen da stehen muss, ist immer ein Fehler.": Das geht mir zu weit: Wenn das assert das Scheitern einer Methode (z.B. weil notwendiger Input = Null ist) dem Aufrufer durch eine Exception auf nicht übersehbare Weise anzeigt, so ist das IMHO eine notwendige Assertion, ungeachtet der Frage, ob man das auch anders (z.B. "if (input == 0) then throw new Exception") ausdrücken kann; Assertions sind nach meiner Auffassung in erster Linie als Kurzform zur Auslösung spezieller Exceptions (Verletzung anwendungsbezogener Bedingungen) anzusehen, und in AssertionVermeidung habe ich aufzuzeigen versucht, wie man viele in diesem Sinne notwendigen Assertions vermeiden kann, indem man sie auf statische Typprüfungen zurückführt, oder redundante Assertions, indem man eine Programmiersprache benutzt, die optionale Variablen zu deklarieren erlaubt, oder indem man Programme aus so kleinen und überschaubaren Bröckchen aufbaut, dass man Assertions als an sich selbst gerichtete Misstrauenserklärungen nicht nötig hat. --kg

Das trifft aber auf den assert()-Mechanismus in C oder C++ einfach nicht zu. Vermutlich kommt ein Teil des Missverständnisses daher, dass Erwartungen aus anderen Sprachen, wie die Contracts von Eiffel oder ein Mechanismus zum Auslösen von Exceptions mit einer abgekürzten Syntax mit dem assert-Mechanismus von C und C++ geistig vermengt werden. assert() in C kann so nicht verwendet werden. Mit Exceptions hat es wenig zu tun. Ein assert(), das nutzlos ist, weil es ja abgeschaltet werden kann ist etwas völlig anderes als der assert()-Mechanismus in C oder C++. Auf den assert-Mechanismus von Java trifft die Argumentation ebenfalls nicht zu. Verletzte assert-Bedingungen werfen einen java.lang.AssertionError? der von java.lang.Error abgeleitet ist. Die Intention von Error ist aber nicht, dass ein Programm mit einem Throwable von diesem Typ rechnen muss und damit umgehen sollte. Insofern ist auch der assert-Mechanismus in Java keine vereinfachte Syntax zum Werfen von Exceptions. require und ensure in Eiffel sind eine spezielle Syntax zum Werfen von Exceptions, aber dahinter steckt ein anders Paradigma als hinter assert in C oder C++ und dem assert-Mechanismus von Java. -- KurtWatzka

Ich war in der Tat davon ausgegangen, dass unter "IstAssertSinnvoll" diese Frage allgemein, und nicht nur in Bezug auf C und C++ diskutiert werden darf, und dass man dabei eine eigene Auffassung von Assertions einbringen darf. --kg

Es sind aber zwei verschiedene Fragen:
Assertions als Kurzschreibweise für if (!bedingung) throw Exception() sind ein deutlich anderer Mechanismus als assert(). assert() muss immer überflüssig sein, weil es eine besondere Art von Dokumentation ist, die zur Laufzeit überprüft werden kann. assert() ist mit DesignByContract nicht direkt vergleichbar, und wohl auch nicht mit dem, woran Du denkts, wenn Du von Assertions redest. Deswegen halte ich es nicht für sinnvoll, assert() - wie in C, C++ und Java implementiert - und Assertions - die Exceptions werfen - so zu diskutierten, als ob man vom gleichen Konzept sprechen würde. -- kw

StartSeite | IstAssertSinnvoll/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 19. August 2002 13:58 (diff))
Suchbegriff: gesucht wird
im Titel
im Text