Code Contracts en .Net

Descripción general

La idea de expresar contratos en código (CC de ahora en adelante) no es precisamente nueva. Como muchas ideas que ahora nos parecen relativamente nuevas y que van entrando en el uso habitual de todos los programadores (lambdas, linq) o no tan nuevas ya (garbage collection, por ejemplo), la idea de los CC viene ya de antiguo. Bertrand Meyer los consideraba una parte crucial de Eiffel, allá por los 80.

Code Contracts en .Net (parte 1).

Intruducción a los Code Contracts

La idea de expresar contratos en código (CC de ahora en adelante) no es precisamente nueva. Como muchas ideas que ahora nos parecen relativamente nuevas y que van entrando en el uso habitual de todos los programadores (lambdas, linq) o no tan nuevas ya (garbage collection, por ejemplo), la idea de los CC viene ya de antiguo. Bertrand Meyer los consideraba una parte crucial de Eiffel, allá por los 80.

El concepto fundamentalmente es el de hacer el código más claro eliminando funcionalidad boilerplate mediante la declaración de contratos, de manera que nuestros métodos sean más reducidos eliminando mucha funcionalidad no relacionada con la propia del método, como chequear si los argumentos pasados son o no null, etc. Se trata, en suma, de separar los requerimientos – y las garantías – de una API de su implementación per se.

Por ejemplo, en un método como este

static int CountWhitespace(string text)
{
    if (text == null)
    {
         throw new ArgumentNullException("text");
    }
    return text.Count(char.IsWhiteSpace);
}

Vemos que lo que podía ser una implementación de una sola línea, en realidad son ahora 5. De esas 5, 4 no tienen nada que ver con la funcionalidad del método. Es cierto que podemos eliminar las llaves e incluso condensar la condición en una sola línea, pero aún así al método parece que le “sobrase” algo, algo que podríamos eliminar expresándolo de otra manera, anotaciones, atributos customizados, contratos, etc.

Los CC en el entorno .net viene de un lenguaje experimental que sacó Microsoft Research, llamado Spec#, que básicamente era un dialecto de C#, pero con esta funcionalidad de contratos ya incorporados. El método anterior, expresado en C# quedaría así

static int CountWhitespace(string! text)
{
    return text.Count(char.IsWhiteSpace);
}

En mi opinión mucho más limpio. El signo de admiración tras el tipo string indica que el atributo no puede ser nulo. El entorno ya se ocupa de validar esto en tiempo de ejecución.

Usando Code Contracts en .net

El namespace a usar es System.Diagnostics.Contracts, donde reside la clase Contract, como era de esperar (no hay que importar ninguna referencia a ninguna dll, cuidado con liarse e importar como referencia Microsoft.Contracts, que nos dará errores al compilar). La única pega es que las herramientas que nos permiten usar CC en .net no vienen en VS 2010 o .net 4, si bien los tipos si están expuestos en mscorlib. Descargamos las herramientas para Code Contracts en esta página de Microsoft Research.

Tipos de Contrato

Herramientas


↑↑↑

A.2.Enlaces

[Para saber mas]

Referencia bibliográfica

http://aelena.com/blog/2012/04/22/code-contracts-en-net/
[MSDN] - Contratos de código
[Grupo de documentos]
[Documento Index]
[Documento Start]
[Imprimir el Documento]
© 1997 - - La Güeb de Joaquín
Joaquín Medina Serrano
Ésta página es española

Codificación
Fecha de creación
Última actualización
[HTML5 Desarrollado usando CSS3]