Unterschiede zwischen Design by Contract und Defensive Programming

26

Könnte Designing by Contract (DbC) eine Möglichkeit sein, defensiv zu programmieren?

Ist eine Art der Programmierung in manchen Fällen besser als die andere?

Gabriel Fair
quelle

Antworten:

30

Design by Contract und defensive Programmierung sind in gewisser Weise gegensätzlich: In DbC definieren Sie Verträge zwischen Mitarbeitern und programmieren unter der Annahme, dass die Mitarbeiter ihre Verträge einhalten. Bei der defensiven Programmierung programmieren Sie unter der Annahme, dass Ihre Mitarbeiter gegen ihre Verträge verstoßen .

Eine echte Quadratwurzel-Routine, die im DbC-Stil geschrieben wurde, würde in ihrem Vertrag angeben, dass Sie keine negative Zahl übergeben dürfen, und dann einfach annehmen, dass sie niemals auf eine negative Zahl stoßen kann. Eine echte Quadratwurzel-Routine, die defensiv geschrieben wurde, würde davon ausgehen, dass eine negative Zahl übergeben wird, und entsprechende Vorsichtsmaßnahmen treffen.

Hinweis: Es ist natürlich möglich, dass in DbC jemand anderes den Vertrag überprüft. In Eiffel würde das Vertragssystem beispielsweise zur Laufzeit nach einer negativen Zahl suchen und eine entsprechende Ausnahme auslösen. In Spec # würde der Theorembeweiser beim Kompilieren nach negativen Zahlen suchen und den Build nicht bestehen, wenn er nicht nachweisen kann, dass die Routine niemals eine negative Zahl erhält. Der Unterschied besteht darin, dass der Programmierer diese Prüfung nicht durchführt.

Jörg W. Mittag
quelle
7

Könnte Designing by Contract (DbC) eine Möglichkeit sein, defensiv zu programmieren?

Ja.

"Defensive Programming" ist oft eine Ausrede, um Zeit zu verschwenden. Oft verschwendet es Zeit, nach Dingen zu suchen, die zu gewöhnlichen Ausnahmen führen. Anstelle der Ausnahmen werden zusätzliche IF-Anweisungen anstelle von Ausnahmebehandlungsklauseln geschrieben.

Definieren Sie den Vertrag und erledigen Sie ihn.

Wenn jemand gegen den Vertrag verstößt, bricht das Programm - im Normalfall - und löst normale Ausnahmen aus, die normalerweise behandelt werden können.

"Defensives Programmieren" und "Fehlervermeidung" können angezeigt werden, um Fehler hinzuzufügen (da die Fehlervermeidungsprüfungen selbst fehlerhaft sind), anstatt Fehler zu verhindern.

Die Ausnahmebehandlung kann eine Ausnahme weitaus besser als "Defensive Programming" stilllegen, protokollieren und behandeln.

S.Lott
quelle
6
Defensive Programmierung ist mehr als nur if-Anweisungen. Es umfasst Codeüberprüfungen, statische Analysen, Sicherheitsüberprüfungen, Richtlinien für sicheres Codieren und mehr. Darüber hinaus wird die Verwendung von Ausnahmen und die Behandlung von Ausnahmen (im Gegensatz dazu, das Programm einfach zum Absturz bringen und brennen zu lassen) als defensive Programmiertechnik angesehen.
Thomas Owens
2
@ThomasOwens: Das klingt nach "Good Software Development". Ich habe bisher nur defensives Programmieren als Ausrede gesehen, um viele IF-Anweisungen (oder Zusicherungen) zu schreiben, die fehlschlagen, bevor normalerweise Ausnahmen ausgelöst werden. Ich würde Ihre lange Liste wirklich guter Ideen nicht als "Defensive Programming" bezeichnen. Ich würde Ihre Liste der guten Ideen "Programmieren" nennen. Auf diese Weise können wir Zeitverschwendung von allen intelligenten Dingen trennen, die Sie auflisten.
S.Lott
2
Ich bevorzuge es, diese "guten Ideen beim Schreiben von Code" selbst zu nennen, aber als ich über defensives Programmieren unterrichtet wurde, wurde mir beigebracht, dass sie sich auf alle Techniken beziehen, mit dem ausdrücklichen Ziel, die Sicherheit und Zuverlässigkeit eines Systems zu gewährleisten . Vielleicht ist das eine zu weite Definition, oder es ist eine falsche Definition, aber das wurde mir beigebracht. Ich habe Leute gesehen, die if-Anweisungen und -Aussagen als "defensive Programmierung" bezeichnet haben, aber basierend auf der Definition, die mir beigebracht wurde, würde ich es nicht so bezeichnen (außer in Fällen, in denen Sie nicht unbedingt bessere Optionen haben, wie Ausnahmen).
Thomas Owens
@ThomasOwens: "Vielleicht ist das eine zu weite Definition." Zustimmen. Es scheint eine großartige Checkliste mit guten Ideen zu sein.
S.Lott
2
-1: Ich verstehe nicht, wie man mit DbC defensiv programmieren kann, sie sind im Grunde genommen gegensätzlich. Ich bezweifle, dass es üblich ist, defensives Programmieren zu betreiben, nur um Zeit zu verschwenden. Und "kann gezeigt werden, um Fehler hinzuzufügen" muss zitiert werden, weil es überhaupt nicht offensichtlich ist.
Mark