O ile przeczytałem w skróconej książce, umowy kodowe mogą pogorszyć wydajność środowiska wykonawczego.Umowy na kod w czasie wykonywania
Czy można wyłączyć umowy kodowe w produkcji?
O ile przeczytałem w skróconej książce, umowy kodowe mogą pogorszyć wydajność środowiska wykonawczego.Umowy na kod w czasie wykonywania
Czy można wyłączyć umowy kodowe w produkcji?
The user manual wyjaśnia to z dużą ilością szczegółów - są różne opcje, które możesz mieć. Każda konfiguracja kompilacji może mieć inne ustawienia, dla których kontrakty są sprawdzane w czasie wykonywania, i nie jest to wybór "wszystko albo nic" - można wymusić wszystkie, niektóre lub żadne z umów, na podstawie ustawień, które można zmodyfikować w Visual Studio.
We właściwościach projektu przejdź do Umowy kodu, wybierz konfigurację "Zwolnienie" i usuń zaznaczenie pola wyboru Sprawdzanie w czasie wykonywania.
Mam moje ulubione opcje opisane on my blog.
Podsumowując:
Niektórzy ludzie wolą, aby warunki wstępne zostały uwzględnione w ich wydaniu. Jest to szczególnie przydatne w przypadku dystrybucji za pośrednictwem NuGet, ponieważ they don't support Code Contract dlls. W przypadku pakietów NuGet migruję w kierunku uwzględnienia warunków wstępnych w kompilacjach wydań, ale mam też osobne pobieranie dla wersji "Release without Preconditions".
Różnica w wydajności jest niewielka i nie wpływa na Twój kod w zauważalny sposób. Chyba, że rozwijasz jakiś system handlu akcjami w czasie rzeczywistym, naprawdę nie martwiłbym się o to.
O ile wyłączenie kodu w produkcji, wolałbym raczej mieć dodatkową ochronę kontraktów kodu zamiast jakiegoś prawdopodobnie niejasnego błędu. Błąd w umowie o kodeks powie dokładnie, gdzie i dlaczego kontrakt został naruszony, a nie musiał kopać w jakiś głęboki stos wywoławczy tylko dlatego, że niektóre złe dane zostały przekazane na 5 poziomach w górę drzewa stosu wywołań.
@svanryckeghem i @Stephen Cleary: Jeśli używasz lub zamierzasz korzystać Contract.Requires<TException>
i nie pozwalają „Runtime kontraktu Sprawdzanie”, otrzymasz awarię wykonawczego o rewriter (IL), która chciałaby ccrewrite.exe być zobowiązani do korzystania z umów kodowych. Będziesz wówczas musiał włączyć sprawdzanie kontraktów Runtime, aby to działało.
IMHO, użycie Contract.Requires<TException>()
jest o wiele bardziej przydatne niż Contract.Requires()
, ponieważ masz kontrolę nad typem zgłaszanego wyjątku.
'Contract.Requires()', nie zgadzam się, że jest to bardziej przydatne, myślę, że jest to coś więcej niż coś starego - w ogóle go nie używam. Kontrakt wymaga prawie wszystkich argumentów wyjątkowych tego rodzaju, a warunek boolowski jest wystarczającą informacją; jeśli odpowiednio zaprojektujesz rzeczy. "Kontrakty" to nie tylko inny sposób robienia 'wyjątków', wymagają innego podejścia. –
nicodemus13
Fraza operacyjna w twoim komentarzu to "... prawie wszystkie wyjątki od argumentów ...". Nie chcę tworzyć umów opartych na "prawie". Jeśli mogę zagwarantować, że wszystkie są tego samego rodzaju wyjątków, to tak, używając umowy.Wymaga() jest zbędny. Jednak nie jest to gwarantowane i wolałbym objąć wszystkie scenariusze - szczególnie te skrajne - w przeciwnym razie twoje umowy stałyby się niczym więcej niż spekulacjami. –