2011-12-09 9 views

Odpowiedz

25

Kontrakty Kod wprowadzono w .NET 4.0 i zapewniają metodę językową-agnostyk wyrazić kodowanie założeń w programach.

Są to przede wszystkim pozwalają na sprawdzenie warunków wstępnych, post-warunków i innych cech, a może znacznie usprawnić proces testowania i ostateczne jakość kodu, który jest napisany.

z Microsoft:

  • Runtime Sprawdzanie. Nasz binarny przepisujący modyfikuje program poprzez wstrzykiwanie umów, które są sprawdzane jako część programu> wykonanie. Przepisane programy poprawiają testowalność: każda umowa zachowuje się jak wyrocznia, dając testowi wskazanie pozytywnego/negatywnego. Automatyczne narzędzia testujące, takie jak Pex, wykorzystują umowy do generowania bardziej znaczących testów jednostkowych, odfiltrowując bezsensowne argumenty testowe, które nie spełniają warunków wstępnych.

  • Static Sprawdzanie. Nasz statyczny kontroler może zdecydować, czy są jakiekolwiek naruszenia umowy, nawet bez uruchamiania programu! Sprawdza ukryte kontrakty, takie jak zerowe dereferencje i ograniczenia tablic, a także jawne kontrakty.

  • generowania dokumentacji. Nasz generator dokumentacji rozszerza istniejące pliki dokumentów XML o informacje dotyczące umowy. Istnieją również nowe arkusze stylów, które mogą być używane z Sandcastle, więc wygenerowane strony dokumentacji mają sekcje kontraktów.

Więcej informacji:

+0

Dzięki Rionmonster, to było pomocne! –

17

Kontrakty Code to stosunkowo nowy sposób przeprowadzania kontroli na wejściu i wyjściu z funkcji. Tam, gdzie różnią się one od standardowego sprawdzania typu, jest to, że wygenerowany il sprawdzający dane wejściowe sprawdza go bezpośrednio przed wywołaniem funkcji, a kod, który sprawdza wyjście, po tym, jak twoja funkcja rzeczywiście się zakończyła.

Dlaczego ta funkcja jest przydatna?

Cóż, zapobiega modyfikowaniu zmiennych po tym, jak uważasz, że funkcja może powrócić, co potencjalnie może spowodować błędy.

Oto przykład.

public void doSomething(SomeObject foo) 
{ 
    Contract.Requires<ArgumentNullException>(foo != null); 
} 

Kontrakt Code wymaga, aby przed tą kontrolą nie było żadnego kodu. W wygenerowanym IL wartość foo jest testowana przed wywołaniem. Jest to pewny sposób na zapewnienie, że twoje dane wejściowe są zgodne z oczekiwaniami.

Drugi, to konstrukcja Contract.Ensures. Jest to zasadniczo jak Requires, ale działa na podstawie wartości zwracanej.

public int doSomethingElse() 
{ 
    Contract.Ensures(Contract.Result<int>() != 0); 
    int ret = 1; 
    return ret; 
} 

Byłoby to szczególnie przydatne, gdy trzeba było wiele ścieżek wyjścia ze swojej funkcji ...

public int someBadFunction() 
{ 
    Contract.Ensures(Contract.Result<int>() != 0); 
    if(....) 
    { 
     if(....) return 2; 
     if(....) return 8; 
    } 
    return 3; 
} 
Powiązane problemy