it-swarm.com.de

Was macht die Assert () -Methode? Ist es immer noch nützlich?

Ich debugge mit Haltepunkten und erkenne den Assert-Aufruf? Ich dachte, es sei nur für Unit-Tests. Was macht es mehr als Haltepunkt? Warum sollte ich Assert verwenden, da ich einen Haltepunkt setzen kann?

145
Pokus

In einer Debug-Kompilierung verwendet Assert eine Boolesche Bedingung als Parameter und zeigt den Fehlerdialog an, wenn die Bedingung falsch ist. Das Programm wird ohne Unterbrechung fortgesetzt, wenn die Bedingung erfüllt ist.

Wenn Sie in Release kompilieren, werden alle Debug.Assert 's werden automatisch ausgelassen.

184

From Code Complete

8 Defensive Programmierung

8.2 Behauptungen

Eine Behauptung ist Code, der während der Entwicklung verwendet wird - normalerweise eine Routine oder ein Makro - und der es einem Programm ermöglicht, sich während der Ausführung selbst zu überprüfen. Wenn eine Behauptung wahr ist, bedeutet dies, dass alles wie erwartet funktioniert. Wenn es falsch ist, hat es einen unerwarteten Fehler im Code festgestellt. Wenn das System beispielsweise davon ausgeht, dass eine Kundeninformationsdatei niemals mehr als 50.000 Datensätze enthält, enthält das Programm möglicherweise die Annahme, dass die Anzahl der Datensätze kleiner oder gleich 50.000 ist. Solange die Anzahl der Datensätze kleiner oder gleich 50.000 ist, wird die Zusicherung stummgeschaltet. Wenn es jedoch auf mehr als 50.000 Datensätze stößt, wird lautstark "behauptet", dass ein Fehler im Programm vorliegt.

Behauptungen sind besonders nützlich in großen, komplizierten Programmen und in Programmen mit hoher Zuverlässigkeit. Sie ermöglichen es Programmierern, nicht übereinstimmende Schnittstellenannahmen, Fehler, die sich beim Ändern des Codes einschleichen, usw. schneller auszublenden.

Eine Behauptung benötigt normalerweise zwei Argumente: einen booleschen Ausdruck, der die Annahme beschreibt, dass sie wahr sein soll, und eine Meldung, die angezeigt wird, wenn dies nicht der Fall ist.

(…)

Normalerweise möchten Sie nicht, dass Benutzer Assertionsnachrichten im Produktionscode sehen. Behauptungen gelten hauptsächlich für die Entwicklung und Wartung. Zusicherungen werden normalerweise zur Entwicklungszeit in den Code kompiliert und für die Produktion aus dem Code kompiliert. Während der Entwicklung werden durch Zusicherungen widersprüchliche Annahmen, unerwartete Bedingungen, schlechte Werte, die an Routinen übergeben wurden, usw. gelöscht. Während der Produktion werden sie aus dem Code kompiliert, damit die Zusicherungen die Systemleistung nicht beeinträchtigen.

90
juan

Sie sollten es für Zeiten verwenden, in denen Sie nicht jede kleine Codezeile unterbrechen müssen, um Variablen zu überprüfen, aber Sie möchten eine Art Feedback erhalten, wenn bestimmte Situationen vorliegen, zum Beispiel:

Debug.Assert(someObject != null, "someObject is null! this could totally be a bug!");
37
thelsdj

Assert bietet Ihnen außerdem eine weitere Gelegenheit, sich über die Fähigkeiten von Microsoft bei der Gestaltung von Benutzeroberflächen zu unterhalten. Ich meine: Ein Dialog mit drei Schaltflächen Abbrechen, Wiederholen, Ignorieren und einer Erklärung, wie man sie in der Titelleiste interpretiert!

12
Joe

Durch Aktivieren können Sie festlegen, dass eine Bedingung (Post oder Pre) in Ihrem Code gilt. Auf diese Weise können Sie Ihre Absichten dokumentieren und sich vom Debugger in einem Dialogfeld informieren lassen, wenn Ihre Absicht nicht erfüllt wird.

Im Gegensatz zu einem Haltepunkt gehört die Zusicherung zu Ihrem Code und kann verwendet werden, um zusätzliche Details zu Ihrer Absicht hinzuzufügen.

9
Jeff Yates

