Skip to main content

O que é um Design by Contract®?

O Design by Contract® é um método usado para desenvolver software que se baseia no estabelecimento de parâmetros de interface bem definidos, ou contratos, para todas as partes de um programa. Embora o Design by Contract® possa ser visto como um estilo de desenvolvimento conceitual implementado por meio de documentação ou modelagem, é mais amplamente usado para se referir a um mecanismo nativo ou de terceiros em algumas linguagens de programação que realmente requer a codificação implícita dos contratos dentro um programa. O objetivo no uso do Design by Contract® é que um programa seja desenvolvido e, eventualmente, codificado de uma maneira muito mais completa que remova erros mais triviais, enquanto a execução dos contratos pela linguagem de suporte faz com que quaisquer erros residuais sejam facilmente encontrados e capturados. Um programa que usa contratos para funções e classes pode ter um design mais modular, no qual classes individuais podem ser reutilizadas facilmente em outros programas, devido à definição clara de seus contratos.

A base para a filosofia de programação Design by Contract® é a ideia de contratos comerciais no mundo real. Nesse modelo, cada método e classe em um programa orientado a objetos define um contrato pelo qual qualquer outro método ou objeto que interage com ele deve obedecer. Cada classe também pode ter um contrato, chamado de invariável, que deve seguir internamente para garantir que contratos externos não comprometam sua capacidade de funcionar.

As duas partes de um contrato que são mais importantes durante o design e a codificação são as pré-condições e as pós-condições. Essas duas partes do modelo Design by Contract® definem o estado do programa antes de um método ser chamado e o estado do programa após a conclusão da execução do método. Outras partes de um contrato podem variar de acordo com a implementação, mas podem incluir referências cruzadas para outros módulos, condições de sincronização e requisitos de ordem de execução.

Ao desenvolver contratos para cada classe e método, a interação das diferentes partes de um programa pode ser facilmente mapeada e prevista. A execução dos contratos, através do uso de asserções ou outros mecanismos, também garante que o programa não tentará executar se houver uma violação dos contratos, porque qualquer saída produzida nesse estado tecnicamente seria inválida de qualquer maneira. Quando implementado como um recurso de idioma nativo, o Design by Contract® pode ajudar a garantir que um produto final opere conforme o esperado, com poucas chances de erros imprevistos.

Algumas das complicações que vêm com o uso da filosofia Design by Contract® incluem tempos de design mais longos e desenvolvimento mais granular de um sistema antes do início da codificação, o que às vezes pode ser difícil em um projeto grande. Mais praticamente, o mecanismo de validação de contrato usado em uma linguagem de programação que oferece suporte nativo a contratos pode diminuir a execução do programa. Um fraco entendimento da metodologia Design by Contract® pode levar a um programa que usa contratos para executar a verificação básica de erros, potencialmente levando a um aplicativo propenso a falhas repentinas após o lançamento.