public function double dividiere(double dividend, double divisor){
Debug.Assert ( divisor != 0 , "Divisor ist 0!" );
if( divisor != 0 ) return dividend / devisor;
return 0;
}|
|
| 3 |
Wie in meinem Post diskutiert, können Assertions auch als Design-by-Contract aufgefasst werden und sind dann nicht nur Debugwerkzeuge sondern auch Sicherungs-Konzept. Der Unterschied ist für das Verständnis von Assertions wichtig.
– LastFreeNickname 20.10.2009
|
|
| 4 |
Der große Wert von "Desgin by contract" zeigt sich, wenn mehrere Programmierer an einem Projekt arbeiten und jeder seine eigenen Klassen programmiert, die mit den Klassen der anderen Programmierer zusammenarbeiten müssen. Die Programmiersprache Eiffel beispielsweise verlangt assertions zwingend.
– RomanB 20.10.2009
|
|
| 2 |
Scheinbar verhalten sich Java und .Net in diesem Punkt unterschiedlich. In Java bewirkt folgender Code in etwa das selbe (laut Wikipedia):
if(divisor == 0) thorw now DivisiorIsNullExceptin("Divisor ist 0!"); Debug.Assert ( divisor != 0 , "Divisor ist 0!" ); //Hab den Code C# Like geschrieben, da ich den JavaSyntax nicht genau kenne. In .Net sind Assertions als Zusicherungen wärend der Entwicklung zu sehen, dies aber auch auf Kosten der Laufzeit und daher auch nicht in der Releaseversion enthalten (mit außer der Trace-Assertions wobei Microsoft hier keine exsesive Verwendung empfiehlt). – Floyd 20.10.2009
|
int stringLengthChecked(String s) {
Check.isNotNull(s);
return s.length();
}
|
|
| 2 |
Das man die Asserts mit einem Compiler-Flag deaktiveren kann ist ja auch gewollt und sinnvoll. Mann will im Releaseprodukt keine Asserts drin stehen haben, da Sie nicht zur Fehlerbehandlung gedacht sind sondern als Debug/Trace-Hilfe dienen.
– Floyd 20.10.2009
|
|
| 3 |
Ja, aber genau das unterwandert DBC! Die gelten immer und auch bei der ausgelieferten Software. Ansonsten ist der Zustand der Software nicht mehr definiert.
– LastFreeNickname 20.10.2009
|
|
| 2 |
Vestehe nicht was da das Problem ist. Asserts = Conditonal Brakepoints. Willst du die CB's auch in deinem Relaseprodukt haben? Ließ bitte mal meine Antwort. Vieleicht meinen wir beide ja auch was ganz anders.
– Floyd 20.10.2009
|
|
| 3 |
Habe deinen Post gelesen und halte ihn in einem Punkt für falsch. Assertions (allgemein, nicht nur "assert") sollten nicht nur bei der Entwicklung gelten, da sie quasi Verträge mit dem Code darstellen, die selbstverständlich auch in der ausgelieferten Version gelten. Also nicht Conditional Breakpoints, sondern Verträge nach DBC! Wenn eine Assertion nicht gilt, ist die Software undefiniert und das muss entsprechend behandelt werden.
– LastFreeNickname 20.10.2009
|
|
| 2 |
Zumindest in .Net mit dem Visual Studio sind standardmäßig im Releasebuild keine Asserts enthalten da Asserts die Build-Konstanten für Debug vorraussetzten und diese in Releasebuils nicht aktiviert sind. "Methoden der Debug-Klasse sind nicht in der Releaseversion des Programms enthalten. Sie erhöhen daher nicht den Umfang des Programms und beeinträchtigen nicht die Geschwindigkeit der Releaseversion." (Quelle MSDN) Alternative kann man ein Trace-Assert verwenden welches auch im Releasebuild enthalen sein kann.
– Floyd 20.10.2009
|
|
| 2 |
Zumindest die MSDN und der Openbook-Artikel setzten Asserts nicht in Beziehung mit "Design by contract" und sehen darin somit auch keinen Vertrag. Ich zumindest sehe Asserts als Entwicklungswerkzeug und nicht als Programmierkonzept.
– Floyd 20.10.2009
|
|
| 3 |
Ja diesen Unterschied hab ich auch festgestellt. Denke in Java (o.B.d.A.) sind Assertions eher als DBC und somit "hart" zu sehen, gerade weil das assert-Statement per Compiler-Flag deaktivierbar ist. Hab ja auch geschrieben, dass ich mich nur auf Java beziehe. ;-)
– LastFreeNickname 20.10.2009
|
|
|