Code Contracts. Robert Haken [MVP ASP.NET, MCT] Software architect, Owner at HAVIT, s.r.o. knowledge-base.havit.cz

Podobné dokumenty
Novinky ve Visual Studio Tomáš Kroupa

Jakub Čermák Microsoft Student Partner

Dědičnost (inheritance)

PREPROCESOR POKRAČOVÁNÍ

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Abstraktní datové typy: zásobník

Z. Kotala, P. Toman: Java ( Obsah )

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

[ASP].NET Worst Practices

Komponenty v.net. Obsah přednášky

Robert Haken [MVP ASP.NET/IIS, MCT] software architect, HAVIT, Perly code-review z praxe

1. Programování proti rozhraní

[ASP].NET Core Demystified. Miroslav Holec. Konzultant a lektor [ASP].NET Core.

Jazyk C# (seminář 3)

Generické typy. Podrobněji: The Java Language Specification ( Third Edition ) , 18

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Modularita. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 3.4.

1 - Úvod do platformy.net. IW5 - Programování v.net a C#

Jazyk C++ I. Šablony 2

Čipové karty Lekařská informatika

NPRG031 Programování II 1 / :25:46

NMIN201 Objektově orientované programování 1 / :36:09

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

Ing. Bc. Robert Haken [MVP ASP.NET/IIS, MCT] software architect, HAVIT, Návrh schématu DB

Java - výjimky. private void vstup() throws IOException {... }

10. března 2015, Brno Připravil: David Procházka. Programovací jazyk C++

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Jazyk C# (seminář 6)

Java a XML. 10/26/09 1/7 Java a XML

Doxygen. Jakub Břečka

[ASP].NET Worst Practices

Typický prvek kolekce pro české řazení

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Generické programování

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Osnova přednášky. Programové prostředky řízení Úvod do C# II. Přístup ke členům. Členy (Members)

JAVA Unit testing Java, zimní semestr

PODOBÁ SE JAZYKU C S NĚKTERÝMI OMEZENÍMI GLOBÁLNÍ PROMĚNNÉ. NSWI162: Sémantika programů 2

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Java Výjimky Java, zimní semestr

Agenda. Docházka Návrat k minulému praktickému cvičení Zápočtové práce. Dokumentace. Dotazy, přání, stížnosti. Co, jak a proč dokumentovat

Iterator & for cyklus

IRAE 07/08 Přednáška č. 7. Začátek (head)

Připravil: David Procházka. Programovací jazyk C++

29. Výjimky, jejich vznik, vyhození, odchyt a zpracování. (A7B36PVJ)

typová konverze typová inference

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Zápis programu v jazyce C#

Vytváření a použití knihoven tříd

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

ASP.NET Web API. Tomáš Herceg Microsoft MVP (ASP.NET)

Google Web Toolkit. Martin Šurkovský, SUR března Katedra informatiky

UJO Framework. revoluční architektura beans. verze

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Softwarové komponenty a Internet

Car Agent. Struktura chování:

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

Výjimky. v C# a Javě

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Objekt. základní prvek v OOP. má vlastnosti. má metody. vznikne vytvoření nové instance definován pomocí třídy

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Robert Haken. HAVIT, s.r.o. knowledge-base.havit.cz

IRAE 07/08 Přednáška č. 1

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Dědičnost. seskupování tříd do hierarchie. potomek získá všechny vlastnosti a metody. provádí se pomocí dvojtečky za názvem třídy.

IW5 - Programování v.net a C# 4 Pokročilé konstrukce C#

Úvod Vývojová prostředí Štábní kultura Dokumentace Konec. Programování v C# Prostředí a doporučení 1 / 39

