अपरिवर्तनीय की धारणा दृढ़ता से 'साइड इफेक्ट्स' से जुड़ी हुई है। मेरा मानना है कि यह सॉफ्टवेयर डिजाइन के लिए बर्ट्रेंड मेयर के 'डिजाइन बाय कॉन्ट्रैक्ट (डीबीसी)' दृष्टिकोण द्वारा प्रचारित किया गया था।
DbC सार डेटा प्रकार (कक्षाओं की रीढ़) को 3 महत्वपूर्ण धारणाओं, पूर्व शर्त, पोस्टकॉन्डिशन, इनवॉइस के साथ समृद्ध करता है । प्रक्रियाओं का संदर्भ देते समय यह आसानी से बताया गया है, इसलिए मैं इसके संदर्भ में समझाने की कोशिश करूंगा:
एक पूर्व शर्त उस प्रक्रिया को कॉल करने के लिए एक प्रक्रिया के लिए शर्त इनपुट डेटा का प्रतिनिधित्व करती है। इस पूर्व शर्त का सम्मान किया जाना चाहिए और उस विशेष प्रक्रिया के ग्राहक द्वारा लागू किया जाना चाहिए। हालाँकि प्रक्रिया डिज़ाइनर उन ग्राहकों से बचाव कर सकता है जो प्रक्रिया में पहली पंक्तियों के रूप में उस स्थिति का आश्वासन देकर पूर्व शर्त का सम्मान नहीं करते हैं। उदाहरण के लिए एक विधि double divide(double dividend, double divisor)
एक पूर्व शर्त हो सकती है divisor != 0
।
एक पोस्टकंडिशन प्रक्रिया रिटर्न के बाद आउटपुट डेटा पर एक स्थिति का प्रतिनिधित्व करता है; यह पूरी तरह से प्रक्रिया डिज़ाइनर का काम है इस सम्मान का सम्मान करने के लिए कि पूर्व शर्त का सम्मान किया गया था; लौटने से पहले एक रक्षा प्रोग्रामिंग शैली में, पोस्टकंडिशन मुखर किया जा सकता है।
एक अपरिवर्तनीयता को एक पूर्व शर्त और उत्तर-पूर्व दोनों के रूप में माना जा सकता है, लेकिन उपर्युक्त अवधारणाओं से पूर्वनिर्धारण और पोस्टकंडिशन के लिए अलग-अलग समझ के साथ। मूल रूप से एक अपरिवर्तनीय व्यक्ति का कहना है कि यदि प्रक्रिया को कॉल करने से पहले इनपुट की एक विशेष स्थिति है, तो प्रक्रिया को कॉल करने के बाद वह विशेष स्थिति मान्य है। उदाहरण के लिए एक प्रक्रिया के लिए एक वैध अपरिवर्तनीय boolean search(int term, int array[])
व्यक्ति कह सकता है कि array
कॉल से पहले की स्थिति वैसी ही है जैसी कि कॉल के बाद है।
प्रक्रियाओं पर हमलावरों को लागू करना (और न केवल प्रक्रियाएं) एक बड़ी बात है क्योंकि यह दुष्प्रभाव को कम करता है ; यह उपयोगी है क्योंकि साइड इफेक्ट प्रोग्रामिंग में एक बड़ी बुराई है। एक विशेष प्रक्रिया इनपुट तर्कों की स्थिति को बदल सकती है, या कुछ वैश्विक चर की स्थिति को बदल सकती है, या कुछ वैश्विक चर पर निर्भर कर सकती है; इससे ऐसी खराब स्थितियां पैदा हो सकती हैं जहां एक ही प्रक्रिया (एक ही इनपुट के साथ) पर दो समान कॉल अलग-अलग आउटपुट दे सकते हैं। यह कॉल के इतिहास को जानने के लिए प्रेरित करता है और विशेष रूप से एक बहुआयामी संदर्भ में डीबग करना बहुत कठिन है।