विकी में उदाहरण JML है, जो एक बहुत ही विशेष, आकर्षक और शायद अच्छी तरह से है के साथ अपरिवर्तनशीलताओं लागू कर रहा है यही कारण है कि -थॉट-आउट रिसर्च टेक्नोलॉजी, लेकिन यह मुख्यधारा आवश्यक नहीं है। इसके अलावा यह सिर्फ इनवेरिएंट के बारे में बात नहीं कर रहा है, बल्कि एक म्यूटेटर को जोर देने के बारे में बात करने की अपेक्षा की गई थी, जो मुझे लगता है कि जब मैं इनवेरिएंट्स के बारे में सोचता हूं। मैंने काम पर कोडर नहीं पढ़े हैं, लेकिन मुझे संदेह है कि काम पर कोडर्स में किसी ने जेएमएल का इस्तेमाल किया था।
वैसे भी, मैंने हमेशा सोचा था कि इनवेरिएंट "जल्दी दुर्घटनाग्रस्त" होने का एक शानदार तरीका थे और अपने कोड को उचित चीजों को करने की कोशिश करने से रोकते थे जब वास्तव में प्रोग्राम स्थिति एक अनुचित (अनियोजित) राज्य में होती है।
सी # कोड में एक आविष्कार का एक अच्छा उदाहरण कभी भी एन-हाइबरनेट को सहेजने के लिए ऑब्जेक्ट नहीं देना चाहिए जब तक कि उस ऑब्जेक्ट पर अपने ऑब्जेक्ट्स को पार नहीं किया जाता है, जिसमें से गैर-संवेदी डेटा को रोकने के लिए कई होना चाहिए डेटाबेस में प्रवेश चलो देखते हैं अगर मैं किसी भी अन्य उदाहरण के बारे में सोच सकते हैं ...
मान लीजिए आप एक उपयोगकर्ता वर्ग है हमेशा एक प्राथमिक ईमेल पता संपत्ति है माना जाता है, तो सहेजा जा रहा है से पहले जांच करने के लिए एक अपरिवर्तनीय हो सकता है बनाने के लिए सुनिश्चित करें कि ईमेल पता फ़ील्ड खाली नहीं है। अन्यथा, अन्य अनुप्रयोग तर्क मानते हैं कि उपयोगकर्ताओं के लिए ईमेल पते मौजूद हैं उपयोगकर्ता को बाद में एक ईमेल भेजने के लिए उपयोगकर्ता गड़बड़ कर सकते हैं।
आगे कहा कि एक उपयोगकर्ता वस्तु ईमेल वस्तुओं "कई है" मान लीजिए, और लगता है कि यह किसी भी मतलब नहीं है के लिए एक ईमेल ईमेल वर्ग पर एक मालिक उपयोगकर्ता के बिना एक अपरिवर्तनीय अस्तित्व के लिए, तो यह सुनिश्चित करने के लिए हो सकता है कि ईमेल का संदर्भ है, इसके उपयोगकर्ता हमेशा शून्य नहीं होते हैं, अन्यथा आपके पास अनाथ ईमेल ऑब्जेक्ट है जो नतीजे के बाद हो सकता है जब आप ईमेल के स्वामी को संदर्भित करने का प्रयास करते हैं।
मान लीजिए आप एक जीयूआई कि एक पारंपरिक WPF रूप में एक अमेज़न S3 वस्तु की स्थिति पेश करने के लिए माना जाता है लिख रहे हैं। फॉर्म पर एक आविष्कार यह सुनिश्चित करने के लिए हो सकता है कि फॉर्म किसी भी ईवेंट हैंडलर को उस फ़ॉर्म पर निष्पादित करने से पहले अपने ऑब्जेक्ट पर ठीक से बाध्य है।
मान लीजिए कि आप स्टैक ओवरफ्लो लिख रहे हैं। यहां एक आविष्कार यह सुनिश्चित करने के लिए हो सकता है कि उपयोगकर्ता प्रतिष्ठा स्तर कभी नकारात्मक न हो, यदि उपयोगकर्ता प्रतिष्ठा जुर्माना ले रहा है। नकारात्मक प्रतिष्ठा उन सुंदर ग्राफों को तोड़ सकती है जो को समय के एक समारोह के रूप में अनुभव प्रदान करते हैं (जब तक कि उन ग्राफ 0 y-axis के नीचे चार्ट लाइनों के लिए तैयार नहीं होते हैं, जिन्हें वे बहुत अच्छी तरह से हो सकते हैं ...)।
इनवेरिएंट की जांच करने के लिए, आप डेटा स्थिति को म्यूट करने वाले किसी भी विधि के अंत में ऐसा कर सकते हैं। रक्षात्मक प्रोग्रामिंग के सबसे आक्रामक और पागल स्तर पर, आप सभी तरीकों से पहले और बाद में एक आविष्कार की जांच कर सकते हैं।
स्रोत
2011-01-03 15:56:37
यह मजाकिया आप कहते हैं कि .NET invariance अन्य प्रकार के आविष्कार से संबंधित नहीं है। मैं सहमत नहीं हूं, लेकिन शायद यही वह जगह है जहां मैं गलत हूं। शायद टाइप-इनवेरिएंस क्लास-इनवेरिएंस और यूनिट टेस्ट उपयोग से संबंधित नहीं है, या केवल प्राथमिक स्तर पर संबंधित है। अगर हम "invariance" को परिभाषित करते हैं तो बस "बदल नहीं आता"। सवाल यह है कि "आप उन चीज़ों के लिए कैसे परीक्षण करते हैं जो नहीं बदलते हैं"। या, सवाल यह है कि "आप मान्य मानों की एक श्रृंखला के लिए कैसे परीक्षण करते हैं"? –
@ पी। ब्रायन कई प्रकार के आविष्कार हैं। और प्रकार भिन्नता वर्ग-इनवेरिएंट से पूरी तरह से असंबंधित है। मैंने एक प्रारंभिक अनुच्छेद जोड़ा है। – CodesInChaos
@ पी। ब्रायन यह देखने के लिए कि .NET 4 में क्लास इनवेरिएंट को कैसे लागू किया जाए, "ली" का जवाब देखें। यदि आप ऐसा करते हैं (और सही कंपाइलर सेटिंग्स का चयन करें) तो आपका कोड फिर से लिखा जाएगा ताकि यह किसी भी सार्वजनिक विधि के अंत में आविष्कार का परीक्षण कर सके। – CodesInChaos