แน่นอนฉันจะยืนยันว่ามีข้อบกพร่องในการออกแบบถ้าคุณรู้สึกว่าจำเป็นต้องโยนข้อยกเว้นจาก setter ทรัพย์สินหรือทะเยอทะยาน
คุณสมบัติที่เป็นนามธรรมที่แสดงถึงสิ่งที่เป็นเพียงค่า และคุณควรจะสามารถกำหนดค่าโดยไม่ต้องกลัวว่าการทำเช่นนั้นอาจทำให้เกิดข้อยกเว้น *
หากการตั้งค่าคุณสมบัติส่งผลให้เกิดผลข้างเคียงควรใช้วิธีนั้นแทน และถ้ามันไม่สร้างผลข้างเคียงใด ๆ ก็ไม่มีข้อยกเว้นควรถูกโยนทิ้ง
ตัวอย่างหนึ่งที่กล่าวถึงแล้วในคำตอบที่แตกต่างกันคือStream.Position
คุณสมบัติ สิ่งนี้จะสร้างผลข้างเคียงและอาจโยนข้อยกเว้น แต่ setter คุณสมบัตินี้เป็นเพียงเสื้อคลุมรอบ ๆStream.Seek
ที่คุณสามารถโทรหาแทน
โดยส่วนตัวฉันเชื่อว่าตำแหน่งไม่ควรเป็นทรัพย์สินที่เขียนได้
อีกตัวอย่างหนึ่งที่คุณอาจถูกล่อลวงให้โยนข้อยกเว้นจาก setter คุณสมบัติคือการตรวจสอบข้อมูล:
public class User {
public string Email {
get { return _email; }
set {
if (!IsValidEmail(value)) throw InvalidEmailException(value);
_email = value;
}
}
แต่มีวิธีแก้ไขปัญหานี้ได้ดีกว่า แนะนำประเภทที่อยู่อีเมลที่ถูกต้อง:
public class Email {
public Email(string value) {
if (!IsValidEmail(value)) throw new InvalidEmailException(value);
...
}
...
}
public class User {
public Email Email { get; set; }
}
Email
ชั้นเพื่อให้แน่ใจว่าจะไม่สามารถเก็บค่าที่ไม่ได้เป็นที่อยู่อีเมลที่ถูกต้องและชั้นเรียนที่จำเป็นที่จะต้องเก็บอีเมลจะถูกปลดออกจากหน้าที่ของการตรวจสอบพวกเขา
สิ่งนี้ยังนำไปสู่การทำงานร่วมกันที่สูงขึ้น (ตัวบ่งชี้ของการออกแบบซอฟต์แวร์ที่ดี) - ความรู้เกี่ยวกับที่อยู่อีเมลและวิธีการตรวจสอบความถูกต้องมีอยู่เฉพาะในEmail
ชั้นเรียนเท่านั้น
* ObjectDisposedException เป็นข้อยกเว้นที่ถูกต้องเท่านั้น (ไม่มีการเล่นสำนวนเจตนา) ฉันสามารถคิดได้ในขณะนี้