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?
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?
Antworten:
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.
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.