Wann sollten Zusicherungen im Produktionscode bleiben? [geschlossen]

166

Unter comp.lang.c ++ wird eine Diskussion darüber geführt, ob Zusicherungen, die in C ++ standardmäßig nur in Debug-Builds vorhanden sind, im Produktionscode beibehalten werden sollen oder nicht.

Natürlich ist jedes Projekt einzigartig, daher ist meine Frage hier nicht so sehr, ob Aussagen beibehalten werden sollten, aber in welchen Fällen ist dies empfehlenswert / keine gute Idee.

Mit Behauptung meine ich:

  • Eine Laufzeitprüfung, die einen Zustand testet, der, wenn er falsch ist, einen Fehler in der Software aufdeckt.
  • Ein Mechanismus, durch den das Programm angehalten wird (möglicherweise nach wirklich minimalen Aufräumarbeiten).

Ich spreche nicht unbedingt über C oder C ++.

Meine eigene Meinung ist, dass Sie, wenn Sie der Programmierer sind, aber die Daten nicht besitzen (was bei den meisten kommerziellen Desktop-Anwendungen der Fall ist), diese beibehalten sollten, da eine fehlerhafte Bestätigung einen Fehler anzeigt und Sie nicht gehen sollten mit einem Fehler, mit dem Risiko, die Daten des Benutzers zu beschädigen. Dies zwingt Sie dazu, vor dem Versand stark zu testen, und macht Fehler besser sichtbar, sodass Sie sie leichter erkennen und beheben können.

Was ist deine Meinung / Erfahrung?

Prost,

Carl

Siehe verwandte Frage hier


Antworten und Updates

Hey Graham,

Eine Behauptung ist schlicht und einfach ein Fehler und sollte daher wie eine behandelt werden. Da ein Fehler im Release-Modus behandelt werden soll, brauchen Sie keine Assertions.

Deshalb bevorzuge ich das Wort "Bug", wenn ich über Behauptungen spreche. Es macht die Dinge viel klarer. Für mich ist das Wort "Fehler" zu vage. Eine fehlende Datei ist ein Fehler, kein Fehler, und das Programm sollte sich damit befassen. Der Versuch, einen Nullzeiger zu dereferenzieren, ist ein Fehler, und das Programm sollte anerkennen, dass etwas nach schlechtem Käse riecht.

Daher sollten Sie den Zeiger mit einer Zusicherung testen, aber das Vorhandensein der Datei mit normalem Fehlerbehandlungscode.


Etwas abseits des Themas, aber ein wichtiger Punkt in der Diskussion.

Wenn Ihre Behauptungen als Heads-up in den Debugger einbrechen, wenn sie fehlschlagen, warum nicht? Es gibt jedoch viele Gründe, warum eine Datei nicht existieren könnte, die völlig außerhalb der Kontrolle Ihres Codes liegen: Lese- / Schreibrechte, volle Festplatte, nicht angeschlossenes USB-Gerät usw. Da Sie keine Kontrolle darüber haben, sind dies meines Erachtens Behauptungen nicht der richtige Weg, um damit umzugehen.

Carl


Thomas,

Ja, ich habe Code Complete und muss sagen, dass ich diesem speziellen Rat überhaupt nicht zustimme.

Angenommen, Ihr benutzerdefinierter Speicherzuweiser ist fehlerhaft und setzt einen Speicherblock auf Null, der noch von einem anderen Objekt verwendet wird. Ich habe zufällig einen Zeiger auf Null gesetzt, den dieses Objekt regelmäßig dereferenziert, und eine der Invarianten ist, dass dieser Zeiger niemals Null ist, und Sie haben einige Aussagen, um sicherzustellen, dass dies auch so bleibt. Was machen Sie, wenn der Zeiger plötzlich null ist? Sie nur wenn () um, in der Hoffnung, dass es funktioniert?

Denken Sie daran, wir sprechen hier über Produktcode, sodass Sie nicht in den Debugger eindringen und den lokalen Status überprüfen müssen. Dies ist ein echter Fehler auf dem Computer des Benutzers.

Carl

