मुझे नहीं पता कि यह दावा कि "यह नहीं करता है और अक्सर स्थैतिक विश्लेषण नहीं कर सकता है" से आता है। दावे का पहला हिस्सा स्पष्ट रूप से गलत है। दूसरा व्यक्ति "अक्सर" से आपके मतलब का निर्भर करता है। मैं बल्कि यह कहना चाहूंगा कि अक्सर , यह स्थैतिक विश्लेषण करता है, और शायद ही कभी, यह उस पर विफल होता है। साधारण व्यापार आवेदन में, शायद ही कभी ज्यादा के करीब हो जाता है कभी नहीं ।
तो यहाँ यह आता है, पहला लाभ:
लाभ 1: स्थैतिक विश्लेषण
साधारण कथनों और तर्क की जाँच में एक खामी है: इन्हें तब तक स्थगित किया जाता है जब तक कि कोड निष्पादित नहीं हो जाता। दूसरी ओर, कोड अनुबंध बहुत पहले के स्तर पर खुद को प्रकट करते हैं, या तो कोडिंग कदम पर या आवेदन को संकलित करते समय। पहले आप एक त्रुटि पकड़ते हैं, इसे ठीक करना उतना ही महंगा है।
लाभ 2: हमेशा की तरह अप टू डेट डॉक्यूमेंटेशन
कोड अनुबंध भी एक प्रकार का प्रलेखन प्रदान करते हैं जो हमेशा अद्यतित होता है। यदि विधि की XML टिप्पणी SetProductPrice(int newPrice)
बताती है कि newPrice
शून्य से बेहतर या बराबर होना चाहिए, तो आप उम्मीद कर सकते हैं कि दस्तावेज़ अद्यतित है, लेकिन आपको यह भी पता चल सकता है कि किसी ने विधि को बदल दिया है, जो कि newPrice = 0
फेंकता है ArgumentOutOfRangeException
, लेकिन कभी भी संबंधित दस्तावेज को नहीं बदला। कोड अनुबंधों और स्वयं कोड के बीच संबंध को देखते हुए, आपके पास आउट-ऑफ-सिंक प्रलेखन समस्या नहीं है।
कोड अनुबंधों द्वारा प्रदान किए गए दस्तावेज़ीकरण का प्रकार भी एक तरह से कीमती है, अक्सर, एक्सएमएल टिप्पणियां स्वीकार्य मूल्यों को अच्छी तरह से नहीं समझाती हैं। कितनी बार मैं सोच अगर था null
या string.Empty
या \r\n
एक विधि के लिए एक अधिकृत मूल्य है, और XML टिप्पणी है कि पर चुप थे!
अंत में, कोड अनुबंध के बिना, कोड के बहुत सारे टुकड़े इस तरह हैं:
मैं कुछ मूल्यों को स्वीकार करूंगा, लेकिन दूसरों को नहीं, लेकिन आपको प्रलेखन का अनुमान लगाना या पढ़ना होगा, यदि कोई हो। वास्तव में, प्रलेखन को न पढ़ें: यह पुराना है। बस सभी मूल्यों के माध्यम से लूप करें और आप उन लोगों को देखेंगे जो मुझे अपवाद बनाते हैं। आपको उन मानों की श्रेणी का भी अनुमान लगाना होगा, जिन्हें वापस लौटाया जा सकता है, क्योंकि भले ही मैं आपको उनके बारे में कुछ और बताऊं, यह सच नहीं हो सकता है, क्योंकि पिछले वर्षों के लिए मेरे द्वारा किए गए सैकड़ों बदलावों को देखते हुए।
कोड अनुबंधों के साथ, यह बन जाता है:
शीर्षक तर्क 0.500 की लंबाई के साथ एक गैर-शून्य स्ट्रिंग हो सकता है। पूर्णांक जो निम्न प्रकार है वह एक सकारात्मक मान है, जो केवल तब ही शून्य हो सकता है जब स्ट्रिंग खाली हो। अंत में, मैं एक IDefinition
वस्तु लौटाऊंगा, कभी अशक्त नहीं।
लाभ 3: इंटरफेस के अनुबंध
एक तीसरा लाभ यह है कि कोड अनुबंध इंटरफेस को सशक्त बनाता है। मान लीजिए कि आपके पास कुछ ऐसा है:
public interface ICommittable
{
public ICollection<AtomicChange> PendingChanges { get; }
public void CommitChanges();
...
}
केवल असेन्ट्स और अपवादों का उपयोग करके आप कैसे गारंटी लेंगे कि खाली न CommitChanges
होने पर ही कॉल किया जा सकता PendingChanges
है? आप कैसे गारंटी देंगे कि PendingChanges
कभी नहीं null
?
लाभ 4: एक विधि के परिणामों को लागू करें
अंत में, चौथा लाभ Contract.Ensure
परिणामों में सक्षम होना है । क्या होगा यदि, एक विधि लिखते समय जो पूर्णांक लौटाता है, मैं यह सुनिश्चित करना चाहता हूं कि मूल्य कभी भी हीन या शून्य के बराबर नहीं है? कई डेवलपर्स से बहुत सारे परिवर्तनों से पीड़ित होने के बाद, पांच साल बाद सहित? जैसे ही एक विधि में कई वापसी बिंदु होते हैं, उसके Assert
लिए एक रखरखाव दुःस्वप्न बन जाता है।
न केवल अपने कोड की शुद्धता के साधन के रूप में कोड अनुबंध पर विचार करें, बल्कि कोड लिखने के लिए एक सख्त तरीका है। इसी तरह, एक व्यक्ति जो विशेष रूप से गतिशील भाषाओं का उपयोग करता है, वह पूछ सकता है कि आप भाषा के स्तर पर प्रकार क्यों लागू करेंगे, जबकि जरूरत पड़ने पर आप एक ही काम कर सकते हैं। आप कर सकते हैं, लेकिन स्थैतिक टाइपिंग का उपयोग करना आसान है, कथनों की एक गुच्छा की तुलना में कम त्रुटि-प्रवण, और स्व-दस्तावेजीकरण।
डायनेमिक टाइपिंग और स्टैटिक टाइपिंग के बीच अंतर कॉन्ट्रैक्ट द्वारा साधारण प्रोग्रामिंग और प्रोग्रामिंग के बीच अंतर के बेहद करीब है।