2011-01-03 8 views
7

coders at work पुस्तक में, लेखक पूछता है "आप अपने कोड में इनवेरिएंट का उपयोग कैसे करते हैं"। कृपया बताएं कि इस सवाल का क्या अर्थ है।सी # प्रोग्रामिंग में आविष्कार किए गए दावे को फिट करें?

मैंने क्लास इनवेरिएंट on wiki देखा, लेकिन उदाहरण जावा में है और मैं इस उदाहरण को सी # से जोड़ने के लिए जावा में पर्याप्त कुशल नहीं हूं। .NET 4.0 invariance, covariance, और contravariance पेश करता है और अच्छी तरह से समझाया गया है here. Invariance इतना व्यापक है। शब्द के लेखकों का उपयोग इकाई परीक्षण से संबंधित लगता है। पुस्तक पढ़ने वाले लोगों के लिए, लेखक का क्या अर्थ है? क्या हम इकाई परीक्षण के बाद एक धारणा बनाने और वैधता का परीक्षण करने के बारे में बात कर रहे हैं?

उत्तर

10

शब्द परिवर्तक का अर्थ कुछ शर्तों के तहत कुछ नहीं बदलता है। कई प्रकार के आविष्कार हैं। उदाहरण के लिए भौतिकी में प्रकाश की गति lorentz-transform के अंतर्गत invariant है, यानी यदि आप संदर्भ फ्रेम में बदलते हैं तो यह नहीं बदलेगा। प्रोग्रामिंग में कई प्रकार के आविष्कार भी हैं। ऐसे क्लास इनवेरिएंट हैं जो किसी ऑब्जेक्ट के जीवनकाल में नहीं बदलते हैं, विधि परिवर्तक जो किसी फ़ंक्शन के जीवन के दौरान नहीं बदलते हैं ...

एक कक्षा परिवर्तक हमेशा ऐसा होता है (कम से कम सार्वजनिक रूप से देखने योग्य बार) उस वर्ग के एक उदाहरण में सच है।

यह सह-/ अनुबंध-भिन्नता से संबंधित नहीं है। सह-/कॉन्ट्रा-वेरिएंस वर्णन करता है कि किस प्रकार को अन्य प्रकार के लिए अलग-अलग (जेनेरिक) पैरामीटर या रिटर्न प्रकारों के साथ प्रतिस्थापित किया जा सकता है। जबकि आप कुछ invariant को कॉल कर सकते हैं क्योंकि यह सह-कंट्रा-भिन्नता का समर्थन नहीं करता है, यह कक्षा या विधि परिवर्तक की तुलना में एक पूरी तरह से अलग तरह का आविष्कार है।

  • डेटा:

    उदाहरण के लिए संग्रह के कुछ प्रकार निम्नलिखित अपरिवर्तनशीलताओं हो सकता है!= अशक्त

  • आकार> = 0
  • क्षमता> = 0
  • आकार < = क्षमता

इस वर्ग के साथ:

class MyCollection<T> 
{ 
    private T[] data; 
    private int size; 

    public MyCollection() 
    { 
    data=new T[4]; 
    } 

    public int Size{get{return size;}} 
    public int Capacity{get{return data.Length;}} 

    [ContractInvariantMethod] 
    protected void ClassInvariant() 
    { 
    Contract.Invariant(data != null); 
    Contract.Invariant(Size >= 0); 
    Contract.Invariant(Capacity >= 0); 
    Contract.Invariant(Size < Capacity); 
    } 
} 

लगभग हर वर्ग कुछ अपरिवर्तनशीलताओं है, लेकिन नहीं हर कोई उन्हें लागू करता है। .NET 4 दस्तावेज़ अनुबंधों का उपयोग करके उन्हें दस्तावेज़ बनाने और उनका दावा करने का एक अच्छा तरीका जोड़ता है।

+1

यह मजाकिया आप कहते हैं कि .NET invariance अन्य प्रकार के आविष्कार से संबंधित नहीं है। मैं सहमत नहीं हूं, लेकिन शायद यही वह जगह है जहां मैं गलत हूं। शायद टाइप-इनवेरिएंस क्लास-इनवेरिएंस और यूनिट टेस्ट उपयोग से संबंधित नहीं है, या केवल प्राथमिक स्तर पर संबंधित है। अगर हम "invariance" को परिभाषित करते हैं तो बस "बदल नहीं आता"। सवाल यह है कि "आप उन चीज़ों के लिए कैसे परीक्षण करते हैं जो नहीं बदलते हैं"। या, सवाल यह है कि "आप मान्य मानों की एक श्रृंखला के लिए कैसे परीक्षण करते हैं"? –

