2012-01-30 13 views
11

Wcześniej widziałem wątek na StackOverflow, który miał trochę dyskusji na ten temat, jednak nie mogę go znaleźć ponownie!Używanie System.Diagnostics.Contract w wersjach Release

Interesuje mnie, czy klasy System.Diagnostics.Contract powinny być używane w "prawdziwym kodzie", tzn. W wersji wydania kodu produkcyjnego? Pytam o to, ponieważ w oparciu o opis przestrzeni nazw wydaje się, że umowa ma na celu debugowanie lub analizę.

Wygląda na to, że jest to użyteczna biblioteka, w której ważne są warunki przed/po funkcjonalności, i może uniknąć wysiłku w pisaniu dużej liczby kontroli///else, a jeśli tak, to czy istnieje alternatywa w główne biblioteki?

+1

Proszę nie zamieniać tytułów na "C#" i tym podobne. Po to są te tagi. –

Odpowiedz

11

Sekcja 5.1 (Argument Walidacja i umowy) z documentation szczegóły trzech głównych trybów pracy można sądzić za korzystanie umów: walidacja

  1. Argument poprzez umowy tylko w Debug buduje, nie tworzy dodatkowych praw.
  2. Sprawdzanie poprawności również w kompilacjach wydań.
  3. Sprawdzanie poprawności argumentów niestandardowych w kompilacjach wydań, kontrakty tylko w kompilacjach debugowania.

Jest więc co najmniej jeden tryb użycia, w którym można używać kontraktów w wersjach Release, przynajmniej w oficjalnej dokumentacji.

Cytat:

Przed rozpoczęciem korzystania kontrakty w swoim własnym kodzie, trzeba zrobić kilka decyzji, które formy wpływ jaki kontrakt używać do sprawdzania poprawności argumentów i gdzie (patrz rysunek 2). Zauważ, że możesz podejmować te decyzje niezależnie dla każdego zarządzanego zespołu, który wytworzyłeś (każdy projekt):

Najprostszym sposobem użycia narzędzi kontraktowych jest to, że nie musisz wykonywać sprawdzania poprawności argumentów w środowisku wykonawczym w kompilacjach wersji (Sposób użycia 1). W takim przypadku korzystasz z narzędzi kontraktowych podczas tworzenia, ale nie z dostarczonych bitów. Pamiętaj, że możesz wysłać zestaw referencyjny kontraktu wraz z bity wydania, aby klienci mogli uzyskać sprawdzanie poprawności parametrów w swoich kompilacjach debugujących za pośrednictwem strony wywoławczej, która wymaga sprawdzenia.

Drugim prostszym podejściem, jeśli potrzebujesz sprawdzania poprawności argumentów w kompilacji wydania, jest włączenie sprawdzania kontraktu we wszystkich kompilacjach (użycie 2). W związku z tym korzystasz z narzędzi do tworzenia ciągów runtime swoich warunków i do wykonywania dziedziczenia kontraktu dla ciebie. Można wybrać tworzenie wyjątków dla sprawdzania poprawności parametrów lub mieć domyślny wyjątek ContractException. Ryzyko korzystania z narzędzi kontraktowych w wersji Release zależy od narzędzi, które nie osiągnęły poziomu jakości produkcji.

Najprostszym połączeniem jest sprawdzanie poprawności argumentów w kompilacjach wydań, ale używa się narzędzia kontraktowego do sprawdzania w czasie wykonywania tylko w kompilacjach debugowania, ale nie w kompilacji wydania (użycie 3). W takim przypadku musisz kontynuować pisanie sprawdzania poprawności argumentów w taki sposób, jak już to robisz, a mianowicie za pomocą instrukcji if-then-throw (nazywamy je starszymi). Jeśli chcesz, aby były one dostępne do wykrycia, dodaj inne umowy (takie jak Ensures) za nimi lub użyj Contract.EndContractBlock(), jeśli nie ma żadnych innych umów. Zauważ, że skoro nie używasz narzędzi sprawdzających środowisko wykonawcze w kompilacji wydania, nie otrzymasz żadnego spadku kontraktów i musisz ręcznie powtórzyć swoje starsze wersje - wymaga to nadpisań i implementacji interfejsu.W przypadku interfejsów i metod abstrakcyjnych nadal uzyskuje się najwięcej korzyści, jeśli piszemy klasy kontraktowe z normalnymi wymaganiami i upewniamy się, że formularze są sprawdzane w kompilacjach debugowania i pojawiają się w zestawach referencyjnych umów, a zatem są widoczne dla projektów zależnych i dla statycznych kontrolerów.

Wskazuje to również na to, co alternatywne przy użyciu tylko innych części ramy będzie: zwykły sposób przy użyciu if-then-throw.

Powiązane problemy