ฉันมีปัญหาการออกแบบเกี่ยวกับคุณสมบัติ. NET
interface IX
{
Guid Id { get; }
bool IsInvalidated { get; }
void Invalidate();
}
ปัญหา:
อินเตอร์เฟซนี้มีสองคุณสมบัติอ่านอย่างเดียวและId IsInvalidatedอย่างไรก็ตามความจริงที่ว่าพวกเขาเป็นแบบอ่านอย่างเดียวไม่สามารถรับประกันได้ว่าค่าของพวกเขาจะคงที่
สมมติว่ามันเป็นความตั้งใจของฉันที่จะทำให้ชัดเจนว่า ...
Idแทนค่าคงที่ (ซึ่งอาจถูกแคชอย่างปลอดภัย) ในขณะที่IsInvalidatedอาจเปลี่ยนค่าในช่วงอายุของIXวัตถุ (และไม่ควรแคช)
ฉันจะปรับเปลี่ยนinterface IXเพื่อให้สัญญานั้นชัดเจนเพียงพอได้อย่างไร
ความพยายามสามข้อของฉันในการแก้ปัญหา:
อินเตอร์เฟสได้รับการออกแบบมาอย่างดี การปรากฏตัวของวิธีการที่เรียกว่า
Invalidate()ช่วยให้โปรแกรมเมอร์ที่จะอนุมานว่ามูลค่าของทรัพย์สินที่มีชื่อคล้ายกันIsInvalidatedอาจได้รับผลกระทบจากมันอาร์กิวเมนต์นี้มีไว้เฉพาะในกรณีที่เมธอดและคุณสมบัติมีชื่อคล้ายกัน
เพิ่มส่วนต่อประสานนี้กับกิจกรรม
IsInvalidatedChanged:bool IsInvalidated { get; } event EventHandler IsInvalidatedChanged;สถานะของ
…Changedเหตุการณ์สำหรับIsInvalidatedสถานะที่คุณสมบัตินี้อาจเปลี่ยนค่าและการไม่มีเหตุการณ์ที่คล้ายกันสำหรับIdเป็นสัญญาว่าคุณสมบัตินั้นจะไม่เปลี่ยนค่าของมันฉันชอบโซลูชันนี้ แต่มีสิ่งเพิ่มเติมมากมายที่อาจไม่ได้ใช้เลย
แทนที่คุณสมบัติ
IsInvalidatedด้วยเมธอดIsInvalidated():bool IsInvalidated();นี่อาจเป็นการเปลี่ยนแปลงที่ลึกซึ้งเกินไป มันควรจะเป็นคำใบ้ว่าค่านั้นคำนวณใหม่ทุกครั้ง - ซึ่งไม่จำเป็นถ้ามันเป็นค่าคงที่ หัวข้อ MSDN "การเลือกระหว่างคุณสมบัติและวิธีการ"มีไว้เพื่อพูดเกี่ยวกับเรื่องนี้:
ใช้เมธอดแทนคุณสมบัติในสถานการณ์ต่อไปนี้ […] การดำเนินการจะส่งกลับผลลัพธ์ที่แตกต่างกันในแต่ละครั้งที่มีการเรียกใช้แม้ว่าพารามิเตอร์จะไม่เปลี่ยนแปลง
ฉันคาดหวังคำตอบแบบไหน?
ฉันสนใจมากที่สุดในการแก้ปัญหาที่แตกต่างอย่างสิ้นเชิงพร้อมกับคำอธิบายว่าพวกเขาเอาชนะความพยายามของฉันได้อย่างไร
หากความพยายามของฉันมีข้อบกพร่องอย่างมีเหตุผลหรือมีข้อเสียอย่างมีนัยสำคัญที่ยังไม่ได้กล่าวถึงเช่นว่ายังมีวิธีแก้ปัญหาเพียงหนึ่งเดียว (หรือไม่มีเลย) ฉันอยากจะได้ยินเกี่ยวกับที่ที่ฉันทำผิด
หากมีข้อบกพร่องเล็กน้อยและยังมีวิธีแก้ไขมากกว่าหนึ่งวิธีหลังจากนำมาพิจารณาโปรดแสดงความคิดเห็น
อย่างน้อยที่สุดฉันต้องการคำติชมเกี่ยวกับวิธีแก้ปัญหาที่คุณต้องการและเหตุผลอะไรบ้าง
class Foo : IFoo { private bool isInvalidated; public bool IsInvalidated { get { return isInvalidated; } } public void Invalidate() { isInvalidated = true; } }
InvalidStateExceptionตัวอย่างเช่น แต่ฉันไม่แน่ใจว่าสิ่งนี้เป็นไปได้ในทางทฤษฎีหรือไม่ จะดี แต่
IsInvalidatedต้องการprivate setหรือ