+0

@ पी। ब्रायन कई प्रकार के आविष्कार हैं। और प्रकार भिन्नता वर्ग-इनवेरिएंट से पूरी तरह से असंबंधित है। मैंने एक प्रारंभिक अनुच्छेद जोड़ा है। – CodesInChaos

+0

@ पी। ब्रायन यह देखने के लिए कि .NET 4 में क्लास इनवेरिएंट को कैसे लागू किया जाए, "ली" का जवाब देखें। यदि आप ऐसा करते हैं (और सही कंपाइलर सेटिंग्स का चयन करें) तो आपका कोड फिर से लिखा जाएगा ताकि यह किसी भी सार्वजनिक विधि के अंत में आविष्कार का परीक्षण कर सके। – CodesInChaos

2

इस मामले में, इनवेरिएंट का मतलब पैरामीटर पर लागू होने वाली स्थितियों और कार्य/विधि के पूरे जीवन में सत्य रहता है।

wikipedia से:

कंप्यूटर विज्ञान में, विधेय के आपरेशन के एक दृश्य के लिए एक अपरिवर्तनीय कहा जाता है, बशर्ते कि: यदि विधेय अनुक्रम शुरू करने से पहले सच है, तो यह सच के अंत में है अनुक्रम।

.NET में, इन्हें Code Contracts का उपयोग करके चेक/लागू किया जा सकता है।

+0

मुझे नहीं लगता कि आपको मेरे प्रश्न को समझने के लिए पुस्तक को पढ़ने की जरूरत है, लेकिन लेखक जिस तरह से सवाल पूछता है वह "तथ्य की बात" या "आप इन चीजों का उपयोग कैसे करते हैं" जैसे कि हर कोई ऐसा करता है। मैंने किसी भी उद्देश्य के लिए जानबूझकर इनवेरिएंट का उपयोग नहीं किया है, और .NET में ऐसा लगता है कि हमें दीवार पर बंद करने की आवश्यकता है। तो, अवार्डियों की अतीत की बात या असेंबली/सी/सी ++ तक सीमित है? –

+0

@ पी। ब्रायन.मैकी - मैंने कभी उनका उपयोग नहीं किया है, हालांकि, ऐसा लगता है कि सीएस पृष्ठभूमि से आने वाले लोग इसे बेहतर "शुद्धता" पाने का प्रयास करने का प्रयास करते हैं। मुझे लगता है कि वह मानता है कि हर कोई इनवेरिएंट्स के बारे में जानता है और उनका उपयोग कैसे करें - पुस्तक में दिखाए गए लोगों पर विचार करें :) – Oded

1

इस संदर्भ में अर्थ सी # 4 में पेश जेनरिक के लिए सह और कॉन्ट्रैक्ट भिन्नता से संबंधित नहीं है, बल्कि विकिपीडिया लेख के समान ही है। सी # में यह डीबग दावे (यानी Debug.Assert(condition)) के साथ-साथ कोड अनुबंध लाइब्रेरी भी हो सकता है। वहाँ उदाहरण के लिए है ContractInvariantMethodAttribute जो एक वर्ग जो वर्ग अपरिवर्तनशीलताओं दावा में एक विधि को लागू किया जा सकता है:

[ContractInvariantMethod] 
protected void ClassInvariant() 
{ 
    Contract.Invariant(someCondition); 
} 
2

विकी में उदाहरण JML है, जो एक बहुत ही विशेष, आकर्षक और शायद अच्छी तरह से है के साथ अपरिवर्तनशीलताओं लागू कर रहा है यही कारण है कि -थॉट-आउट रिसर्च टेक्नोलॉजी, लेकिन यह मुख्यधारा आवश्यक नहीं है। इसके अलावा यह सिर्फ इनवेरिएंट के बारे में बात नहीं कर रहा है, बल्कि एक म्यूटेटर को जोर देने के बारे में बात करने की अपेक्षा की गई थी, जो मुझे लगता है कि जब मैं इनवेरिएंट्स के बारे में सोचता हूं। मैंने काम पर कोडर नहीं पढ़े हैं, लेकिन मुझे संदेह है कि काम पर कोडर्स में किसी ने जेएमएल का इस्तेमाल किया था।