unbekannt
quelle
3
Es gibt einen interessanten verwandten Beitrag auf der Software Engineering SE (obwohl die Diskussion auf C ++ ausgerichtet ist): Sollte es Behauptungen in Release-Builds geben
sonny

Antworten:

84

Behauptungen sind Kommentare, die nicht veraltet sind. Sie dokumentieren, welche theoretischen Zustände beabsichtigt sind und welche Zustände nicht auftreten sollten. Wenn der Code geändert wird, damit die Status geändert werden können, wird der Entwickler bald informiert und muss die Zusicherung aktualisieren.

MSalters
quelle
16
@jkschneider: Unit-Tests dienen zum Testen von Dingen im Rahmen des Programmcodes. Aussagen dienen dazu sicherzustellen, dass Annahmen, auf denen der Code basiert, tatsächlich wahr sind, bevor der Code unter diesen Annahmen weiter verarbeitet wird. Sie sind "Dokumentation" in dem Sinne, dass das Programm abbricht, die Annahme angibt und anzeigt, dass die Annahme nicht zutrifft, wenn sich herausstellt, dass dies nicht der Fall ist. Sie können die Behauptung natürlich auch als Dokumentation davon im Code lesen.
2
Dies ist die beste Antwort, da sie Behauptungen mit Kommentaren in Verbindung bringt, was eine hilfreiche Art ist, über sie nachzudenken. Sie sind ein Schritt weiter als Kommentare, da sie während der Entwicklung ständig maschinell getestet werden, aber für menschliche Leser immer zuerst von Bedeutung sein sollten. Genau wie Kommentare sollten sie nicht Teil der Logik oder der endgültigen Ausführung sein. Genau wie bei Kommentaren können Sie sie ein- oder ausschalten, je nachdem, ob die Sprache kompiliert oder interpretiert wird, Ihre Roll-out-Pläne, Ihre Verschleierungsstrategie usw. Ich habe einen Fall gesehen, in dem ein Kommentar tatsächlich einen Fehler verursacht hat, aber das war es eine seltsame.
DaveWalley
1
Insbesondere sind Behauptungen informativ und nicht funktionsfähig . Eine Behauptung an sich hat keine Auswirkung auf den Programmablauf oder die Ergebnisse. Eine Ausnahme hingegen verändert den Programmfluss und damit die Ergebnisse.
Jojo
59

Gestatten Sie mir, Steve McConnells Code Complete zu zitieren. Der Abschnitt über Behauptungen ist 8.2.

Normalerweise möchten Sie nicht, dass Benutzer Bestätigungsnachrichten im Produktionscode sehen. Aussagen sind in erster Linie für die Entwicklung und Wartung bestimmt. Zusicherungen werden normalerweise zur Entwicklungszeit in den Code kompiliert und für die Produktion aus dem Code kompiliert.

Später im selben Abschnitt wird dieser Rat gegeben:

Aktivieren Sie den Fehler für äußerst robusten Code und behandeln Sie ihn trotzdem.

Ich denke, solange die Leistung kein Problem darstellt, lassen Sie die Behauptung in, aber anstatt eine Nachricht anzuzeigen, lassen Sie sie in eine Protokolldatei schreiben. Ich denke, dass der Rat auch in Code Complete enthalten ist, aber ich finde ihn momentan nicht.

Thomas Owens
quelle
7
Ich denke, was das zweite Zitat aus Code Complete bedeutet, ist, dass Sie die Behauptung haben sollten - die im Produktionscode kompiliert wird - und Sie sollten auch "if (! Condition) {AttemptGracefulRecovery ();}" haben, dh don Lassen Sie nicht zu, dass eine Verletzung von Programminvarianten das Programm zum Absturz bringt.
Jojo
34

Lassen Sie Zusicherungen im Produktionscode aktiviert, es sei denn, Sie haben gemessen, dass das Programm bei deaktiviertem Programm erheblich schneller ausgeführt wird.

Wenn es sich nicht lohnt zu messen, um zu beweisen, dass es effizienter ist, dann lohnt es sich nicht, die Klarheit für ein Leistungsspiel zu opfern. "- Steve McConnell 1993

