Saya pasti akan berpendapat bahwa ada cacat dalam desain jika Anda merasa perlu untuk membuang pengecualian dari pengambil properti atau pengambil.
Properti adalah abstraksi yang mewakili sesuatu yang hanya berupa nilai . Dan Anda harus dapat menetapkan nilai tanpa takut hal itu dapat menimbulkan pengecualian. *
Jika pengaturan properti menghasilkan efek samping, yang seharusnya benar-benar diterapkan sebagai metode. Dan jika itu tidak menghasilkan efek samping, maka tidak terkecuali harus dibuang.
Salah satu contoh yang telah disebutkan dalam jawaban yang berbeda adalah Stream.Position
properti. Ini memang menghasilkan efek samping, dan bisa menimbulkan pengecualian. Tapi setter properti ini pada dasarnya hanya pembungkus Stream.Seek
yang bisa Anda hubungi.
Secara pribadi, saya percaya bahwa posisi itu seharusnya bukan properti yang dapat ditulisi.
Contoh lain di mana Anda bisa tergoda untuk melempar pengecualian dari properti setter adalah dalam validasi data:
public class User {
public string Email {
get { return _email; }
set {
if (!IsValidEmail(value)) throw InvalidEmailException(value);
_email = value;
}
}
Tetapi ada solusi yang lebih baik untuk masalah ini. Perkenalkan jenis yang mewakili alamat email yang valid:
public class Email {
public Email(string value) {
if (!IsValidEmail(value)) throw new InvalidEmailException(value);
...
}
...
}
public class User {
public Email Email { get; set; }
}
The Email
Memastikan kelas yang tidak dapat memegang nilai yang bukan alamat email yang valid, dan kelas yang perlu toko email dibebaskan dari tugas memvalidasi mereka.
Ini juga mengarah pada kohesi yang lebih tinggi (indikator desain perangkat lunak yang baik) - pengetahuan tentang apa alamat email itu, dan bagaimana alamat itu divalidasi, hanya ada di Email
kelas, yang hanya memiliki keprihatinan itu.
* ObjectDisposedException adalah satu-satunya pengecualian yang valid (tidak ada kata pun yang dimaksudkan) yang dapat saya pikirkan saat ini.