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.Positionwł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 Emailklasy 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 Emailklasie, 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ć.