http://c2.com/cgi/wiki?ShipWithAssertionsOn

David Cary
quelle
11
Das Schlimmste, was passiert, ist, wenn Code aufgrund von etwas abstürzt, das KEINE Behauptung ist. Wenn der Code später definitiv mit 100% iger Wahrscheinlichkeit abstürzt, muss die Zusicherung unbedingt vorhanden sein. Wenn Sie einen Zeiger deref derieren, müssen Sie implizit behaupten, dass er vorher nicht null ist. Wenn Sie durch eine Zahl teilen, behaupten Sie, dass es nicht Null ist. Nehmen Sie die Asserts heraus und alle Absturzstellen sind NICHT DOKUMENTIERT. Das eigentliche Problem besteht nicht darin, das Programm so zu strukturieren, dass Subsysteme abstürzen und von einem Watchdog neu gestartet werden.
Rob
5
assert ref != null;ist anders als if (ref == null) throw new IllegalArgumentException();Sie sollten die erste nicht für Voraussetzungen verwenden, die falsch sein könnten. Sie müssen assertfür Dinge verwenden, die nicht falsch sein können. Beispiel, int i = -1 * someNumber; i = i * i;dann später, um die Leute daran zu erinnern, dass ipositiv ist,assert i > 0;
Captain Man
1
"Das Schlimmste, was passiert, ist, wenn Code aufgrund einer NICHT-Behauptung abstürzt. Wenn der Code später definitiv mit 100% iger Wahrscheinlichkeit abstürzt, muss die Behauptung unbedingt vorhanden sein." - Dies ist eine falsche Zweiteilung.
Rob Grant
2
@RobertGrant: Für viele Programme ist ein Absturz alles andere als das Schlimmste, was passieren kann. Für ein Programm, das die Solidität eines Gebäude- oder Brückendesigns überprüfen soll, kann die falsche Meldung, dass ein Design solide ist, fast das Schlimmste sein, was es tun kann. Bei einem Programm, das der Außenwelt ausgesetzt ist, aber nur Lesezugriff auf vertrauliche Daten hat, kann die Weitergabe dieser Daten schlimmer sein als alles andere, was das Programm tun könnte. Die Vorstellung, dass ein Absturz ohne aussagekräftigen Hinweis auf die Ursache "das Schlimmste ist, was passieren kann", ignoriert viele Gefahren, die weitaus schlimmer sind.
Supercat
@supercat Ich war mit dem Kommentar, den ich zitierte, nicht einverstanden.
Rob Grant
21

Wenn Sie sogar daran denken, Behauptungen in der Produktion zu belassen, denken Sie wahrscheinlich falsch darüber nach. Der springende Punkt bei Behauptungen ist, dass Sie sie in der Produktion ausschalten können, da sie nicht Teil Ihrer Lösung sind. Sie sind ein Entwicklungswerkzeug, mit dem überprüft wird, ob Ihre Annahmen korrekt sind. Aber wenn Sie in Produktion gehen, sollten Sie bereits Vertrauen in Ihre Annahmen haben.

Es gibt jedoch einen Fall, in dem ich Behauptungen in der Produktion aktivieren werde: Wenn wir in der Produktion auf einen reproduzierbaren Fehler stoßen, den wir in einer Testumgebung nur schwer reproduzieren können, kann es hilfreich sein, den Fehler mit aktivierten Behauptungen zu reproduzieren in der Produktion, um zu sehen, ob sie nützliche Informationen liefern.

Eine interessantere Frage lautet: Wann schalten Sie in Ihrer Testphase die Behauptungen aus?