Assert kann Ihnen dabei helfen, ein getrenntes Messaging-Verhalten zwischen Test und Veröffentlichung festzulegen. Beispielsweise,

Debug.Assert(x > 2)

wird nur dann eine Unterbrechung auslösen, wenn Sie einen "Debug" -Build ausführen, keinen Release-Build. Es gibt ein vollständiges Beispiel für dieses Verhalten hier

9
Ryan

Zunächst ist die Methode Assert() für die Klassen Trace und Debug verfügbar.
Debug.Assert() wird nur im Debug-Modus ausgeführt.
Trace.Assert() wird im Debug- und Release-Modus ausgeführt.

Hier ist ein Beispiel:

        int i = 1 + 3;
        // Debug.Assert method in Debug mode fails, since i == 4
        Debug.Assert(i == 3);
        Debug.WriteLine(i == 3, "i is equal to 3");

        // Trace.Assert method in Release mode is not failing.
        Trace.Assert(i == 4);
        Trace.WriteLine(i == 4, "i is equla to 4");

        Console.WriteLine("Press a key to continue...");
        Console.ReadLine();

Führen Sie diesen Code im Debug-Modus und dann im Release-Modus aus.

enter image description here

Sie werden feststellen, dass während des Debug-Modus Ihre Code-Anweisung Debug.Assert Fehlschlägt und Sie ein Meldungsfeld erhalten, das den aktuellen Stack-Trace der Anwendung anzeigt. Dies geschieht nicht im Freigabemodus, da die Bedingung Trace.Assert() wahr ist (i == 4).

Die Methode WriteLine() bietet Ihnen lediglich die Möglichkeit, die Informationen in der Visual Studio-Ausgabe zu protokollieren. enter image description here

6

Behauptungen spielen in Design by Contract (DbC) eine wichtige Rolle, die meines Wissens von Meyer, Bertand, eingeführt/gebilligt wurde. 1997. Objektorientierte Software-Konstruktion.

Ein wichtiges Merkmal ist, dass sie keine Nebenwirkungen hervorrufen dürfen. Beispielsweise können Sie mit einer if-Anweisung (defensive Programmierung) eine Ausnahme behandeln oder eine andere Vorgehensweise wählen.

Behauptungen dienen zur Überprüfung der Vor-/Nachbedingungen des Vertrages, der Kunden/Lieferanten-Beziehung - der Kunde muss sicherstellen, dass die Voraussetzungen des Lieferanten erfüllt sind, z. sendet £ 5 und der Lieferant muss sicherstellen, dass die Post-Bedingungen erfüllt sind, z. liefert 12 Rosen. (Nur einfache Erklärung des Kunden/Lieferanten - kann weniger akzeptieren und mehr liefern, aber über Behauptungen). C # führt auch Trace.Assert () ein, das für den Release-Code verwendet werden kann.

Um die Frage mit Ja zu beantworten, sind sie immer noch nützlich, können aber die Komplexität und Lesbarkeit von Code und Zeit erhöhen und sind schwer zu pflegen. Sollen wir sie noch benutzen? Ja, werden wir sie alle benutzen? Wahrscheinlich nicht oder nicht so, wie Meyer es beschreibt.

(Sogar der OU-Kurs Java, in dem ich diese Technik gelernt habe, zeigte nur einfache Beispiele, und der Rest des Codes erzwang nicht die DbC-Assertionsregeln für den größten Teil des Codes, sondern sollte verwendet werden, um die Programmkorrektheit sicherzustellen! )

3
Knightlore

Meiner Meinung nach handelt es sich bei Debug.Assert um eine Methode, mit der ein Vertrag über den Aufruf einer Methode geschlossen werden kann, wobei der Schwerpunkt auf den Werten eines Parameters (statt nur auf dem Typ) liegt. Wenn Sie beispielsweise im zweiten Parameter keine Null senden sollen, fügen Sie die Zusicherung um diesen Parameter hinzu, um den Verbraucher anzuweisen, dies nicht zu tun.

Es verhindert, dass jemand Ihren Code ohne Kopf benutzt. Aber es ermöglicht auch, dass dieser blödsinnige Weg zur Produktion führt und nicht die böse Botschaft an einen Kunden weitergibt (vorausgesetzt, Sie erstellen einen Release-Build).

3
Flory