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