MiguelMunoz
quelle
4
Ich denke, dass Behauptungen niemals in den Produktionscode aufgenommen werden sollten. Behauptungen sind KEINE Fehler, sondern für Entwickler gedacht. Behauptungen sollten nur im Testcode enthalten sein. Ein App-Absturz ist auf eine inakzeptable und schlampige Entwicklung zurückzuführen. Entwickler müssen die Extrameile gehen, um Fehler ordnungsgemäß zu behandeln.
Iksnae
9
Wenn es unvermeidlich ist, dass Sie abstürzen, wenn ein Nullzeiger an ein fn übergeben wird; Es gibt keine Wahl, explizit damit umzugehen. Sie haben entweder eine Möglichkeit, die Bedingung ordnungsgemäß zu behandeln (da sie von Eingaben von außen stammen kann), oder Sie stürzen an einem DOKUMENTIERTEN Ort mit einer Behauptung ab und nicht an einer zufälligen Stelle, die möglicherweise Dinge auf dem Weg beschädigt hat. Wie mit Assert umgegangen wird, sollte jedoch eine Entscheidung pro Modul sein. Möglicherweise startet Ihr Watchdog den Prozess neu oder Sie löschen einen Speicherblock für dieses Modul, um es auf den Startzustand zurückzusetzen (Soft-Objekt "Neustart").
Rob
1
Ich denke, dies ist eine eingeschränkte Sicht auf die Verwendung von Behauptungen. Ich protokolliere die Asserts immer sowohl im Konsolen- als auch im Cloud-Speicher und lasse sie in der Produktion aktiviert. Das Verlassen von Behauptungen bestätigt, dass meine Annahmen auch im Produktionscode und in der Produktionsnutzung korrekt bleiben. Nur weil Code beim Debuggen mit aktivierten Asserts einige Male erfolgreich ausgeführt wurde, bedeutet dies nicht, dass Benutzer keine Möglichkeit finden, unterschiedliche Werte über denselben Codepfad zu übergeben.
SafeFastExpressive
Der springende Punkt der assert-Anweisung ist, dass Sie die Prüfungen ein- oder ausschalten können. Wenn Sie sie in der Produktion belassen, warum sollten Sie die assert-Anweisung verwenden?
Miguel Munoz
1
Behauptungen verlangsamen oft das System. Da sie nicht für die Produktion ausgelegt sind, können sie langsam und ineffizient sein, was zur Durchführung bestimmter Tests erforderlich sein kann. Beispielsweise hat Microsoft Excel einmal eine Funktion zur schnellen Neuberechnung hinzugefügt. Wenn sich eine Zelle änderte, beschränkte diese Funktion die Neuberechnung auf nur die Zellen, die sie benötigten. Sie testeten dies mit einer Behauptung, die die gesamte Tabelle neu berechnete und die Ergebnisse verglich. Dadurch lief die Entwicklungsversion sehr langsam, aber es wurden auch viele Fehler beseitigt. Als sie diese Funktion veröffentlichten, erwies sie sich als sehr zuverlässig.
Miguel Munoz
16

Behauptungen sollten niemals im Produktionscode bleiben. Wenn eine bestimmte Behauptung im Produktionscode nützlich zu sein scheint, sollte sie keine Behauptung sein. Es sollte eine Laufzeitfehlerprüfung sein, dh etwas, das wie folgt codiert ist : if( condition != expected ) throw exception.

Der Begriff "Behauptung" bedeutet "eine Prüfung nur für die Entwicklungszeit, die nicht auf dem Feld durchgeführt wird".

Wenn Sie anfangen zu denken, dass Behauptungen es auf das Feld schaffen könnten, werden Sie unweigerlich auch andere gefährliche Gedanken machen, wie sich zu fragen, ob eine bestimmte Behauptung es wirklich wert ist, gemacht zu werden. Es gibt keine Behauptung, die es nicht wert ist, gemacht zu werden. Sie sollten sich niemals fragen: "Soll ich das behaupten oder nicht?" Sie sollten sich nur fragen: "Gibt es etwas, das ich vergessen habe zu behaupten?"

Mike Nakis
quelle
6

Sofern die Profilerstellung nicht zeigt, dass die Behauptungen Leistungsprobleme verursachen, sollten sie auch in der Produktionsversion verbleiben.

