2011-11-28 7 views
33

Aquí está mi problema. Soy un gran admirador de Diseño por contrato, estoy usando este concepto especialmente cuando desarrollo bibliotecas que pueden ser utilizadas por otros desarrolladores. Acabo de descubrir una nueva manera de hacer esto que es: Contract.Requires en lugar de Exception: Así que en lugar de tener:Contrato.Requiere el uso

public void SomeMethod(string name){ 
    if(name==null) throw new NullArgumentException("Null values not supported"); 
} 

ahora tengo:

public void SomeMethod(string name){ 
    Contract.Requires(name != null); 
} 

EDITAR: Estoy trabajando bajo VS2010 en modo de depuración.

Problema: Contract.Requires no hace nada, incluso cuando name es null!

La documentación MSDN dice:

Especifica un contrato condición previa para el método de cerramiento o propiedad.

¡Pero no se especifica nada en caso de que no se cumpla la condición!

También noté que hay otherContract.Requires sobrecargas que arrojan una excepción, muestran el mensaje ... pero entonces ¿para qué sirve Contract.Requires(Boolean)?

EDITAR respuesta continuación destacó que un plug-in debe estar instalado para tener todo el poder de Contract API pero entonces ¿qué pasa con los usuarios Mono que quieren que su código se comporte de la misma en diferentes plataformas?

+0

Puede encontrar esto útil: http://stackoverflow.com/questions/6483055/code-contracts-for-mono –

+1

Gracias por la sugerencia. Con toda esta molestia, creo que es mejor que me quede con la antigua forma de lanzar excepciones – GETah

Respuesta

23

Usted debe haga lo siguiente:

  1. Instalar los contratos código de complemento como se ha señalado nfechner
  2. Ir a las propiedades del proyecto, carpeta 'los contratos de códigos'
  3. chequeo 'Realizar tiempo de ejecución del contrato Comprobación'
  4. conmutador de modos de Asamblea "a 'Contrato estándar requiere'
  5. sustituya su Contract.Requires con Contract.Requires<SomeException> (la primera lanza System.Diagnostics.ContractException mientras que la segunda produce la excepción que ha especificado que es importante que los métodos públicos)

Eso es la configuración básica. Para una configuración más precisa, refer to the manual

Si utiliza Mono, probablemente, la clase Contrato está vacía. No he hecho esto, pero el capítulo siete del manual Contracts parece explicar cómo proporcionar su propia implementación.

+1

+1 para estos consejos. Preferiría atenerme a las excepciones en este caso. ¿Hay alguna herramienta similar para MONO? – GETah

+1

He actualizado la publicación. Espero eso ayude. –

+0

No solo estoy interesado en usar esto en MONO, sino que también busco la portabilidad de Windows a Linux y viceversa – GETah

11

Desde el Contract class docs:

Importante

Es necesario instalar un complemento de Visual Studio en hacer cumplir los contratos. El complemento Code Contracts Premium Edition le permite especificar estático y en tiempo de ejecución la comprobación de contratos de código en la página Propiedades del proyecto. Si lo hace no habilita la verificación en tiempo de ejecución, contratos como el método Contract.Ensures no arrojarán excepciones durante el tiempo de ejecución si se infringe un contrato . El complemento de Visual Studio no se envía con Visual Studio 2010 ni con el SDK de Windows.

+0

+1 para la sugerencia, pero esto resuelve el problema solo en un extremo. Por favor, consulte mis actualizaciones sobre la pregunta – GETah

2

Con un mensaje como este, generalmente es útil especificar exactamente lo que ha hecho.

Por ejemplo, no se mencionan en el mensaje original si ha instalado el VS Addon, ni que ha habilitado en los términos de las propiedades del proyecto, o que en realidad se está ejecutando en modo de lanzamiento de depuración vs, etc.

se recomienda

Re Contract.Requires vs Contract.Requires<Exception>

Contract.Requires. De acuerdo con el manual de

Si el código debe lanzar una excepción en particular en caso de fallo de una condición particular, , puede utilizar el formulario de sobrecarga genérica a continuación. (Lea la Sección 5.1 antes de comprometerse con esta forma en su código . No se puede utilizar Requires < Exn <Exn>> sin ejecutar las herramientas de contrato en todas las versiones. Si lo hace, obtendrá una cada fallo en tiempo de ejecución.)