SlideShare una empresa de Scribd logo
CodeContractsSomos desarrolladores, no futbolistas… los contratos están para cumplirlosEduardTomàseduard.tomas@raona.com
Algunas cosillas a comentar…IntroducciónPrecondicionesPostcondicionesInvariantesMétodos puros (pero no castos)Sandcastle! 
IntroducciónQue es CodeContracts?Actualmente… un proyecto de Microsoft Researchhttp://research.microsoft.com/en-us/projects/contracts/En un futuro… Parte integral de .NET 4.0Aunque… la beta1 de VS2010 tiene una versión desactualizadaÚltima versión (hasta ahora): 03 Sep 2009.
IntroducciónPara qué sirve CodeContracts?Librería para poder especificar contratos en .NETIndependiente del lenguaje (C#, F#, VB.NET)Basada en atributosSe puede instalar sobre VS2008 o sobre VS2010 Beta 1
IntroducciónLa evaluación de contratos NO está activa por defectoPuede habilitarse para DEBUG y/o RELEASESolo precondicionesSolo precondiciones y postcondicionesTodoTambién podemos especificar el comportamiento por defectoAssert o excepción Contract.Exception
IntroducciónContratosPermiten especificarPrecondicionesPostcondicionesInvariantes de objeto
PrecondicionesCondiciones que la llamada a un método debe satisfacerSi no se cumplen la llamada no es válidaNo debería compilarEl llamante debe poder comprobar que su llamada cumple las precondicionesDebe conocerlas… y poderlas comprobar!
PrecondicionesSe representan mediante la llamada al método Contract.Requires.Si la condición especificada en Requires no se cumple, la precondición no és válida…… Ya, y entonces… ¿qué ocurre?Por defecto: Assert o excepción
PrecondicionesContract.Requires(condición)Assert o lanza Contract.Exception si la condición no se cumpleNota: Contract.Exception es interna.Contract.Requires<TEx>(condición)Assert o lanza TEx si condición no se cumple
PrecondicionesCuantificadoresEspecificar Contratos sobre elementos de una colecciónForAll -> Se cumple si todos los elementos de la colección cumplen una condiciónExists -> Se cumple el contrato si un elemento de la colección cumple la condiciónPero… ya tenemos Linq! 
PostcondicionesSe evalúan cuando se retorna de un métodoPuede retornarse de un método de dos maneresCorrectamente (return o fin)Por error (excepción)Puede haber precondiciones distintas en función de si se sale correctamente o por error.
PostcondicionesMétodos Contract.EnsuresContract.EnsuresOnThrow<TEx>Assert o lanzan excepción ContractException si la postcondición no se cumple
PostcondicionesPostcondiciones se colocan al principio del método…… pero se evalúan cuando se sale del métodoProblema: Como acceder al valor de retorno?
PostcondicionesintFoo(int i)        {Contract.Requires(i >= 0);varret = i + 1;Contract.Ensures(ret > 0);returnret;        }No compila porque Ensures no está al principio del método… pero si lo pongo al principio NO PUEDO acceder a ret, porque no está definida!Contract.ReturnValue<T >
InvariantesLa invariante es un conjunto de condiciones que deben cumplirse siempre en el ciclo de vida de un objetoLas invariantes se comprueban después de cada llamada a un método público del objeto
InvariantesSe definen un método decorado con el atributo [ContractInvariantMethod]Lista de llamadas a Contract.Invariant con las condiciones a cumplir
InterfacesLas interfaces pueden definir contratosLas interfaces no pueden tener código…… donde ponemos las llamadas a Contract?En cada clase?No porque entonces el contrato sería de cada clase, no de la interfaz!SoluciónClase de contratos
InterfacesClase de contratosClase que implementa una interfaz de forma explícita y contiene sólo los contratos para la interfazClases que implementan la interfaz no deben redefinir los contratos…Atributos [ContractClass] y [ContractClassFor] sirven para identificar la clase de contrato
Métodos purosUn método puro es un método que no tiene efectos laterales visibles para el llamanteNo modifican el estado del objetoContract.Requires y Contract.Ensurespueden llamar a métodos, pero deben ser siempre métodos puros.
Métodos purosSe consideran métodos purosGetters de propiedadesOperadoresCualquier método que pertenezca a las clases deSystem.Diagnostics.Contracts.ContractSystem.StringSystem.IO.PathSystem.TypeCualquier método decorado con [Pure]
Herencia de contratosSi una clase B es derivada de A los contratos definidos en A se aplican a B, y…Los métodos redefinidos en B no pueden añadir precondicionesLos métodos redefinidos en B si pueden añadir postcondicionesLos invariantes se heredan (en la clase B se comprueban los de A y B automáticamente).
Análisis estáticoExiste una herramienta que realiza análisis estático de los contratosEs una tarea compleja, y la mayoría de contratos no pueden comprobarse en tiempo de compilación
CustomRewriterUsar un customrewriter permite cambiar el comportamiento cuando un contrato no se cumple…... P.ej. Guardarlo en un logEl customrewriter es una clase estática pública que debe contener determinados métodosDesde VS podemos indicar que customrewriter usar
CustomRewriterMétodos “comunes”Requires -> Se ejecuta cuando se evalúa un RequiresRequires<E> -> Se ejecuta cuando se evalúa un Requires y no se lanzan AssertsReportFailure -> Se ejecuta cuando falla una validación de contrato y debe reportarse el fallo
UnitTests y Contratos (i)Usar Contract.Requires y desmarcar la checkbox de AssertsSe lanzarán ContractExceptionPoco interesante ya queContractException es privada, no podemos usar [ExpectedException]
UnitTests y Contratos (ii)Usar Requires<TEx> en lugar de RequiresPodemos usar [ExpectedException] Modificamos el comportamiento en run-time de nuestros contratos Funciona para precondiciones pero no para postcondiciones ni invariantes 
UnitTests y Contratos (iii)Usar ContractFailedEvento que se lanza cuando falla un contratoNo modificamos el comportamiento en run-time de nuestros contratos Funciona para cualquier tipo de violación de contrato 
SandcastleCon la última versión (¡por fin!) podemos documentar los contratos!!! CodeContracts lleva un “parche” para SandCastle para entender nuevos tagsxml relacionados con contratos…<requires>, <ensures>, <pure>,….
 ¿Preguntas ?Estooo… pero facilillas, eh?? ;-)Recuerda que en www.codecamp.es podrás encontrar todo el material de las sesiones del CodeCamp

