ฉันมีปัญหาการออกแบบเกี่ยวกับคุณสมบัติ. 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
หรือ