HAVIT Knowledge Base

Vývoj webových aplikací, .NET, SQL, návrh
Welcome to HAVIT Knowledge Base Sign in | Join | Help
-
Home Články Forums Obrázky Soubory

.NET Framework

Microsoft .NET Framework, Base Class Library

MVP Summit 2009 1. - Code Contracts

Zrovna jsem přišel z přednášky o "Code Contracts" a jsem relativně nadšen tím, co Microsoft chystá. Naštěstí již je to k veřejnému testování přes DevLabs, obecné věci nejsou pod NDA, a proto se s Vámi mohu bez detailů podělit o první dojmy.

Code Contracts je aparát, kterým bude možné v kódu (nezávisle na jazyce) definovat contract, tedy pravidla, které daná metoda/property/třída/... musí splňovat, například:

public class MyClass
{
  public int DoSomething(int vstup, int vstup2)
  {
    Contract.Requires(vstup != 0);
    Contract.Requires(vstup2 > vstup1, "argument vstup2 musí být větší než vstup1");
    Contract.Ensures(Contract.Result<int>() > 0, "návratová hodnota bude větší než 0");

    ...implementace metody
  }
}

Co by to mělo umět:

  • pre-conditions - Contract.Requires() -  podmínky, které musí být splněny pro spuštení metody - na začátku
  • post-conditions - Contract.Ensures() - podmínky, které budou splněny na konci metody
  • object invariants - [ContractInvariant] - podmínky, které musí být splněny stále (na konci každé operace)
  • asserts - Contract.Assert() - podmínky, které je možné vyžadovat průběžně v kódu (ála Debug.Assert())
  • ...

Co by to mělo znamenat:

  • run-time checking - v podstatě náhrada za if (..) then throw new ArgumentXyException(...)
  • static verification - kontrola (třeba jakou součást buildu), že budou podmínky splněny
  • generování dokumentace - pravidla contract se stanou součástí dokumentace (např. místo současných ArgumentExceptions)
  • náhrada Debug.Assert() a podobných

Jak to funguje:

  • třída Contract v podstatě nemá žádnou implementaci a funguje jako metadata, která se díky ní dostanou do kódu
  • post-build stepem v msbuildu se tato metadata vyhodnotí a provedou se modifikace zkompilovaných assembly dle požadovaných nastavení (zda dělat testy i v Release, zda vygenerovat assembly s contracty, atp.); procesně to lze přirovnat k Obfuskaci, nebo mechanizmům používaným v AOP (Aspekt Oriented Programmingu) 

Odkazy

Published 2. března 2009 22:39 by Robert Haken
Filed under:

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

 

Michal said:

Ja byl rychlejsi :-) , i kdyz jen diky tobe.

http://michal.ontheroad.to/show/code-contract

března 2, 2009 23:03
 

vlko said:

Nemali by byt code contract primarne urcene vyvojarom, ktory vytvaraju rozne 3rd party kniznice, pripadne ako urcity dokumentacny prostrednik medzi teamami, ktory pracuju na jednom projekte?

Tomu je prisposobena aj architektura a teda integracia do visual studia, kompilacia do dvoch assembly (jedna s kodom, druha s contractami), atd. Alebo to medzitym ms zmenil a codecontract budu AOP pre .net 4.0?

března 3, 2009 0:15
 

vlko said:

Aby som len tak nekecal a moje tvrdenie o nieco oprel

http://www.aspnet.sk/CLR-4.0-Code-Contract-100520.aspx

března 3, 2009 0:20
 

Robert Haken said:

Jak jsem to pochopil, tak je to tak z 70% targetováno do fáze vývoje a sami všude popisují i run-time checks. Při diskuzi a na přímé otázky říkali, že je to velmi dobře použitelné i na run-time kontroly místo dosavadních if-throw, a že to v podstatě ve finále nedělá nic jiného než if-throw.

Taky jsem vytušil, že do run-time lze nechat jen určitý sub-set pravidel, takže by to nemělo mít performance-impact (navíc si přiznejme, že i dosavadní if-throw mají efekt zejména ve fázi vývoje a v run-time je to už jen sugar).

března 3, 2009 6:13
 

koubel said:

a co raději se naučit Eiffel - http://www.eiffel.com/ a máte design by contract jak brus

března 5, 2009 23:12
 

Robert Haken said:

Eiffel je určitě prima věc, ale je to trochu jiný kafíčko.

Code Contracts jsou krásný v tom, že nejsou potřeba žádné další nástroje, že se definují právě přímo v kódu, ve Visual Studiu, s podporou IntelliSense a všech nástrojů, které VS má, v jazyce, který řadový vývojáři dobře znají, srozumitelně a s podporou MSBUildu.

Já se určitě na Code Contracts chystám, jen co se vrátím ze Seattle. Hned je začnu testovat a vidím v tom velkého pomocníka pro každodenní coding.

března 6, 2009 1:57

What do you think?

(required) 
(optional)
(required) 
Enter the code you see below

Submit