2010-06-05 19 views
15

Czy ktoś może mi powiedzieć, które jest lepsze podejście do sprawdzania poprawności w WPF.IDataErrorInfo vs ValidationRule vs Exception

  1. wykonawcze IDataErrorInfo
  2. Tworzenie ValidationRule
  3. rzucanie wyjątkami

pod względem wydajności, wycieki pamięci, kod konserwacji i ponownego wykorzystania.

Odpowiedz

20

Jest to rodzaj złożonej prośby, i szczerze mówiąc prawdopodobnie będzie się ona różnić w zależności od preferencji bardziej niż cokolwiek innego. Ale tutaj jest moje rozumienie:

  • Wydajność: Wyjątki straci prawie za każdym razem, chyba że Twoje inne implementacje są przerażające. Istnieje znaczny wpływ na cykl rzucania/złowienia. (Anegdota: Miałem kontrolę "musi być liczbą", która była wyjątkiem, "opóźniała" interfejs użytkownika przez zauważalny czas, kiedy się nie powiodła, ale po przekonwertowaniu do ValidationRule była natychmiastowa.)
  • Wycieki pamięci: To zależy od sposobu wykonania reguł sprawdzania poprawności lub implementacji IDataErrorInfo.
  • Utrzymanie kodu, ponowne użycie: To oczywiście interesująca część. Naprawdę powinieneś pytać: "kiedy właściwe jest użycie ValidationRule zamiast IDataErrorInfo?"

ValidationRules są starsze niż IDataErrorInfo (uważam, że ten ostatni został wprowadzony w .Net 3.5). Na podstawie tego samego, wydaje się, że zespół WPF preferuje IDataErrorInfo. Ale prawda jest taka, że ​​są zbudowane dla różnych rzeczy. Jeśli masz MVVM lub równoważny wzorzec, IDataErrorInfo jest lepszy od błędów w modelu (jak, powiedzmy, w negatywnym wieku), podczas gdy ValidationRules są lepsze od błędów w view (powiedzmy, w wieku ☃). Oczywiście możliwe jest, aby ValidationRules wykonał "logikę biznesową", lub żeby IDataErrorInfo powiedział ci "bałwan Unicode nie jest prawidłowym wiekiem", ale prawdopodobnie (prawdopodobnie) uzyskasz najlepszą łatwość konserwacji, utrzymując ten wzór.

Ale nie należy używać wyjątków do sprawdzania poprawności poza początkowymi testami, aby sprawdzić, jakie dokładnie warunki należy przetestować.

+4

Dziś został czytania na IDataErrorInfo - wydaje się, że jest starszy niż ValidationRule - wydaje się, że interfejs IDataErrorInfo istnieje od Framework 1.1 (http://msdn.microsoft.com/en-us/library/system.componentmodel.idataerrorinfo_properties (v = VS.71) .aspx), ale ValidationRule od wersji 3.0. Nie myśl, że to zasadniczo zmienia twoją odpowiedź – GrahamMc

3

Nie jest dobrym pomysłem użycie wyjątku do obsługi błędów. Używanie wyjątku zmniejszy wydajność. Jest to kwestia wyboru i implementacji IDataErrorInfo lub tworzenia ValidationRule.

IDataErrorInfo

    logika
  • Validation zachować w widoku modelu i łatwe do wdrożenia i utrzymania
  • pełną kontrolę nad wszystkimi polami w viewmodel

reguły poprawności

  • Utrzymuje regułę sprawdzania poprawności w oddzielnej klasie
  • Zwiększenie ponownego wykorzystania. Na przykład można zaimplementować wymaganą klasę walidacji , aby ponownie użyć go w całej aplikacji.

Moja opinia jest taka, że ​​do celów powszechnego sprawdzania poprawności, takich jak wymagane sprawdzanie poprawności pól, sprawdzanie adresów e-mail można użyć reguły sprawdzania poprawności. Jeśli chcesz wykonać niestandardowe sprawdzanie poprawności, takie jak sprawdzanie poprawności zakresu lub dowolna niestandardowa weryfikacja, użyj IDataerrorinfo.