Ich denke jedoch, dass dies auch erfordert, dass Sie Assertionsfehler etwas elegant behandeln. Beispielsweise sollten sie zu einem allgemeinen Dialog führen, mit der Option, das Problem (automatisch) den Entwicklern zu melden und nicht nur das Programm zu beenden oder zum Absturz zu bringen. Sie sollten auch darauf achten, keine Behauptungen für Bedingungen zu verwenden, die Sie tatsächlich zulassen, aber möglicherweise nicht mögen oder als unerwünscht betrachten. Diese Bedingungen sollten von anderen Teilen des Codes behandelt werden.

Anders Sandvig
quelle
Aus meiner Sicht besteht der Hauptzweck einer Produktionsbehauptung in einem Notfall-Backstop: Das Fortfahren des Programms kann sehr wahrscheinlich zu Schäden führen, die so schwerwiegend sind, dass die Verhinderung wichtiger ist als alles andere, was das Programm möglicherweise tut. Eine gute Fehlermeldung wäre, wenn möglich, nett, aber das ist nur von untergeordneter Bedeutung.
Supercat
5

In meinem C ++ definiere ich REQUIRE (x), das assert (x) ähnelt, außer dass es eine Ausnahme auslöst, wenn die Assertion in einem Release-Build fehlschlägt.

Da eine fehlgeschlagene Behauptung auf einen Fehler hinweist, sollte dieser auch in einem Release-Build ernsthaft behandelt werden. Wenn die Leistung meines Codes wichtig ist, verwende ich häufig REQUIRE () für Code höherer Ebene und assert () für Code niedrigerer Ebene, der schnell ausgeführt werden muss. Ich verwende auch REQUIRE, anstatt zu behaupten, ob die Fehlerbedingung durch Daten verursacht werden kann, die aus von einem Dritten geschriebenem Code oder durch Dateibeschädigung übergeben wurden (optimalerweise würde ich den Code speziell so gestalten, dass er sich im Falle einer Dateibeschädigung gut verhält, aber wir habe nicht immer Zeit dafür.)

Sie sagen, Sie sollten diese Assert-Nachrichten nicht den Endbenutzern anzeigen, weil sie sie nicht verstehen. So? Endbenutzer senden Ihnen möglicherweise eine E-Mail mit einem Screenshot oder einem Text der Fehlermeldung, der Ihnen beim Debuggen hilft. Wenn der Benutzer einfach "es ist abgestürzt" sagt, können Sie das Problem weniger beheben. Es ist besser, die Assertion-Failure-Nachrichten automatisch über das Internet an sich selbst zu senden. Dies funktioniert jedoch nur, wenn der Benutzer über einen Internetzugang verfügt und Sie dessen Erlaubnis erhalten können.

Qwertie
quelle
Sie sagen auch, dass Sie diese Behauptungen Hackern nicht zeigen sollten, weil sie wertvolle Hinweise für den Einbruch sind.
DaveWalley
4

Wenn Sie sie behalten möchten, ersetzen Sie sie durch Fehlerbehandlung. Nichts schlimmeres als ein Programm, das einfach verschwindet. Ich sehe nichts Falsches daran, bestimmte Fehler als schwerwiegende Fehler zu behandeln, aber sie sollten an einen Abschnitt Ihres Programms weitergeleitet werden, der dafür gerüstet ist, Daten zu sammeln, zu protokollieren und den Benutzer darüber zu informieren, dass Ihre App einen unerwünschten Zustand aufweist ist aufregend.

Bruceatk
quelle
2

Vorausgesetzt, sie werden wie jeder andere Fehler behandelt, sehe ich kein Problem damit. Beachten Sie jedoch, dass fehlgeschlagene Zusicherungen in C wie in anderen Sprachen das Programm nur beenden und dies für Produktionssysteme normalerweise nicht ausreicht.

Es gibt einige Ausnahmen: Mit PHP können Sie beispielsweise einen benutzerdefinierten Handler für Assertionsfehler erstellen, damit Sie benutzerdefinierte Fehler anzeigen, detaillierte Protokolle erstellen usw. können, anstatt nur zu beenden.

Steve M.
quelle
2

