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 documentación o 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 de usar Design by Contract® es que se desarrolle un programa y, eventualmente, se codifique de una manera mucho más completa que elimine los errores más triviales, mientras que la ejecución de los contratos por el lenguaje de apoyo hace que cualquier error residual se encuentre y capture fácilmente. Un programa que usa 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 clara definición de sus contratos.
La base de la filosofía de programación Design by Contract® es la idea de 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 cualquier otro método u objeto que interactúe con él debe cumplir. 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 funcionamiento.
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 terminado de ejecutarse. 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 afirmaciones u otros mecanismos, también asegura que el programa no intentará ejecutarse si hay una violación de los contratos, porque cualquier producto producido en ese estado sería técnicamente inválido de todos modos. Cuando se implementa como una característica del 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 surgen 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. De manera más práctica, el mecanismo de validación de contratos utilizado en un lenguaje de programación que admite contratos de forma nativa puede ralentizar la ejecución del programa. Una comprensión deficiente de la metodología Design by Contract® puede llevar 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 bloqueos repentinos después del lanzamiento.