Zdecydowanie twierdzę, że projekt ma wadę, jeśli odczuwasz potrzebę rzucenia wyjątków od ustawiacza nieruchomości lub gettera.
Właściwość jest abstrakcją, która reprezentuje coś, co jest tylko wartością . Powinieneś być w stanie ustawić wartość bez obawy, że może to spowodować wyjątek. *
Jeśli ustawienie właściwości powoduje efekt uboczny, należy ją zaimplementować jako metodę. A jeśli nie wywołuje to żadnych skutków ubocznych, nie należy rzucać żadnych wyjątków.
Jednym z przykładów wspomnianych już w innej odpowiedzi jest Stream.Position
właściwość. To powoduje skutki uboczne i może rzucać wyjątki. Ale to narzędzie do ustawiania właściwości jest po prostu opakowaniem Stream.Seek
, które można zamiast tego wywołać.
Osobiście uważam, że to stanowisko nie powinno być własnością do zapisu.
Innym przykładem, w którym możesz ulec pokusie rzucenia wyjątku z ustawiacza właściwości, jest sprawdzanie poprawności danych:
public class User {
public string Email {
get { return _email; }
set {
if (!IsValidEmail(value)) throw InvalidEmailException(value);
_email = value;
}
}
Ale istnieje lepsze rozwiązanie tego problemu. Wprowadź typ reprezentujący prawidłowy adres e-mail:
public class Email {
public Email(string value) {
if (!IsValidEmail(value)) throw new InvalidEmailException(value);
...
}
...
}
public class User {
public Email Email { get; set; }
}
Do Email
klasy zapewnia, że nie może posiadać wartość, która nie jest prawidłowy adres e-mail i klas, które trzeba przechowywać e-maile są zwolnione z obowiązku ich zatwierdzania.
Prowadzi to również do większej spójności (wskaźnik dobrego projektu oprogramowania) - wiedza o tym, czym jest adres e-mail i jak jest weryfikowany, istnieje tylko w Email
klasie, która ma tylko takie obawy.
* ObjectDisposedException to jedyny prawidłowy wyjątek (bez zamierzonej gry słów), o którym mogę teraz myśleć.