Unsere Datenbankserversoftware enthält sowohl Produktions- als auch Debug-Zusicherungen. Debug-Zusicherungen sind genau das - sie werden im Produktionscode entfernt. Produktionsbehauptungen treten nur auf, wenn (a) ein Zustand vorliegt, der niemals existieren sollte , und (b) es nicht möglich ist, diesen Zustand zuverlässig wiederherzustellen. Eine Produktionszusicherung zeigt an, dass ein Fehler in der Software aufgetreten ist oder eine Art Datenbeschädigung aufgetreten ist.

Da es sich um ein Datenbanksystem handelt und wir potenziell unternehmenskritische Daten speichern, tun wir alles, um beschädigte Daten zu vermeiden. Wenn eine Bedingung vorliegt, die dazu führen kann, dass wir falsche Daten speichern, bestätigen wir sofort, setzen alle Transaktionen zurück und stoppen den Server.

Wir versuchen jedoch auch, Produktionsaussagen in leistungskritischen Routinen zu vermeiden.

Graeme Perrow
quelle
5
Ich würde Ihre "Produktionsbehauptung" als "Ausnahme" bezeichnen und als solche codieren.
DaveWalley
1
Sie haben wahrscheinlich Recht, aber das Produkt wurde ursprünglich in C geschrieben. Selbst als wir es in C ++ geändert haben, haben die Compiler, die wir auf einigen unserer Plattformen verwendet haben, Ausnahmen nicht richtig unterstützt. Der größte Teil des alten Codes wurde in C ++ nicht neu geschrieben, daher werden diese Aussagen weiterhin verwendet.
Graeme Perrow
1

Ich sehe Behauptungen als Inline-Unit-Tests. Nützlich für einen schnellen Test während der Entwicklung, aber letztendlich sollten diese Behauptungen überarbeitet werden, um in Unit-Tests extern getestet zu werden.

Weston
quelle
Behauptung: Geben Sie eine Tatsache oder einen Glauben an. Sie dienen nicht zum Testen (nur), sondern zum Feststellen dessen, was Sie für wahr halten (dh Ihrer Annahmen), sodass Ihr Programm nicht fortgesetzt wird, wenn Ihre Annahmen aus irgendeinem Grund falsch sind. Dies ist beispielsweise eine gültige Verwendung von Behauptungen: assert (pow (1,0) <1). Es ist nicht wirklich ein geeigneter Ort für die Fehlerprüfung, denn wenn das nicht stimmt, ist so ziemlich die gesamte moderne Mathematik falsch, und ... nun, wie würden Sie überhaupt damit umgehen? Der Umgang mit dieser falschen Annahme liegt außerhalb des Programmumfangs. du nimmst es im Glauben. Aber Sie überprüfen trotzdem.
1

Ich finde es am besten, alle Fehler zu behandeln, die im Umfang liegen, und Aussagen für Annahmen zu verwenden, von denen wir behaupten, dass sie wahr sind.

Wenn Ihr Programm eine Datei öffnet / liest / schließt, ist es nicht möglich, die Datei nicht öffnen zu können. Dies ist eine echte Möglichkeit, die mit anderen Worten fahrlässig ignoriert werden könnte. Dem sollte also ein Fehlerprüfcode zugeordnet sein.

Nehmen wir jedoch an, dass fopen () so dokumentiert ist, dass es immer ein gültiges, offenes Dateihandle zurückgibt. Sie öffnen die Datei und übergeben sie an Ihre Funktion readfile ().

Diese Readfile-Funktion kann in diesem Zusammenhang und wahrscheinlich gemäß ihrer Designspezifikation ziemlich genau davon ausgehen, dass sie eine gültige Datei ptr erhalten wird. Es wäre also verschwenderisch, in einem so einfachen Programm Fehlerbehandlungscode für den negativen Fall hinzuzufügen. Es sollte jedoch zumindest die Annahme dokumentieren, dass dies tatsächlich der Fall ist, bevor die Ausführung fortgesetzt wird. Es sollte nicht WIRKLICH davon ausgegangen werden, dass dies immer gültig ist, falls es falsch aufgerufen oder beispielsweise in ein anderes Programm kopiert / eingefügt wird.

