मैं .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?