SlideShare una empresa de Scribd logo
1 de 29
CodeContracts Somos desarrolladores, no futbolistas… los contratos están para cumplirlos EduardTomàs eduard.tomas@raona.com
Algunas cosillas a comentar… Introducción Precondiciones Postcondiciones Invariantes Métodos puros (pero no castos) Sandcastle! 
Introducción Que es CodeContracts? Actualmente… un proyecto de Microsoft Research http://research.microsoft.com/en-us/projects/contracts/ En un futuro… Parte integral de .NET 4.0 Aunque… la beta1 de VS2010 tiene una versión desactualizada Última versión (hasta ahora): 03 Sep 2009.
Introducción Para qué sirve CodeContracts? Librería para poder especificar contratos en .NET Independiente del lenguaje (C#, F#, VB.NET) Basada en atributos Se puede instalar sobre VS2008 o sobre VS2010 Beta 1
Introducción La evaluación de contratos NO está activa por defecto Puede habilitarse para DEBUG y/o RELEASE Solo precondiciones Solo precondiciones y postcondiciones Todo También podemos especificar el comportamiento por defecto Assert o excepción Contract.Exception
Introducción Contratos Permiten especificar Precondiciones Postcondiciones Invariantes de objeto
Precondiciones Condiciones que la llamada a un método debe satisfacer Si no se cumplen la llamada no es válida No debería compilar El llamante debe poder comprobar que su llamada cumple las precondiciones Debe conocerlas… y poderlas comprobar!
Precondiciones Se 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
Precondiciones Contract.Requires(condición) Assert o lanza Contract.Exception si la condición no se cumple Nota: Contract.Exception es interna. Contract.Requires<TEx>(condición) Assert o lanza TEx si condición no se cumple
Precondiciones Cuantificadores Especificar Contratos sobre elementos de una colección ForAll -> Se cumple si todos los elementos de la colección cumplen una condición Exists -> Se cumple el contrato si un elemento de la colección cumple la condición Pero… ya tenemos Linq! 
Postcondiciones Se evalúan cuando se retorna de un método Puede retornarse de un método de dos maneres Correctamente (return o fin) Por error (excepción) Puede haber precondiciones distintas en función de si se sale correctamente o por error.
Postcondiciones Métodos  Contract.Ensures Contract.EnsuresOnThrow<TEx> Assert o lanzan excepción ContractException si la postcondición no se cumple
Postcondiciones Postcondiciones se colocan al principio del método… … pero se evalúan cuando se sale del método Problema: Como acceder al valor de retorno?
Postcondiciones intFoo(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 >
Invariantes La invariante es un conjunto de condiciones que deben cumplirse siempre en el ciclo de vida de un objeto Las invariantes se comprueban después de cada llamada a un método público del objeto
Invariantes Se definen un método decorado con el atributo [ContractInvariantMethod] Lista de llamadas a Contract.Invariant con las condiciones a cumplir
Interfaces Las interfaces pueden definir contratos Las 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ón Clase de contratos
Interfaces Clase de contratos Clase que implementa una interfaz de forma explícita y contiene sólo los contratos para la interfaz Clases que implementan la interfaz no deben redefinir los contratos… Atributos [ContractClass] y [ContractClassFor] sirven para identificar la clase de contrato
Métodos puros Un método puro es un método que no tiene efectos laterales visibles para el llamante No modifican el estado del objeto Contract.Requires y Contract.Ensurespueden llamar a métodos, pero deben ser siempre métodos puros.
Métodos puros Se consideran métodos puros Getters de propiedades Operadores Cualquier método que pertenezca a las clases de System.Diagnostics.Contracts.Contract System.String System.IO.Path System.Type Cualquier método decorado con [Pure]
Herencia de contratos Si 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 precondiciones Los métodos redefinidos en B si pueden añadir postcondiciones Los invariantes se heredan (en la clase B se comprueban los de A y B automáticamente).
Análisis estático Existe una herramienta que realiza análisis estático de los contratos Es una tarea compleja, y la mayoría de contratos no pueden comprobarse en tiempo de compilación
CustomRewriter Usar un customrewriter permite cambiar el comportamiento cuando un contrato no se cumple… ... P.ej. Guardarlo en un log El customrewriter es una clase estática pública que debe contener determinados métodos Desde VS podemos indicar que customrewriter usar
CustomRewriter Métodos “comunes” Requires -> Se ejecuta cuando se evalúa un Requires Requires<E> -> Se ejecuta cuando se evalúa un Requires y no se lanzan Asserts ReportFailure -> 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 Asserts Se lanzarán ContractException Poco interesante ya que ContractException es privada, no podemos usar [ExpectedException]
UnitTests y Contratos (ii) Usar Requires<TEx> en lugar de Requires Podemos 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 ContractFailed Evento que se lanza cuando falla un contrato No modificamos el comportamiento en run-time de nuestros contratos  Funciona para cualquier tipo de violación de contrato 
Sandcastle Con 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

Destacado

JavaScript - HTML5 - IndexedDb
JavaScript - HTML5 - IndexedDbJavaScript - HTML5 - IndexedDb
JavaScript - HTML5 - IndexedDbEduard Tomàs
 
Asp.Net vNext - La revolución que viene
Asp.Net vNext - La revolución que vieneAsp.Net vNext - La revolución que viene
Asp.Net vNext - La revolución que vieneEduard Tomàs
 
React native - t3chfest 2016
React native - t3chfest 2016React native - t3chfest 2016
React native - t3chfest 2016Eduard Tomàs
 
EcmaScript unchained
EcmaScript unchainedEcmaScript unchained
EcmaScript unchainedEduard Tomàs
 
MongoDb (BcnDevCon Nov 2011)
MongoDb (BcnDevCon Nov 2011)MongoDb (BcnDevCon Nov 2011)
MongoDb (BcnDevCon Nov 2011)Eduard Tomàs
 
Introducción a ObjectiveC e IOS
Introducción a ObjectiveC e IOSIntroducción a ObjectiveC e IOS
Introducción a ObjectiveC e IOSEduard Tomàs
 
Aplicaciones Metro UI para Windows8 con C# y XAML (12 horas Visual Studio)
Aplicaciones Metro UI para Windows8 con C# y XAML (12 horas Visual Studio)Aplicaciones Metro UI para Windows8 con C# y XAML (12 horas Visual Studio)
Aplicaciones Metro UI para Windows8 con C# y XAML (12 horas Visual Studio)Eduard Tomàs
 
Introducción a ReactJS
Introducción a ReactJSIntroducción a ReactJS
Introducción a ReactJSEduard Tomàs
 
Introducción al desarrollo de videojuegos 2D con Wave Engine
Introducción al desarrollo de videojuegos 2D con Wave EngineIntroducción al desarrollo de videojuegos 2D con Wave Engine
Introducción al desarrollo de videojuegos 2D con Wave EngineEduard Tomàs
 
#netIO 1 - Ecosistema .NET
#netIO 1 - Ecosistema .NET#netIO 1 - Ecosistema .NET
#netIO 1 - Ecosistema .NETEduard Tomàs
 
Winobjc - Windows Bridge for iOS
Winobjc - Windows Bridge for iOSWinobjc - Windows Bridge for iOS
Winobjc - Windows Bridge for iOSEduard Tomàs
 
ASP.NET vNext... Desarrollo cross platform
ASP.NET vNext... Desarrollo cross platformASP.NET vNext... Desarrollo cross platform
ASP.NET vNext... Desarrollo cross platformEduard Tomàs
 
Una tapa de ecmascript 6
Una tapa de ecmascript 6Una tapa de ecmascript 6
Una tapa de ecmascript 6Eduard Tomàs
 
React native - Unleash the power of your device
React native - Unleash the power of your deviceReact native - Unleash the power of your device
React native - Unleash the power of your deviceEduard Tomàs
 
Vista aérea de los lenguajes de programación
Vista aérea de los lenguajes de programaciónVista aérea de los lenguajes de programación
Vista aérea de los lenguajes de programaciónEduard Tomàs
 
JavaScript in 2016 (Codemotion Rome)
JavaScript in 2016 (Codemotion Rome)JavaScript in 2016 (Codemotion Rome)
JavaScript in 2016 (Codemotion Rome)Eduard Tomàs
 
Async / Await: Programación asíncrona para dummies (12 horas visual studio)
Async / Await: Programación asíncrona para dummies (12 horas visual studio)Async / Await: Programación asíncrona para dummies (12 horas visual studio)
Async / Await: Programación asíncrona para dummies (12 horas visual studio)Eduard Tomàs
 
Novedades de ASP.NET MVC6
Novedades de ASP.NET MVC6Novedades de ASP.NET MVC6
Novedades de ASP.NET MVC6Eduard Tomàs
 

Destacado (20)

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

Similar a CodeContracts: especificar contratos en .NET

Taller envio de sms por código 2012
Taller envio de sms por código 2012Taller envio de sms por código 2012
Taller envio de sms por código 2012Orlando Barcia
 
Meetup bdd & tdd: aprovecha_su_poder
Meetup bdd & tdd: aprovecha_su_poderMeetup bdd & tdd: aprovecha_su_poder
Meetup bdd & tdd: aprovecha_su_poderEduardo Riol
 
Introduccion a la programacion en c 1
Introduccion a la programacion en c 1Introduccion a la programacion en c 1
Introduccion a la programacion en c 1georgemanson69
 
Junit y Jmock
Junit y JmockJunit y Jmock
Junit y Jmockkaolong
 
Programación en C#.pptx
Programación en C#.pptxProgramación en C#.pptx
Programación en C#.pptxRosmaryDS
 
Introduction to wcf solutions
Introduction to wcf solutionsIntroduction to wcf solutions
Introduction to wcf solutionsMICTT Palma
 
Asp.Net Core 1.0 Deep Dive
Asp.Net Core 1.0 Deep DiveAsp.Net Core 1.0 Deep Dive
Asp.Net Core 1.0 Deep DiveEduard Tomàs
 
6 libro fundamentos cap__modularidad_ecler mv
6 libro fundamentos cap__modularidad_ecler mv6 libro fundamentos cap__modularidad_ecler mv
6 libro fundamentos cap__modularidad_ecler mvEcler Mamani Vilca
 
¿Grails + DDD + Eventsourcing + CQRS?
¿Grails + DDD + Eventsourcing + CQRS?¿Grails + DDD + Eventsourcing + CQRS?
¿Grails + DDD + Eventsourcing + CQRS?Jorge Franco Leza
 

Similar a CodeContracts: especificar contratos en .NET (20)

[Code Camp 2009] ASP.NET MVC a full (Matías Juan Rubí + Jonathan Solarz)
[Code Camp 2009] ASP.NET MVC a full (Matías Juan Rubí + Jonathan Solarz)[Code Camp 2009] ASP.NET MVC a full (Matías Juan Rubí + Jonathan Solarz)
[Code Camp 2009] ASP.NET MVC a full (Matías Juan Rubí + Jonathan Solarz)
 
Taller envio de sms por código 2012
Taller envio de sms por código 2012Taller envio de sms por código 2012
Taller envio de sms por código 2012
 
Meetup bdd & tdd: aprovecha_su_poder
Meetup bdd & tdd: aprovecha_su_poderMeetup bdd & tdd: aprovecha_su_poder
Meetup bdd & tdd: aprovecha_su_poder
 
TDD talk
TDD talkTDD talk
TDD talk
 
Consumer driven contract testing
Consumer driven contract testingConsumer driven contract testing
Consumer driven contract testing
 
Introduccion a la programacion en c 1
Introduccion a la programacion en c 1Introduccion a la programacion en c 1
Introduccion a la programacion en c 1
 
Cobertura de pruebas unitarias - NetBaires
Cobertura de pruebas unitarias - NetBairesCobertura de pruebas unitarias - NetBaires
Cobertura de pruebas unitarias - NetBaires
 
Cobertura de pruebas unitarias en C#
Cobertura de pruebas unitarias en C#Cobertura de pruebas unitarias en C#
Cobertura de pruebas unitarias en C#
 
Lenguaje c 2
Lenguaje c 2Lenguaje c 2
Lenguaje c 2
 
Junit y Jmock
Junit y JmockJunit y Jmock
Junit y Jmock
 
Programación en C#.pptx
Programación en C#.pptxProgramación en C#.pptx
Programación en C#.pptx
 
Introduction to wcf solutions
Introduction to wcf solutionsIntroduction to wcf solutions
Introduction to wcf solutions
 
Asp.Net Core 1.0 Deep Dive
Asp.Net Core 1.0 Deep DiveAsp.Net Core 1.0 Deep Dive
Asp.Net Core 1.0 Deep Dive
 
6 libro fundamentos cap__modularidad_ecler mv
6 libro fundamentos cap__modularidad_ecler mv6 libro fundamentos cap__modularidad_ecler mv
6 libro fundamentos cap__modularidad_ecler mv
 
GWT - Una introducción
GWT - Una introducciónGWT - Una introducción
GWT - Una introducción
 
¿Grails + DDD + Eventsourcing + CQRS?
¿Grails + DDD + Eventsourcing + CQRS?¿Grails + DDD + Eventsourcing + CQRS?
¿Grails + DDD + Eventsourcing + CQRS?
 
 
Programación III
Programación IIIProgramación III
Programación III
 
Cesar ivan lenguaje_c
Cesar ivan lenguaje_cCesar ivan lenguaje_c
Cesar ivan lenguaje_c
 
Tutorial C
Tutorial CTutorial C
Tutorial C
 

Más de Eduard Tomàs

Kubernetes: Do's, don'ts and why's
Kubernetes: Do's, don'ts and why'sKubernetes: Do's, don'ts and why's
Kubernetes: Do's, don'ts and why'sEduard Tomàs
 
KCDS 2021- Escalando workloads serverless en Kubernetes con KEDA
KCDS 2021- Escalando workloads serverless en Kubernetes con KEDAKCDS 2021- Escalando workloads serverless en Kubernetes con KEDA
KCDS 2021- Escalando workloads serverless en Kubernetes con KEDAEduard Tomàs
 
Escalando workloads serverless en Kubernetes con Keda
Escalando workloads serverless en Kubernetes con KedaEscalando workloads serverless en Kubernetes con Keda
Escalando workloads serverless en Kubernetes con KedaEduard Tomàs
 
C#9 - Más C# que nunca
C#9 - Más C# que nuncaC#9 - Más C# que nunca
C#9 - Más C# que nuncaEduard Tomàs
 
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDA
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDACollabDays 2020 Barcelona - Serverless Kubernetes with KEDA
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDAEduard Tomàs
 
Keda o como convertir Kubernetess en Serverless
Keda o como convertir Kubernetess en ServerlessKeda o como convertir Kubernetess en Serverless
Keda o como convertir Kubernetess en ServerlessEduard Tomàs
 
.NET Memoria y Rendimiento
.NET Memoria y Rendimiento.NET Memoria y Rendimiento
.NET Memoria y RendimientoEduard Tomàs
 
Containers en .NET (Dot Net 2018 - Spain)
Containers en .NET (Dot Net 2018 - Spain)Containers en .NET (Dot Net 2018 - Spain)
Containers en .NET (Dot Net 2018 - Spain)Eduard Tomàs
 
Esos contenedores, ¡a producción! (Commit Conf 2018)
Esos contenedores, ¡a producción! (Commit Conf 2018)Esos contenedores, ¡a producción! (Commit Conf 2018)
Esos contenedores, ¡a producción! (Commit Conf 2018)Eduard Tomàs
 
Codemotion 2015 - Bienvenido de nuevo c++
Codemotion 2015 - Bienvenido de nuevo c++Codemotion 2015 - Bienvenido de nuevo c++
Codemotion 2015 - Bienvenido de nuevo c++Eduard Tomàs
 
El "peor" lenguaje del mundo
El "peor" lenguaje del mundoEl "peor" lenguaje del mundo
El "peor" lenguaje del mundoEduard Tomàs
 
Containerize a netcore application with aks
 Containerize a netcore application with aks Containerize a netcore application with aks
Containerize a netcore application with aksEduard Tomàs
 
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)Eduard Tomàs
 
Aplicaciones de consola fáciles? Más quisieramos
Aplicaciones de consola fáciles? Más quisieramosAplicaciones de consola fáciles? Más quisieramos
Aplicaciones de consola fáciles? Más quisieramosEduard Tomàs
 
Serverless with Azure Functions and CosmosDb
Serverless with Azure Functions and CosmosDbServerless with Azure Functions and CosmosDb
Serverless with Azure Functions and CosmosDbEduard Tomàs
 
Docker y todo eso... más o menos
Docker y todo eso... más o menosDocker y todo eso... más o menos
Docker y todo eso... más o menosEduard Tomàs
 
Microservices: Yes or not?
Microservices: Yes or not?Microservices: Yes or not?
Microservices: Yes or not?Eduard Tomàs
 
React, Flux y React native
React, Flux y React nativeReact, Flux y React native
React, Flux y React nativeEduard Tomàs
 

Más de Eduard Tomàs (20)

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

CodeContracts: especificar contratos en .NET

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