Also, readfile () {assert (fptr! = NULL); ..} ist in diesem Fall angemessen, während dies bei einer vollständigen Fehlerbehandlung nicht der Fall ist (das Ignorieren der Tatsache, dass das tatsächliche Lesen der Datei ohnehin ein Fehlerbehandlungssystem erfordern würde).

Und ja, diese Behauptungen sollten im Produktionscode bleiben, es sei denn, es ist absolut notwendig, sie zu deaktivieren. Selbst dann sollten Sie sie wahrscheinlich nur in leistungskritischen Abschnitten deaktivieren.

Lee
quelle
1

Angenommen, ein Code befindet sich in der Produktion und trifft auf eine Behauptung, die normalerweise ausgelöst wird. Die Behauptung hat einen Fehler gefunden! Außer es hat nicht, weil die Behauptung ausgeschaltet ist.

Also was passiert jetzt? Entweder stürzt das Programm (1) an einem weiter von der Ursache des Problems entfernten Punkt auf nicht informative Weise ab oder (2) läuft fröhlich bis zum Abschluss, was wahrscheinlich zu einem falschen Ergebnis führt.

Keines der beiden Szenarien ist einladend. Lassen Sie Behauptungen auch in der Produktion aktiv.

Mörder Murmeltier
quelle
0

Ich verwende Assertions selten für andere Zwecke als die Überprüfung des Kompilierzeittyps. Ich würde eine Ausnahme anstelle einer Behauptung verwenden, nur weil die meisten Sprachen dafür ausgelegt sind.

Ich biete ein Beispiel

file = create-some-file();
_throwExceptionIf( file.exists() == false, "FILE DOES NOT EXIST");

gegen

file = create-some-file();
ASSERT(file.exists());

Wie würde die Anwendung mit der Behauptung umgehen? Ich bevorzuge die alte try catchMethode, mit schwerwiegenden Fehlern umzugehen.

roo
quelle
2
Ausnahmen sind ungewöhnliche Situationen, die Sie in einer funktionierenden Anwendung erwarten, wie in Ihrem Beispiel hier. Behauptungen beziehen sich auf Situationen, von denen Sie erwarten, dass sie niemals auftreten. Wenn Sie ihnen begegnen, muss Ihr Code einen Fehler enthalten. In Ihrem Beispiel ist eine Ausnahme eindeutig der richtige Ansatz. Aber Behauptungen sind immer noch sehr nützlich, um Fehler zu erkennen.
MiguelMunoz
0

Die meiste Zeit, wenn ich Assertion in Java (das Assert-Schlüsselwort) verwende, füge ich danach automatisch einige Produktionscodes hinzu. Je nach Fall kann es sich um eine Protokollierungsnachricht, eine Ausnahme oder nichts handeln.

Meiner Meinung nach sind alle Ihre Behauptungen in der Entwicklungsversion von entscheidender Bedeutung, nicht in der Produktionsfreigabe. Einige von ihnen müssen aufbewahrt werden, andere müssen verworfen werden.

Nicolas
quelle
0

Behauptungen sind keine Fehler und sollten nicht als Fehler behandelt werden. Wenn eine Zusicherung ausgelöst wird, bedeutet dies, dass Ihr Code oder alternativ der Code, der Ihren Code aufruft, einen Fehler enthält.

Es gibt einige Punkte, um das Aktivieren von Zusicherungen im Produktionscode zu vermeiden: 1. Sie möchten nicht, dass Ihrem Endbenutzer eine Meldung wie "ASSERTION failed MyPrivateClass.cpp Zeile 147" angezeigt wird. Der Endbenutzer ist NICHT Ihr QS-Ingenieur. 2. ASSERTION könnte Leistung beeinflussen

Es gibt jedoch einen starken Grund, Aussagen zu hinterlassen: ASSERTION kann die Leistung und das Timing beeinflussen, und leider ist dies manchmal wichtig (insbesondere in eingebetteten Systemen).

Ich neige dazu, dafür zu stimmen, dass die Behauptung im Produktionscode aktiviert bleibt, aber ich stelle sicher, dass diese Ausdrucke nicht dem Endbenutzer zugänglich sind.

