Atenção: esse artigo tem uma palestra complementar. Clique e assista!

Do que trata o artigo

O artigo mostra o Code Contracts, uma das novidades do .NET 4.0, e como utilizá-lo no Visual Studio 2010.


Para que serve

Code Contracts normalmente são utilizados para implementar Design-by-Contract (DbC), uma abordagem para o design do código de uma aplicação.

Em que situação o tema é útil

Contratos de código normalmente são utilizados para deixar o código mais explícito, além de facilitar o entendimento de algumas regras de negócio. Permite ainda mais segurança, já que a análise estática de código é capaz de pegar erros de negócio em tempo de compilação.

Resumo do DevMan

Code Contracts é uma implementação da Microsoft para auxiliar na criação de código que segue a abordagem de Design-by-Contract. Os contratos de código trazem uma API independente da linguagem, parte do BCL, que pode ser chamada para criação dos contratos, além de uma ferramenta que pode ser instalada no Visual Studio 2010 e 2008 para verificação dos contratos. Utilizando contratos seu código fica explícito e fácil de entender. Contratos se baseiam em pré-condições, pós-condições e invariantes, que garantem que a entidade deve sempre atender o contrato, ou lançar um erro. A abordagem auxilia na criação de objetos sempre válidos, ou seja, que seguem um contrato para existência. Objetos que seguem contratos não precisam nunca de validação, porque se existem são válidos. É uma abordagem ainda nova no universo de .NET, e bastante diferente, que tende a se popularizar com sua introdução no .NET Framework, valendo a pena conhecer.

Validação de objetos, principalmente entidades de negócio, é um dos primeiros pontos que trato nas consultorias de arquitetura que realizo. É preocupação fundamental em qualquer aplicação, já que toda aplicação precisa validar o estado de seus objetos de alguma forma. Como bom arquiteto, sempre busco apresentar as soluções disponíveis, e no domínio deste problema há duas abordagens de modelagem que se propõem a auxiliar nesta tarefa: a programação defensiva (defensive programming) e a programação por contrato (design-by-contract, ou simplesmente DbC, e também conhecida como programming by contract).

A programação defensiva nos leva a validar constantemente o estado de nossos objetos antes de realizar alguma operação, a fim de evitar operações excepcionais. No DbC os objetos simplesmente não ficam inválidos. São abordagens muito diferentes que oferecem prós e contras. Neste artigo não vamos avaliar essas diferenças, mas vamos ver como a Microsoft incorporou o DbC no .NET Framework na forma de uma API conhecida como Code Contracts e entender como utilizá-la.

Alguns conceitos de Code Contracts são difíceis de aplicar em conjunto com outros que você talvez esteja utilizando. Um exemplo claro é o uso de invariantes com ORMs, algo praticamente impossível de ser feito, já que ORMs normalmente alteram o estado interno dos objetos, o que normalmente impede a manutenção das invariantes. E esse é só um exemplo.

Como fazíamos antes

A maioria dos desenvolvedores trabalha com algum tipo de programação defensiva, se “defendendo” de condições onde o estado do programa está diferente do que seria possível. Isso é feito verificando condições de erro, validações etc. Um exemplo muito comum está disponível na Listagem 1, onde temos uma classe que representa um carro. Este carro tem um limite de litros no tanque de combustível, e só anda para frente. A classe possui métodos de instância para encher o tanque e para fazer o carro andar, além de um método estático que permite calcular a gasolina necessária para rodar uma determinada distância. Ela pode ficar inválida, quando, por exemplo, alguém solicita que um carro ande quando não tem gasolina, ou quando tenta colocar mais gasolina do que cabe no tanque. Essa condição pode ser verificada chamando o método Validar, que retorna uma coleção de erros. Para utilizar tal classe, temos que constantemente verificar se ela é válida. Esta classe, devido à abordagem escolhida, efetivamente permite que o carro ande sem combustível, ou tenha mais combustível do que cabe no tanque, já que não há nada que impeça essas ações.

...
Quer ler esse conteúdo completo? Tenha acesso completo