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.