दोनों वर्तमान उत्तर केवल आंशिक रूप से निशान को हिट करने के लिए प्रतीत होते हैं, और वे उन उदाहरणों पर ध्यान केंद्रित करते हैं जो मुख्य विचार को बादलते हैं। यह भी (पूरी तरह से) एक ओओपी सिद्धांत नहीं है, लेकिन सामान्य रूप से एक सॉफ्टवेयर डिजाइन सिद्धांत है।
इस वाक्यांश में "भिन्न" होने वाली बात कोड है। क्रिस्टोफ़ यह कहने में है कि यह आमतौर पर कुछ ऐसा है जो भिन्न हो सकता है, क्या आप अक्सर यह अनुमान लगाते हैं । लक्ष्य अपने आप को कोड में भविष्य के परिवर्तनों से बचाने के लिए है। यह एक इंटरफेस के खिलाफ प्रोग्रामिंग से निकटता से संबंधित है । हालांकि, क्रिस्टोफ़ को "कार्यान्वयन विवरण" तक सीमित करना गलत है। वास्तव में, इस सलाह का मूल्य अक्सर आवश्यकताओं में बदलाव के कारण होता है ।
यह केवल अप्रत्यक्ष रूप से एनकैप्सुलेटिंग स्टेट से संबंधित है, जो मुझे लगता है कि डेविड अर्नो के बारे में सोच रहा है। यह सलाह हमेशा (लेकिन अक्सर नहीं) राज्य को घेरने का सुझाव देती है, और यह सलाह अपरिवर्तनीय वस्तुओं पर भी लागू होती है। वास्तव में, केवल नामांकित स्थिरांक एक (बहुत बुनियादी) रूप है जो अलग-अलग होता है।
CandiedOrange स्पष्ट रूप से "क्या" के साथ "विवरण" बदलता है। यह केवल आंशिक रूप से सही है। मैं मानता हूं कि जो भी कोड होता है, वह कुछ अर्थों में "विवरण" होता है, लेकिन एक "विवरण" भिन्न नहीं हो सकता (जब तक कि आप इस विवरण को बनाने के लिए "विवरण" को परिभाषित नहीं करते)। गैर-अलग-अलग विवरणों को संलग्न करने के कारण हो सकते हैं, लेकिन यह तानाशाही एक नहीं है। मोटे तौर पर, यदि आप अत्यधिक आश्वस्त थे कि "डॉग", "कैट", और "डक" एकमात्र प्रकार होंगे जिनसे आपको कभी भी निपटना होगा, तो यह डिक्टम रिफ्लेक्टिंग कैंडिडऑरेंज का सुझाव नहीं देता है।
एक अन्य संदर्भ में CandiedOrange का उदाहरण कास्टिंग करें, मान लें कि हमारे पास सी जैसी प्रक्रियात्मक भाषा है। यदि मेरे पास कुछ कोड हैं:
if (pet.type() == dog) {
pet.bark();
} else if (pet.type() == cat) {
pet.meow();
} else if (pet.type() == duck) {
pet.quack()
}
मैं यथोचित उम्मीद कर सकता हूं कि भविष्य में कोड का यह टुकड़ा बदल जाएगा। मैं एक नई प्रक्रिया को परिभाषित करके इसे "एनकैप्सुलेट" कर सकता हूं:
void speak(pet) {
if (pet.type() == dog) {
pet.bark();
} else if (pet.type() == cat) {
pet.meow();
} else if (pet.type() == duck) {
pet.quack()
}
}
और कोड के ब्लॉक के बजाय इस नई प्रक्रिया का उपयोग करना (यानी "एक्स्ट्रेक्ट मेथड" रिफैक्टिंग)। इस बिंदु पर एक "गाय" प्रकार या जो भी केवल speak
प्रक्रिया को अद्यतन करने की आवश्यकता है । बेशक, एक OO भाषा में आप इसके बजाय कैंडिडऑरेन्ज के उत्तर के रूप में गतिशील प्रेषण का लाभ उठा सकते हैं। यह स्वाभाविक रूप से होगा यदि आप pet
एक इंटरफ़ेस के माध्यम से एक्सेस करते हैं । गतिशील प्रेषण के माध्यम से सशर्त तर्क को खत्म करना एक ऑर्थोगोनल चिंता है जो इस बात का हिस्सा था कि मैंने इस प्रक्रियात्मक प्रतिपादन को क्यों बनाया। मैं इस बात पर भी जोर देना चाहता हूं कि इसमें ओओपी के लिए विशेष रूप से सुविधाओं की आवश्यकता नहीं है। यहां तक कि एक OO भाषा में, जो अलग-अलग होता है, उसका मतलब यह नहीं होता है कि नए वर्ग या इंटरफ़ेस को बनाने की आवश्यकता है।
अधिक कट्टरपंथी उदाहरण के रूप में (जो कि काफी ओओ के करीब है), कहते हैं कि हम एक सूची से डुप्लिकेट को निकालना चाहते हैं। मान लें कि हमने सूची में अब तक देखी गई वस्तुओं पर नज़र रखते हुए इसे लागू कर दिया है और जो सूची में हमने देखा है उसे हटा दिया है। यह मानना उचित है कि हम चाहते हैं कि हम कम से कम, प्रदर्शन कारणों से देखी गई वस्तुओं पर नज़र कैसे रखें। जो भिन्न होता है, उसे एनकैप्सुलेट करने का ताना-बाना बताता है कि हमें देखा वस्तुओं के सेट का प्रतिनिधित्व करने के लिए एक अमूर्त डेटा प्रकार का निर्माण करना चाहिए। हमारा एल्गोरिथ्म अब इस अमूर्त सेट डेटा प्रकार के खिलाफ परिभाषित किया गया है, और अगर हम एक द्विआधारी खोज ट्री पर स्विच करने का निर्णय लेते हैं, तो हमारे एल्गोरिथ्म को बदलने या देखभाल करने की आवश्यकता नहीं है। OO भाषा में, हम इस अमूर्त डेटा प्रकार को पकड़ने के लिए एक वर्ग या इंटरफ़ेस का उपयोग कर सकते हैं। SML / O 'जैसी भाषा में
आवश्यकताओं से प्रेरित उदाहरण के लिए, मान लें कि आपको कुछ व्यावसायिक तर्क के संबंध में कुछ क्षेत्र को मान्य करने की आवश्यकता है। जबकि आपके पास अब विशिष्ट आवश्यकताएं हो सकती हैं, आपको दृढ़ता से संदेह है कि वे विकसित होंगे। आप वर्तमान तर्क को इसकी प्रक्रिया / कार्य / नियम / वर्ग में शामिल कर सकते हैं।
हालांकि यह एक ऑर्थोगोनल चिंता है जो "अलग-अलग क्या होता है" का हिस्सा नहीं है, यह अक्सर अमूर्त करने के लिए स्वाभाविक है, जो कि, अब एनकैप्सुलेटेड लॉजिक द्वारा संचालित होता है। यह आम तौर पर अधिक लचीले कोड की ओर जाता है और अतिक्रमित लॉजिक को संशोधित करने के बजाय वैकल्पिक कार्यान्वयन में प्रतिस्थापित करके तर्क को बदलने की अनुमति देता है।