Más contenido relacionado

DOC
Las estructuras de control
DOC
Las variables y constantes
DOC
Operadores C SHARP
PPTX
Tipos de datos_para_c_(2)
PPT
Variables y constantes
DOC
Ámbito de las variables resumen de la clase
PPTX
Tipos de datos_para_c_
PDF
Clase 3 Unidad 2 Parte 2
Las estructuras de control
Las variables y constantes
Operadores C SHARP
Tipos de datos_para_c_(2)
Variables y constantes
Ámbito de las variables resumen de la clase
Tipos de datos_para_c_
Clase 3 Unidad 2 Parte 2

Destacado (20)

PPTX
JavaScript - HTML5 - IndexedDb
PPTX
Asp.Net vNext - La revolución que viene
PPTX
React native - t3chfest 2016
PPTX
EcmaScript unchained
PPTX
MongoDb (BcnDevCon Nov 2011)
PPTX
Introducción a ObjectiveC e IOS
PPTX
Aplicaciones Metro UI para Windows8 con C# y XAML (12 horas Visual Studio)
PPTX
Introducción a ReactJS
PPTX
Introducción al desarrollo de videojuegos 2D con Wave Engine
PPTX
#netIO 1 - Ecosistema .NET
PPTX
Winobjc - Windows Bridge for iOS
PPTX
Handlebars
PPTX
Interfaces rest
PPTX
ASP.NET vNext... Desarrollo cross platform
PPTX
Una tapa de ecmascript 6
PPTX
React native - Unleash the power of your device
PPTX
Vista aérea de los lenguajes de programación
PPTX
JavaScript in 2016 (Codemotion Rome)
PPTX
Async / Await: Programación asíncrona para dummies (12 horas visual studio)
PPTX
Novedades de ASP.NET MVC6
JavaScript - HTML5 - IndexedDb
Asp.Net vNext - La revolución que viene
React native - t3chfest 2016
EcmaScript unchained
MongoDb (BcnDevCon Nov 2011)
Introducción a ObjectiveC e IOS
Aplicaciones Metro UI para Windows8 con C# y XAML (12 horas Visual Studio)
Introducción a ReactJS
Introducción al desarrollo de videojuegos 2D con Wave Engine
#netIO 1 - Ecosistema .NET
Winobjc - Windows Bridge for iOS
Handlebars
Interfaces rest
ASP.NET vNext... Desarrollo cross platform
Una tapa de ecmascript 6
React native - Unleash the power of your device
Vista aérea de los lenguajes de programación
JavaScript in 2016 (Codemotion Rome)
Async / Await: Programación asíncrona para dummies (12 horas visual studio)
Novedades de ASP.NET MVC6
Publicidad

Similar a Microsoft Code Contracts (9)