वैसे भी, मैंने हमेशा सोचा था कि इनवेरिएंट "जल्दी दुर्घटनाग्रस्त" होने का एक शानदार तरीका थे और अपने कोड को उचित चीजों को करने की कोशिश करने से रोकते थे जब वास्तव में प्रोग्राम स्थिति एक अनुचित (अनियोजित) राज्य में होती है।

सी # कोड में एक आविष्कार का एक अच्छा उदाहरण कभी भी एन-हाइबरनेट को सहेजने के लिए ऑब्जेक्ट नहीं देना चाहिए जब तक कि उस ऑब्जेक्ट पर अपने ऑब्जेक्ट्स को पार नहीं किया जाता है, जिसमें से गैर-संवेदी डेटा को रोकने के लिए कई होना चाहिए डेटाबेस में प्रवेश चलो देखते हैं अगर मैं किसी भी अन्य उदाहरण के बारे में सोच सकते हैं ...

  • मान लीजिए आप एक उपयोगकर्ता वर्ग है हमेशा एक प्राथमिक ईमेल पता संपत्ति है माना जाता है, तो सहेजा जा रहा है से पहले जांच करने के लिए एक अपरिवर्तनीय हो सकता है बनाने के लिए सुनिश्चित करें कि ईमेल पता फ़ील्ड खाली नहीं है। अन्यथा, अन्य अनुप्रयोग तर्क मानते हैं कि उपयोगकर्ताओं के लिए ईमेल पते मौजूद हैं उपयोगकर्ता को बाद में एक ईमेल भेजने के लिए उपयोगकर्ता गड़बड़ कर सकते हैं।

  • आगे कहा कि एक उपयोगकर्ता वस्तु ईमेल वस्तुओं "कई है" मान लीजिए, और लगता है कि यह किसी भी मतलब नहीं है के लिए एक ईमेल ईमेल वर्ग पर एक मालिक उपयोगकर्ता के बिना एक अपरिवर्तनीय अस्तित्व के लिए, तो यह सुनिश्चित करने के लिए हो सकता है कि ईमेल का संदर्भ है, इसके उपयोगकर्ता हमेशा शून्य नहीं होते हैं, अन्यथा आपके पास अनाथ ईमेल ऑब्जेक्ट है जो नतीजे के बाद हो सकता है जब आप ईमेल के स्वामी को संदर्भित करने का प्रयास करते हैं।

  • मान लीजिए आप एक जीयूआई कि एक पारंपरिक WPF रूप में एक अमेज़न S3 वस्तु की स्थिति पेश करने के लिए माना जाता है लिख रहे हैं। फॉर्म पर एक आविष्कार यह सुनिश्चित करने के लिए हो सकता है कि फॉर्म किसी भी ईवेंट हैंडलर को उस फ़ॉर्म पर निष्पादित करने से पहले अपने ऑब्जेक्ट पर ठीक से बाध्य है।

  • मान लीजिए कि आप स्टैक ओवरफ्लो लिख रहे हैं। यहां एक आविष्कार यह सुनिश्चित करने के लिए हो सकता है कि उपयोगकर्ता प्रतिष्ठा स्तर कभी नकारात्मक न हो, यदि उपयोगकर्ता प्रतिष्ठा जुर्माना ले रहा है। नकारात्मक प्रतिष्ठा उन सुंदर ग्राफों को तोड़ सकती है जो को समय के एक समारोह के रूप में अनुभव प्रदान करते हैं (जब तक कि उन ग्राफ 0 y-axis के नीचे चार्ट लाइनों के लिए तैयार नहीं होते हैं, जिन्हें वे बहुत अच्छी तरह से हो सकते हैं ...)।

इनवेरिएंट की जांच करने के लिए, आप डेटा स्थिति को म्यूट करने वाले किसी भी विधि के अंत में ऐसा कर सकते हैं। रक्षात्मक प्रोग्रामिंग के सबसे आक्रामक और पागल स्तर पर, आप सभी तरीकों से पहले और बाद में एक आविष्कार की जांच कर सकते हैं।

संबंधित मुद्दे