~ Yitzik

Yitshak Yarom
quelle
Nein, Aussagen beziehen sich auf angenommene Tatsachen. Wenn unser Code 27 zurückgibt, wenn angenommen wird, dass er IMMER 25 zurückgibt, könnte das Problem auch ein Fehler in unseren physikalischen Annahmen über das Universum sein: Vielleicht wurden diese beiden Bits zum ersten Mal in der Geschichte des Rechnens auf den möglichen Wert 5 umgeschaltet. Die Behauptung soll bestätigen, dass Ihr Code immer noch unter den Annahmen funktioniert, für die er geschrieben wurde. Wenn die Physik aus dem Fenster geht, sollte Ihr Code es bemerken, das Laufwerk in Ruhe lassen und beenden, während es voraus ist;) Aber ja, es ist kein Fehler im Code, und welche Art von Fehlerbehandlung könnten Sie tun?
Gestatten Sie mir, meine Meinung zu verfeinern: 1. Behauptung überprüfen Sie unsere Annahmen. Wenn unsere Annahmen falsch sind, bedeutet dies, dass unser Code einen Fehler enthält. 2. Unser Code sollte die Verwendung unseres Codes nicht bestätigen. Das heißt, eine Funktion sollte bei der Bestätigung nicht fehlschlagen, wenn bei der Eingabe durch den Benutzer etwas nicht stimmt. Wir werden Fehler zurückgeben und der Benutzer sollte damit umgehen (er kann Erfolg behaupten). 3. Ich ziehe es vor, die Behauptung in der Produktion zu belassen - aber das Verhalten wird wahrscheinlich geändert. Ich bin damit einverstanden, dass es keine angemessene Fehlerbehandlung gibt. Fehlerhafte Behauptung == Fehler .. aber das System kann sich neu starten, anstatt anzuhalten und auf einen Neustart zu warten.
Yitshak Yarom
1
es bedeutet nicht unbedingt, dass es einen Fehler gibt. Zum Beispiel enthalten viele der Projekte, an denen ich beteiligt bin, eine Liste der angenommenen Fakten in der Dokumentation. Diese Annahmen sollen den Entwicklercode davor schützen, als fehlerhaft bezeichnet zu werden, wenn Geschäftsleute ihnen möglicherweise das Falsche gesagt haben oder wenn beispielsweise keine Informationen von Dritten über bestimmte Variablen verfügbar sind. Mithilfe von Zusicherungen kann überprüft werden, ob das Programm ausgeführt werden soll oder nicht, ob Systeme von Drittanbietern korrekt sind und nicht nur, ob die IT korrekt ist.
-8

Eine Behauptung ist schlicht und einfach ein Fehler und sollte daher wie eine behandelt werden.

Da ein Fehler im Release-Modus behandelt werden soll, brauchen Sie keine Assertions.

Der Hauptvorteil, den ich für Behauptungen sehe, ist eine bedingte Unterbrechung - sie sind viel einfacher einzurichten, als durch die Fenster von VC zu bohren, um etwas einzurichten, das 1 Codezeile benötigt.

graham.reeds
quelle
2
Die Verwendung von Asserts als bedingte Haltepunkte ist aus mehreren Gründen sehr ärgerlich. Das Wichtigste ist, dass diese Behauptungen andere Entwickler im Team verwirren - wie würden sie wissen, ob es sich um einen Fehler handelt, wenn diese Behauptung ausgelöst wird, oder ob jemand seinen bedingten Haltepunkt im Code belassen hat?
Lego
Es würde keine geben, wenn Asserts überhaupt nicht im Code enthalten wären. Und wenn Sie sie nur zur Überwachung von Code verwenden würden, würden Sie sie sehen (es sei denn, Sie würden sie in den Quellbaum einchecken). Ich habe an Orten gearbeitet, an denen praktisch alles behauptet wird. Wenn Sie zu Beginn des Programms etwa 60 Mal klicken müssen, weil der Hilfedokumentationsserver nicht verfügbar ist, wird dies sehr schnell mühsam.
Graham.reeds