PDF
zines.esp.v12.pdf
PDF
Java OO - Tema 06 - Interfaces
PDF
contratos_Casos de uso_modelos_metodologias
PPTX
Certificación java 6 cap 2
DOCX
PDF
JAVA ORIENTADO A OBJETOS - INTERFACES
PDF
OCP, JSE 6 Programmer (1Z0-851) - Guia practica 5 de 7(OO) v1
PPTX
_Concepto de interfaz_interfaz_interfaz_interfaz_interfaz_.pptx
PPT
7. diseño por contrato
zines.esp.v12.pdf
Java OO - Tema 06 - Interfaces
contratos_Casos de uso_modelos_metodologias
Certificación java 6 cap 2
JAVA ORIENTADO A OBJETOS - INTERFACES
OCP, JSE 6 Programmer (1Z0-851) - Guia practica 5 de 7(OO) v1
_Concepto de interfaz_interfaz_interfaz_interfaz_interfaz_.pptx
7. diseño por contrato
Publicidad

Más de Eduard Tomàs (20)

PPTX
Kubernetes: Do's, don'ts and why's
PPTX
KCDS 2021- Escalando workloads serverless en Kubernetes con KEDA
PPTX
Escalando workloads serverless en Kubernetes con Keda
PPTX
C#9 - Más C# que nunca
PPTX
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDA
PPTX
Keda o como convertir Kubernetess en Serverless
PPTX
.NET Memoria y Rendimiento
PPTX
Containers en .NET (Dot Net 2018 - Spain)
PPTX
Esos contenedores, ¡a producción! (Commit Conf 2018)
PPTX
Codemotion 2015 - Bienvenido de nuevo c++
PPTX
El "peor" lenguaje del mundo
PPTX
Containerize a netcore application with aks
PPTX
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
PPTX
Aplicaciones de consola fáciles? Más quisieramos
PPTX
Serverless with Azure Functions and CosmosDb
PPTX
Docker y todo eso... más o menos
PPTX
Microservices: Yes or not?
PPTX
ASP.NET MVC Core
PPTX
Azure functions
PPTX
Asp.Net Core 1.0 Deep Dive
Kubernetes: Do's, don'ts and why's
KCDS 2021- Escalando workloads serverless en Kubernetes con KEDA
Escalando workloads serverless en Kubernetes con Keda
C#9 - Más C# que nunca
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDA
Keda o como convertir Kubernetess en Serverless
.NET Memoria y Rendimiento
Containers en .NET (Dot Net 2018 - Spain)
Esos contenedores, ¡a producción! (Commit Conf 2018)
Codemotion 2015 - Bienvenido de nuevo c++
El "peor" lenguaje del mundo
Containerize a netcore application with aks
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
Aplicaciones de consola fáciles? Más quisieramos
Serverless with Azure Functions and CosmosDb
Docker y todo eso... más o menos
Microservices: Yes or not?
ASP.NET MVC Core
Azure functions
Asp.Net Core 1.0 Deep Dive