Pokud neuvedeme override, vznikne v synu nová (nevirtuální) metoda (a pochopitelně se nezavolá, jak bychom

Programování v Javě I. Únor 2009

Principy objektově orientovaného programování

ios Cvičení RSS čtečka

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

20. Projekt Domácí mediotéka

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

Fakulta elektrotechniky a informatiky Univerzita Pardubice 2014/2015. poslední přednáška a materiál k samostudiu

Enterprise Java Beans 3.0

Diagnostika webových aplikací v Azure

Microsoft ASP.NET 2.0/3.0 (advanced)

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

Programování v C++ 2, 4. cvičení

Programování v Javě I. Leden 2008

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

Úvod do programovacích jazyků (Java)

Michal Augustýn Microsoft Most Valuable Professional

Úvod do programovacích jazyků (Java)

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Paradigmata programování II Korutiny a nedeterminismus

Jazyk C# - přístup k datům

Jazyk C# - přístup k datům

Návrhové vzory Tvorba objektů

Zpracoval:

Programování jako nástroj porozumění matematice (seriál pro web modernivyuka.cz)

Semin aˇr Java V yjimky Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Unor 2008 Radek Koˇc ı Semin aˇr Java V yjimky 1/ 25

Jazyk C# a platforma.net

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Transkript:

Code Contracts Robert Haken [MVP ASP.NET, MCT] Software architect, Owner at HAVIT, s.r.o. knowledge-base.havit.cz

Contracts volaná strana deklaruje, jak se chová vzniká dohoda mezi volající a volanou stranou pokud volající splní vstupní podmínky volaného (pre-conditions) volaný se mu odmění splněním vlastních výstupních podmínek (post-conditions) při zachování podmínek konzistence (invariants)

Code Contracts v.net Vyjádření contractů ve zdrojovém kódu pre-conditions vstupní podmínky metody post-conditions výstupní podmínky metody object invariants podmínky konzistence objektu získáme runtime-checking testování + statická analýza generování dokumentace

public class RacionalniCislo { public int Citatel { get{ return _citatel; } } private int _citatel; public int Jmenovatel { get { Contract.Ensures(Contract.Result<int>()!= 0, "Jmenovatel nemůže být nikdy 0."); return _jmenovatel; } } private int _jmenovatel; public RacionalniCislo(int citatel, int jmenovatel) { Contract.Requires(jmenovatel!= 0,"Nelze vytvořit racionální č. se jmenovatelem 0."); _citatel = citatel; _jmenovatel = jmenovatel; } } [ContractInvariantMethod] void ObjectInvariant() { Contract.Invariant(_jmenovatel!= 0, "Jmenovatel racionálního čisla není nikdy 0."); }

Intro DEMO

Pre-conditions stav světa před voláním metody Contract.Requires(condition, [message]); Contract.Requires<T>(condition, [message]); where T: Exception Legacy Requires if (condition) throw new XyException( ); Contract.*() nebo Contract.EndContractBlock();

Post-conditions stav světa při skončení metody Contract.Ensures(condition, [message]); Contract.EnsuresOnThrow<T>(cond, [message]); where T: Exception

Pomocné metody do post-conditions Contract.Result<T>() Contract.OldValue<T>(value) Contract.ValueAtReturn(out value)

Průběžné podmínky v kódu Contract.Assert(condition, [message]); Contract.Assume(condition, [message]);

Object-invariant podmínky [ContractInvariantMethod] private void ObjectInvariant() { Contract.Invariant(condition, [message]); Contract.Invariant(condition, [message]);... } kontrolují se při výstupu z každé public metody

Kvantifikátory do podmínek Contract.ForAll(start, end, index => condition) Contract.ForAll(IEnumerable, item => condition) Contract.Exists(start, end, index => condition) Contract.Exists(IEnumerable, item => condition) také Linq.Enumerable.All(), Linq.Enumerable.Any()

Contracts pro interface/abstract [ContractClass(typeof(IFooContract))] interface IFoo { void DoSomething(int value); } [ContractClassFor(typeof(IFoo))] sealed class IFooContract : IFoo { void IFoo.DoSomething(int value) { Contract.Requires(value!= 0); } }

Contracty a dědičnost/viditelnost dědí se i bez volání base.dosomething() pre-conditions musí být v root metodě nelze zpřísňovat contract potomka pre-condition smí používat jen viditelné hodnoty (public, argumenty,...) volající strana musí být schopna podmínky sama ověřit post-conditions a invariants neomezeně v podmínkách lze volat jen [Pure] metody

Build, Rewriting Dialog Code Contracts ve Visual Studiu DEMO

Runtime Checking Legacy Require<E> Require Ensure Invariant Assert Assume Full X X X X X X Pre and Post X X X X Preconditions X X X ReleaseRequires X X None! Doporučené nastavení Debug = Full + Assert on Contract Failure Release = ReleaseRequires + Only Public Surface Contracts

Runtime Checking Extensibility Contract.ContractFailed event Custom Rewriter Methods Requires/Ensures/Invariant/Assert/Assume ReportFailure RaiseContractFailedEvent TriggerFailure Call Site Requires pro design-time kontrolu plnění contractů API třetích stran

Runtime Checking DEMO

Statická analýza Doporučení Baseline na existujících projektech [ContractVerification(true false)] opt in/out Background checking (výkonově náročné!)

Statická analýza DEMO

Generování dokumentace contractů doplní existující XML soubor generovaný compilerem C#/VB šablona pro Sandcastle

Generování dokumentace DEMO

Použití ve webových projektech ERROR: Ambiguous class... MyAssembly.dll + MyAssembly.Contracts.dll řešení odebrat assembly ve web.config <system.web> <compilation> <assemblies> <remove assembly="myassembly.contracts"/> </assemblies> </compilation> </system.web>

Q & A