2013-03-18 13 views
8

Przeczytałem dzisiaj o kontraktach kodu C# 4.0. Wydaje się, że powszechną praktyką dla walidacji parametru do metody nie jest null jest w następujący sposób:C# code contract - unikanie sprawdzania parametrów dla zerowych odniesień

Contract.Requires(p != null); 

Jednak wydaje się zupełnie nieuzasadnione mi się, że będę musiał to zrobić dla każdego parametru każdej metody interfejsu w moim kodzie. W ogromnej większości przypadków oczekuje się, że parametry nie będą miały wartości NULL. Spodziewam się, że istnieje jakiś mechanizm, który pozwala na zdefiniowanie pewnych określonych parametrów, które są "dozwolone", aby były zerowe (podobnie do adnotacji "@Nullable" w Javie), a struktura Kontraktów automatycznie zapewni, że pozostałe nie będą zero.

Oprócz zaoszczędzenia zbyt wiele czasu na tych "sprawdzonych wzorcach" (jak również w wielu "klasach kontraktów", tyle razy po prostu nie ma żadnych warunków do zweryfikowania, z wyjątkiem parametrów innych niż zerowe), spowoduje to również czystsze kody kontraktów i bardziej "zorientowane na logikę".

Moje pytanie brzmi: czy jest jakiś sposób, aby to zrobić, a jeśli nie, to gdzie go nie ma, albo dlaczego moje podejście tutaj jest złe?

+0

Byłoby użyteczne, ale nie ma żadnego stenogramu, aby to zrobić, ponieważ nikt nie zmienił specyfikacji języka, aby go podać, a następnie zaimplementował i opublikował. Zobacz odpowiedź Eric'a Lippert'a na podobne pytanie: http://stackoverflow.com/questions/2806894/why-c-sharp-doesnt-implement-indexed-properties –

+0

Możesz użyć fragmentu 'crn', aby automatycznie wygenerować zestaw znaków dla te niezerowe instrukcje, które zmniejszają trochę pisanie. –

Odpowiedz

1

Nie zgadzam się, wartość null jest bardzo pomocna, gdy trzeba sprawdzić, czy coś jeszcze się nie zainicjowało, lub dane nie zostały znalezione, a czasami trzeba przekazać wartość zerową metodzie i jej grzywnie, Umowy kodowe są dobre dla typowych metod, które obsługują wiele klas i definicje API. Jeśli piszesz w warstwowej architekturze, musisz tylko chronić interakcje między warstwami i jesteś bezpieczny dla każdej warstwy.

Twoja domena ma wartości zerowe i jest w porządku.

+0

źle go rozumiesz. Pyta, dlaczego nie ma stenogramu mówiącego, że parametr nie może mieć wartości zerowej. –

+0

"A może dlaczego moje podejście tutaj jest błędne?" –

+1

Przepraszam, ale powinienem powiedzieć: Pyta, dlaczego wartości domyślne nie są domyślnie odrzucane, ale ze stenogramem mówiącym, że parametr * ma * wartość null. Jest zdecydowanie słuszny, że normalne jest to, że wartości null NIE są dozwolone (przynajmniej z mojego doświadczenia). –

Powiązane problemy