Microsoft Code Contracts

1.083 visualizaciones

Publicado el

Presentació que vaig donar al CodeCamp 2009 de Tarragona sobre Code Contracts!

0 comentarios
1 recomendación
Estadísticas
Notas
  • Sé el primero en comentar

Sin descargas
Visualizaciones
Visualizaciones totales
1.083
En SlideShare
0
De insertados
0
Número de insertados
2
Acciones
Compartido
0
Descargas
9
Comentarios
0
Recomendaciones
1
Insertados 0
No insertados

No hay notas en la diapositiva.

Microsoft Code Contracts

  1. 1. CodeContracts<br />Somos desarrolladores, no futbolistas… los contratos están para cumplirlos<br />EduardTomàs<br />eduard.tomas@raona.com<br />
  2. 2. Algunas cosillas a comentar…<br />Introducción<br />Precondiciones<br />Postcondiciones<br />Invariantes<br />Métodos puros (pero no castos)<br />Sandcastle! <br />
  3. 3. Introducción<br />Que es CodeContracts?<br />Actualmente… un proyecto de Microsoft Research<br />http://research.microsoft.com/en-us/projects/contracts/<br />En un futuro… Parte integral de .NET 4.0<br />Aunque… la beta1 de VS2010 tiene una versión desactualizada<br />Última versión (hasta ahora): 03 Sep 2009.<br />
  4. 4. Introducción<br />Para qué sirve CodeContracts?<br />Librería para poder especificar contratos en .NET<br />Independiente del lenguaje (C#, F#, VB.NET)<br />Basada en atributos<br />Se puede instalar sobre VS2008 o sobre VS2010 Beta 1<br />
  5. 5. Introducción<br />La evaluación de contratos NO está activa por defecto<br />Puede habilitarse para DEBUG y/o RELEASE<br />Solo precondiciones<br />Solo precondiciones y postcondiciones<br />Todo<br />También podemos especificar el comportamiento por defecto<br />Assert o excepción Contract.Exception<br />
  6. 6. Introducción<br />Contratos<br />Permiten especificar<br />Precondiciones<br />Postcondiciones<br />Invariantes de objeto<br />
  7. 7. Precondiciones<br />Condiciones que la llamada a un método debe satisfacer<br />Si no se cumplen la llamada no es válida<br />No debería compilar<br />El llamante debe poder comprobar que su llamada cumple las precondiciones<br />Debe conocerlas… y poderlas comprobar!<br />
  8. 8. Precondiciones<br />Se representan mediante la llamada al método Contract.Requires.<br />Si la condición especificada en Requires no se cumple, la precondición no és válida…<br />… Ya, y entonces… ¿qué ocurre?<br />Por defecto: Assert o excepción<br />
  9. 9. Precondiciones<br />Contract.Requires(condición)<br />Assert o lanza Contract.Exception si la condición no se cumple<br />Nota: Contract.Exception es interna.<br />Contract.Requires<TEx>(condición)<br />Assert o lanza TEx si condición no se cumple<br />
  10. 10. Precondiciones<br />Cuantificadores<br />Especificar Contratos sobre elementos de una colección<br />ForAll -> Se cumple si todos los elementos de la colección cumplen una condición<br />Exists -> Se cumple el contrato si un elemento de la colección cumple la condición<br />Pero… ya tenemos Linq! <br />
  11. 11. Postcondiciones<br />Se evalúan cuando se retorna de un método<br />Puede retornarse de un método de dos maneres<br />Correctamente (return o fin)<br />Por error (excepción)<br />Puede haber precondiciones distintas en función de si se sale correctamente o por error.<br />
  12. 12. Postcondiciones<br />Métodos <br />Contract.Ensures<br />Contract.EnsuresOnThrow<TEx><br />Assert o lanzan excepción ContractException si la postcondición no se cumple<br />
  13. 13. Postcondiciones<br />Postcondiciones se colocan al principio del método…<br />… pero se evalúan cuando se sale del método<br />Problema: Como acceder al valor de retorno?<br />
  14. 14. Postcondiciones<br />intFoo(int i)<br /> {<br />Contract.Requires(i >= 0);<br />varret = i + 1;<br />Contract.Ensures(ret > 0);<br />returnret;<br /> }<br />No compila porque Ensures no está al principio del método<br />… pero si lo pongo al principio NO PUEDO acceder a ret, porque no está definida!<br />Contract.ReturnValue<T ><br />
  15. 15. Invariantes<br />La invariante es un conjunto de condiciones que deben cumplirse siempre en el ciclo de vida de un objeto<br />Las invariantes se comprueban después de cada llamada a un método público del objeto<br />
  16. 16. Invariantes<br />Se definen un método decorado con el atributo [ContractInvariantMethod]<br />Lista de llamadas a Contract.Invariant con las condiciones a cumplir<br />
  17. 17. Interfaces<br />Las interfaces pueden definir contratos<br />Las interfaces no pueden tener código…<br />… donde ponemos las llamadas a Contract?<br />En cada clase?<br />No porque entonces el contrato sería de cada clase, no de la interfaz!<br />Solución<br />Clase de contratos<br />
  18. 18. Interfaces<br />Clase de contratos<br />Clase que implementa una interfaz de forma explícita y contiene sólo los contratos para la interfaz<br />Clases que implementan la interfaz no deben redefinir los contratos…<br />Atributos [ContractClass] y [ContractClassFor] sirven para identificar la clase de contrato<br />
  19. 19. Métodos puros<br />Un método puro es un método que no tiene efectos laterales visibles para el llamante<br />No modifican el estado del objeto<br />Contract.Requires y Contract.Ensurespueden llamar a métodos, pero deben ser siempre métodos puros.<br />
  20. 20. Métodos puros<br />Se consideran métodos puros<br />Getters de propiedades<br />Operadores<br />Cualquier método que pertenezca a las clases de<br />System.Diagnostics.Contracts.Contract<br />System.String<br />System.IO.Path<br />System.Type<br />Cualquier método decorado con [Pure]<br />
  21. 21. Herencia de contratos<br />Si una clase B es derivada de A los contratos definidos en A se aplican a B, y…<br />Los métodos redefinidos en B no pueden añadir precondiciones<br />Los métodos redefinidos en B si pueden añadir postcondiciones<br />Los invariantes se heredan (en la clase B se comprueban los de A y B automáticamente).<br />
  22. 22. Análisis estático<br />Existe una herramienta que realiza análisis estático de los contratos<br />Es una tarea compleja, y la mayoría de contratos no pueden comprobarse en tiempo de compilación<br />
  23. 23. CustomRewriter<br />Usar un customrewriter permite cambiar el comportamiento cuando un contrato no se cumple…<br />... P.ej. Guardarlo en un log<br />El customrewriter es una clase estática pública que debe contener determinados métodos<br />Desde VS podemos indicar que customrewriter usar<br />
  24. 24. CustomRewriter<br />Métodos “comunes”<br />Requires -> Se ejecuta cuando se evalúa un Requires<br />Requires<E> -> Se ejecuta cuando se evalúa un Requires y no se lanzan Asserts<br />ReportFailure -> Se ejecuta cuando falla una validación de contrato y debe reportarse el fallo<br />
  25. 25. UnitTests y Contratos (i)<br />Usar Contract.Requires y desmarcar la checkbox de Asserts<br />Se lanzarán ContractException<br />Poco interesante ya que<br />ContractException es privada, no podemos usar [ExpectedException]<br />
  26. 26. UnitTests y Contratos (ii)<br />Usar Requires<TEx> en lugar de Requires<br />Podemos usar [ExpectedException] <br />Modificamos el comportamiento en run-time de nuestros contratos <br />Funciona para precondiciones pero no para postcondiciones ni invariantes <br />
  27. 27. UnitTests y Contratos (iii)<br />Usar ContractFailed<br />Evento que se lanza cuando falla un contrato<br />No modificamos el comportamiento en run-time de nuestros contratos <br />Funciona para cualquier tipo de violación de contrato <br />
  28. 28. Sandcastle<br />Con la última versión (¡por fin!) podemos documentar los contratos!!! <br />CodeContracts lleva un “parche” para SandCastle para entender nuevos tagsxml relacionados con contratos…<br /><requires>, <ensures>, <pure>,….<br />
  29. 29. ¿Preguntas ?Estooo… pero facilillas, eh?? ;-)<br />Recuerda que en www.codecamp.es podrás encontrar todo el material de las sesiones del CodeCamp<br />

×