Descobri recentemente o Design by Contract (DbC) e considero uma maneira extremamente interessante de escrever código. Entre outras coisas, parece oferecer:
- Melhor documentação. Como o contrato é a documentação, é impossível ficar desatualizado. Além disso, como o contrato especifica exatamente o que uma rotina faz, ajuda a dar suporte à reutilização.
- Depuração mais simples. Como a execução do programa para no momento em que um contrato falha, os erros não podem se propagar e a asserção específica violada será presumivelmente destacada. Isso oferece suporte durante o desenvolvimento e a manutenção.
- Melhor análise estática. DbC é basicamente apenas uma implementação da lógica Hoare, e os mesmos princípios devem ser aplicados.
Os custos, em comparação, parecem ser bastante pequenos:
- Digitação extra com os dedos. Desde que os contratos têm que ser explicitados.
- É necessário algum treinamento para se sentir confortável com a redação de contratos.
Agora, familiarizando-me principalmente com o Python, percebo que é de fato possível escrever pré-condições (apenas lançando exceções para entrada inadequada) e é ainda possível usar asserções para testar novamente certas pós-condições. Mas não é possível simular certos recursos, como 'antigo' ou 'resultado', sem alguma mágica extra que seria considerada não-pitonica. (Além disso, existem algumas bibliotecas que oferecem suporte, mas, no final das contas, entendi que seria errado usá-las, como a maioria dos desenvolvedores não.) Suponho que seja um problema semelhante para todos os outros idiomas (exceto, é claro) Eiffel).
Minha intuição me diz que a falta de apoio deve ser resultado de algum tipo de rejeição da prática, mas a pesquisa on-line não foi proveitosa. Gostaria de saber se alguém pode esclarecer por que a maioria das linguagens modernas parece oferecer tão pouco apoio. O DbC é defeituoso ou muito caro? Ou é apenas obsoleto devido à programação extrema e outras metodologias?