¿Qué es un diseño por contrato®?
Design by Contract® es un método utilizado para desarrollar software que se basa en el establecimiento de parámetros de interfaz bien definidos, o contratos, para todas las partes de un programa. Aunque Design by Contract® puede verse como un estilo de desarrollo conceptual que se implementa a través de la documentación o el modelado, se usa más ampliamente para referirse a un mecanismo nativo o de terceros dentro de algunos lenguajes de programación que realmente requiere la codificación implícita de los contratos dentro de un programa. El objetivo al usar Design by Contract® es que se desarrolle un programa y, eventualmente, se codifique de una manera mucho más completa que elimine errores más triviales, mientras que la ejecución de los contratos por el lenguaje de soporte hace que cualquier error residual sea fácilmente encontrado y capturado. Un programa que utiliza contratos para funciones y clases puede tener un diseño más modular en el que las clases individuales se pueden reutilizar fácilmente en otros programas debido a la definición clara de sus contratos.
La base de la filosofía de programación Design by Contract® es la idea de los contratos comerciales del mundo real. En este modelo, cada método y clase en un programa orientado a objetos define un contrato por el cual debe cumplir cualquier otro método u objeto que interactúe con él. Cada clase también puede tener un contrato, llamado invariante de clase, que debe seguir internamente para garantizar que los contratos externos no comprometan su capacidad de funcionar.
Las dos partes de un contrato que son más importantes durante el diseño y la codificación son las condiciones previas y las condiciones posteriores. Estas dos partes del modelo Design by Contract® definen el estado del programa antes de que se llame a un método y el estado del programa después de que el método haya completado la ejecución. Otras partes de un contrato pueden variar según la implementación, pero pueden incluir referencias cruzadas a otros módulos, condiciones de sincronización y requisitos de orden de ejecución.
Al desarrollar contratos para cada clase y método, la interacción de las diferentes partes de un programa se puede mapear y predecir fácilmente. La ejecución de los contratos, ya sea mediante el uso de aserciones u otros mecanismos, también asegura que el programa no intentará ejecutarse si hay una violación de los contratos, porque cualquier salida producida en ese estado sería técnicamente inválida de todos modos. Cuando se implementa como una función de idioma nativo, Design by Contract® puede ayudar a garantizar que un producto final funcione como se espera con pocas posibilidades de errores imprevistos.
Algunas de las complicaciones que vienen con el uso de la filosofía Design by Contract® incluyen tiempos de diseño más largos y un desarrollo más granular de un sistema antes de que comience la codificación, lo que a veces puede ser difícil con un proyecto grande. Más prácticamente, el mecanismo de validación de contratos utilizado en un lenguaje de programación que admite de forma nativa los contratos puede ralentizar la ejecución del programa. Una comprensión deficiente de la metodología Design by Contract® puede conducir a un programa que utiliza contratos para realizar una verificación básica de errores, lo que puede conducir a una aplicación que es propensa a fallas repentinas después del lanzamiento.