Diferencias entre diseño por contrato y programación defensiva

Respuestas:

30

El diseño por contrato y la programación defensiva son, en cierto sentido, opuestos entre sí: en DbC, usted define contratos entre colaboradores y programa bajo el supuesto de que los colaboradores cumplen sus contratos. En la programación defensiva, usted programa bajo el supuesto de que sus colaboradores violan sus contratos.

Una rutina de raíz cuadrada real escrita en estilo DbC indicaría en su contrato que no se le permite pasar un número negativo y luego simplemente supondrá que nunca puede encontrar un número negativo. Una rutina de raíz cuadrada real escrita a la defensiva supondría que se pasa un número negativo y tomaría las precauciones adecuadas.

Nota: por supuesto, es posible que en DbC alguien más verifique el contrato. En Eiffel, por ejemplo, el sistema de contrato verificaría un número negativo en tiempo de ejecución y lanzaría una excepción apropiada. En Spec #, el probador de teoremas verificaría los números negativos en el momento de la compilación y fallaría la compilación, si no puede probar que la rutina nunca pasará un número negativo. La diferencia es que el programador no hace esta verificación.

Jörg W Mittag
fuente
7

¿Podría Designing by Contract (DbC) ser una forma de programar a la defensiva?

Sí.

La "programación defensiva" suele ser una excusa para perder el tiempo. A menudo se pierde el tiempo buscando cosas que causen excepciones comunes. En lugar de las excepciones, se escriben declaraciones IF adicionales en lugar de cláusulas de manejo de excepciones.

Defina el contrato y termine con él.

Cuando alguien viola el contrato, el programa, en el curso normal de los eventos, romperá y generará excepciones normales que normalmente se pueden manejar.

Se puede mostrar que la "programación defensiva" y la "prevención de errores" agregan errores (porque las comprobaciones de prevención de errores son erróneas) en lugar de evitar errores.

El manejo de excepciones puede silenciar, registrar y manejar una excepción mucho mejor que la "Programación Defensiva".

S.Lott
fuente
66
La programación defensiva es más que solo declaraciones. Incluye revisiones de código, análisis estático, auditorías de seguridad, pautas de codificación segura y más. Además, el uso de excepciones y el manejo de excepciones (en lugar de simplemente dejar que el programa se bloquee y se queme) se considera una técnica de programación defensiva.
Thomas Owens
2
@ThomasOwens: Eso suena como "Buen desarrollo de software". Solo he visto que la programación defensiva se utiliza como una excusa para escribir muchas declaraciones IF (o aserciones) que fallan antes de que se generen excepciones. No llamaría a su larga lista de ideas realmente buenas "Programación defensiva". Llamaría a su lista de buenas ideas "Programación". De esa manera, podemos separar el desperdicio de tiempo de todas las cosas inteligentes que usted enumera.
S.Lott
2
Prefiero llamar a esas "buenas ideas cuando escribo código", pero cuando me enseñaron sobre programación defensiva, me enseñaron que se refería a todas y cada una de las técnicas con el propósito expreso de garantizar la seguridad de un sistema. . Tal vez sea una definición demasiado amplia, o tal vez sea una definición incorrecta, pero es lo que me enseñaron. He visto a personas llamar a las declaraciones y afirmaciones de "programación defensiva", pero según la definición que me enseñaron, no lo llamaría así (excepto en los casos en que no necesariamente tiene mejores opciones, como excepciones).
Thomas Owens
@ThomasOwens: "Quizás sea una definición demasiado amplia". De acuerdo. Parece una gran lista de verificación de buenas ideas.
S.Lott
2
-1: No veo cómo DbC es una forma de programar a la defensiva, son básicamente opuestos. Dudo que sea común hacer programación defensiva solo para perder el tiempo. Y "se puede demostrar que agrega errores" necesita una cita porque no es del todo obvio.
Mark