Design by Contract – O Retorno (?)
Creio que foi Bertrand Meyer, o autor da linguagem Eiffel, quem primeiro falou sobre Design by Contract: um estilo de projetar e implementar código onde contratos formais (interfaces) precisos e verificáveis definem o comportamento de um método, função, classe ou sistema.
Houve neste estilo, certamente, uma forte influência do trabalho sobre prova formal, baseado em lógica, da corretude de um programa. Nela a definição de précondições, póscondições e invariantes (chamadas de assertivas) nos ajudavam a definir e verificar algoritmos.
Eiffel foi a primeira linguagem que vi que incorporou pré e pós condições na linguagem, e logo a técnica se espalhou para outras, como o ASSERT do C/C++.
Estou contando isto porque além de gostar deste estilo temos agora ferramentas mais poderosas que você pode utilizar no seu código .Net hoje:
- O Code.Contracts que é uma biblioteca .Net mais um ambiente de apoio em tempo de codificação, integrado ao Visual Studio, que você pode usar para fazer cheques de assertivas em tempo de execução e/ou tempo de compilação;
- O Pex que é um gerador de Testes Unitários que usa também as assertivas de précondição escritas com o Code.Contracts para garantir um teste mais conciso, já desconsiderando, por exemplo, parâmetros inválidos que já devem ter sido checados pelo Code.Contracts.
O primeiro exemplo que testei, o Binary Search que acompanha o Code.Contracts, já foi espantoso. Ao compilar o exemplo ele me sugeriu 7 assertivas e me fez descobrir que faltava o teste de uma condição. Veja abaixo algumas da assertivas sugeridas:
public static int BinarySearch(int[] array, int value)
{
// Assertivas sugeridas pelo Code.Contracts:
Contract.Requires(array != null);
Contract.Ensures(Contract.Result<int>()>= -1);
Contract.Ensures(Contract.Result<int>() < array.Length);
O que achei mais admirável foi poder fazer testes em tempo de compilação. O mais comum até agora era só ter as assertivas nos ajudando em tempo de execução.
Uma das maiores críticas ao uso de assertivas sempre foi a dificuldade de encontrar profissionais treinados na sua definição e uso, principalmente na definição de invariantes. Creio que isto aconteceu principalmente porque estas técnicas não contavam com ferramentas de apoio, daí tanto o ensino quanto a prática não terem sido difundidas como deveriam. Uma pena...
Fica aqui então a minha sugestão para os professores, alunos e interessados em aperfeiçoar a corretude da definição e implementação de seu código: hora de voltar às boas práticas!
Quanto aos que já usam o Design by Contract: aproveitem as novas ferramentas!
PS.: Uau!!! Só agora ví (um dia depois) que o Somesegar escreveu sobre este mesmo assunto na semana passada! Um post bem mais completo que este e que você pode ler em: https://blogs.msdn.com/somasegar/archive/2009/02/23/devlabs-code-contracts-for-net.aspx.
Comments
- Anonymous
February 28, 2009
PingBack from http://www.clickandsolve.com/?p=16175