Microsoft Code Contracts

  • 1. CodeContractsSomos desarrolladores, no futbolistas… los contratos están para cumplirlosEduardTomàseduard.tomas@raona.com
  • 2. Algunas cosillas a comentar…IntroducciónPrecondicionesPostcondicionesInvariantesMétodos puros (pero no castos)Sandcastle! 
  • 3. IntroducciónQue es CodeContracts?Actualmente… un proyecto de Microsoft Researchhttp://research.microsoft.com/en-us/projects/contracts/En un futuro… Parte integral de .NET 4.0Aunque… la beta1 de VS2010 tiene una versión desactualizadaÚltima versión (hasta ahora): 03 Sep 2009.
  • 4. IntroducciónPara qué sirve CodeContracts?Librería para poder especificar contratos en .NETIndependiente del lenguaje (C#, F#, VB.NET)Basada en atributosSe puede instalar sobre VS2008 o sobre VS2010 Beta 1
  • 5. IntroducciónLa evaluación de contratos NO está activa por defectoPuede habilitarse para DEBUG y/o RELEASESolo precondicionesSolo precondiciones y postcondicionesTodoTambién podemos especificar el comportamiento por defectoAssert o excepción Contract.Exception
  • 7. PrecondicionesCondiciones que la llamada a un método debe satisfacerSi no se cumplen la llamada no es válidaNo debería compilarEl llamante debe poder comprobar que su llamada cumple las precondicionesDebe conocerlas… y poderlas comprobar!
  • 8. PrecondicionesSe representan mediante la llamada al método Contract.Requires.Si la condición especificada en Requires no se cumple, la precondición no és válida…… Ya, y entonces… ¿qué ocurre?Por defecto: Assert o excepción
  • 9. PrecondicionesContract.Requires(condición)Assert o lanza Contract.Exception si la condición no se cumpleNota: Contract.Exception es interna.Contract.Requires<TEx>(condición)Assert o lanza TEx si condición no se cumple
  • 10. PrecondicionesCuantificadoresEspecificar Contratos sobre elementos de una colecciónForAll -> Se cumple si todos los elementos de la colección cumplen una condiciónExists -> Se cumple el contrato si un elemento de la colección cumple la condiciónPero… ya tenemos Linq! 
  • 11. PostcondicionesSe evalúan cuando se retorna de un métodoPuede retornarse de un método de dos maneresCorrectamente (return o fin)Por error (excepción)Puede haber precondiciones distintas en función de si se sale correctamente o por error.
  • 12. PostcondicionesMétodos Contract.EnsuresContract.EnsuresOnThrow<TEx>Assert o lanzan excepción ContractException si la postcondición no se cumple
  • 13. PostcondicionesPostcondiciones se colocan al principio del método…… pero se evalúan cuando se sale del métodoProblema: Como acceder al valor de retorno?
  • 14. PostcondicionesintFoo(int i) {Contract.Requires(i >= 0);varret = i + 1;Contract.Ensures(ret > 0);returnret; }No compila porque Ensures no está al principio del método… pero si lo pongo al principio NO PUEDO acceder a ret, porque no está definida!Contract.ReturnValue<T >
  • 15. InvariantesLa invariante es un conjunto de condiciones que deben cumplirse siempre en el ciclo de vida de un objetoLas invariantes se comprueban después de cada llamada a un método público del objeto
  • 16. InvariantesSe definen un método decorado con el atributo [ContractInvariantMethod]Lista de llamadas a Contract.Invariant con las condiciones a cumplir
  • 17. InterfacesLas interfaces pueden definir contratosLas interfaces no pueden tener código…… donde ponemos las llamadas a Contract?En cada clase?No porque entonces el contrato sería de cada clase, no de la interfaz!SoluciónClase de contratos
  • 18. InterfacesClase de contratosClase que implementa una interfaz de forma explícita y contiene sólo los contratos para la interfazClases que implementan la interfaz no deben redefinir los contratos…Atributos [ContractClass] y [ContractClassFor] sirven para identificar la clase de contrato
  • 19. Métodos purosUn método puro es un método que no tiene efectos laterales visibles para el llamanteNo modifican el estado del objetoContract.Requires y Contract.Ensurespueden llamar a métodos, pero deben ser siempre métodos puros.
  • 20. Métodos purosSe consideran métodos purosGetters de propiedadesOperadoresCualquier método que pertenezca a las clases deSystem.Diagnostics.Contracts.ContractSystem.StringSystem.IO.PathSystem.TypeCualquier método decorado con [Pure]
  • 21. Herencia de contratosSi una clase B es derivada de A los contratos definidos en A se aplican a B, y…Los métodos redefinidos en B no pueden añadir precondicionesLos métodos redefinidos en B si pueden añadir postcondicionesLos invariantes se heredan (en la clase B se comprueban los de A y B automáticamente).
  • 22. Análisis estáticoExiste una herramienta que realiza análisis estático de los contratosEs una tarea compleja, y la mayoría de contratos no pueden comprobarse en tiempo de compilación
  • 23. CustomRewriterUsar un customrewriter permite cambiar el comportamiento cuando un contrato no se cumple…... P.ej. Guardarlo en un logEl customrewriter es una clase estática pública que debe contener determinados métodosDesde VS podemos indicar que customrewriter usar
  • 24. CustomRewriterMétodos “comunes”Requires -> Se ejecuta cuando se evalúa un RequiresRequires<E> -> Se ejecuta cuando se evalúa un Requires y no se lanzan AssertsReportFailure -> Se ejecuta cuando falla una validación de contrato y debe reportarse el fallo
  • 25. UnitTests y Contratos (i)Usar Contract.Requires y desmarcar la checkbox de AssertsSe lanzarán ContractExceptionPoco interesante ya queContractException es privada, no podemos usar [ExpectedException]
  • 26. UnitTests y Contratos (ii)Usar Requires<TEx> en lugar de RequiresPodemos usar [ExpectedException] Modificamos el comportamiento en run-time de nuestros contratos Funciona para precondiciones pero no para postcondiciones ni invariantes 
  • 27. UnitTests y Contratos (iii)Usar ContractFailedEvento que se lanza cuando falla un contratoNo modificamos el comportamiento en run-time de nuestros contratos Funciona para cualquier tipo de violación de contrato 
  • 28. SandcastleCon la última versión (¡por fin!) podemos documentar los contratos!!! CodeContracts lleva un “parche” para SandCastle para entender nuevos tagsxml relacionados con contratos…<requires>, <ensures>, <pure>,….
  • 29. ¿Preguntas ?Estooo… pero facilillas, eh?? ;-)Recuerda que en www.codecamp.es podrás encontrar todo el material de las sesiones del CodeCamp