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