OO Abstraction वर्ग स्तर डिजाइन के दौरान होता है, का उद्देश्य, कार्यान्वयन जटिलता की कैसे एक API/डिजाइन/प्रणाली द्वारा की पेशकश की सुविधाओं को लागू किया गया छुपा एक अर्थ में उपयोग करने के लिए 'इंटरफ़ेस' को सरल बनाने के साथ अंतर्निहित कार्यान्वयन।
इस प्रक्रिया को अबास्ट्रक्शन के तेजी से 'उच्च' स्तर (परतों) पर दोहराया जा सकता है, जो उच्च परतों पर कोड और समझ की जटिलता को बढ़ाए बिना बड़े सिस्टम को बनाने में सक्षम बनाता है।
उदाहरण के लिए, जावा डेवलपर FileInputStream की उच्च स्तरीय विशेषताओं का उपयोग कर सकता है, यह चिंता के बिना कि यह कैसे काम करता है (यानी फ़ाइल हैंडल, फ़ाइल सिस्टम सुरक्षा जांच, स्मृति आवंटन और बफरिंग आंतरिक रूप से प्रबंधित की जाएगी, और उपभोक्ताओं से छिपी हुई हैं)। यह FileInputStream
को कार्यान्वित करने की अनुमति देता है, और जब तक एपीआई (इंटरफ़ेस) FileInputStream
लगातार बना रहता है, पिछले संस्करणों के विरुद्ध बनाए गए कोड अभी भी काम करेंगे।
इसी तरह, जब आप अपनी कक्षाओं को डिजाइन करते हैं, तो आप जितना संभव हो सके दूसरों से आंतरिक कार्यान्वयन छिपाना चाहते हैं।
बूच परिभाषा, और विशेष रूप से चारों ओर , OO EncapsulationInformation Hiding के माध्यम से हासिल की है में आंतरिक डेटा छुपा (क्षेत्रों/सदस्यों राज्य का प्रतिनिधित्व), एक वर्ग उदाहरण के स्वामित्व वाले एक में आंतरिक डेटा तक पहुँच को लागू करके नियंत्रित तरीके से, और इन क्षेत्रों में प्रत्यक्ष, बाहरी परिवर्तन को रोकने, साथ ही कक्षा के किसी भी आंतरिक कार्यान्वयन विधियों को छिपाने के लिए (उदाहरण के लिए उन्हें निजी बनाकर)।
उदाहरण के लिए, एक कक्षाएं 'क्षेत्रों private
डिफ़ॉल्ट रूप से बनाया जा सकता है और वह भी तब इन के लिए बाहरी पहुँच आवश्यक था, एक get()
और/या set()
(या Property
) वर्ग से अवगत कराया जाएगा। (आधुनिक ओओ भाषाओं में, फ़ील्ड को readonly
/final
/immutable
के रूप में चिह्नित किया जा सकता है जो कक्षा के भीतर भी परिवर्तन को प्रतिबंधित करता है)।
उदाहरण जहां कोई सूचना नहीं छुपा लागू किया गया है (बुरा प्रैक्टिस):
class Foo {
// BAD - NOT Encapsulated - code external to the class can change this field directly
// Class Foo has no control over the range of values which could be set.
public int notEncapsulated;
}
उदाहरण जहां क्षेत्र कैप्सूलीकरण लागू किया गया है:
class Bar {
// Improvement - access restricted only to this class
private int encapsulated;
// The state of Bar (and its fields) can now be changed in a controlled manner
public void setEncapsulatedField(int newValue) {
if (newValue < 100) {
encapsulated = newValue;
}
// else throw ... out of range
}
}
अपरिवर्तनीय/constructor- का उदाहरण केवल फ़ील्ड का प्रारंभिकरण:
class Baz {
private final int onlyValue;
public void Baz(int immutableValue) {
// ... can check that immutableValue is valid
onlyValue = immutableValue;
}
// Further change of `onlyValue` outside of the constructor is NOT permitted
// even within the same class
}
पुन: अमूर्त बनाम सार कक्षा
Abstract classes वर्ग है जो वर्गों के बीच समानता का पुन: उपयोग को बढ़ावा देने के कर रहे हैं, लेकिन जो खुद सीधे new()
साथ instantiated नहीं किया जा सकता - सार कक्षाएं subclassed जाना चाहिए, और केवल concrete
(गैर सार) subclasses तत्काल हो सकता है। संभावित रूप से Abstraction
और abstract class
के बीच भ्रम का एक स्रोत यह था कि ओओ के शुरुआती दिनों में, विरासत को कोड पुन: उपयोग करने के लिए अधिक उपयोग किया जाता था (उदा। संबंधित सार आधार वर्गों के साथ)।Encapsulation बनाम सूचना
अभी हाल ही में encapsulation
है छिपाना: आजकल, composition is generally favoured over inheritance, और वहाँ इस तरह के इंटरफेस के माध्यम से रूप में और अधिक उपकरण अमूर्त प्राप्त करने के लिए उपलब्ध है,, घटनाओं/प्रतिनिधियों/काम करता है, लक्षण/mixins आदि
पुन हैं आमतौर पर एक वर्ग में bundle
पर कौन सी विधियों, फ़ील्ड, गुणों, घटनाओं आदि को निर्धारित करते समय अधिक सामान्य अर्थ में उपयोग किया जाता है।
विकिपीडिया का हवाला देते हुए:
एक वस्तु उन्मुख प्रोग्रामिंग भाषा के अधिक ठोस की स्थापना में, धारणा या तो एक जानकारी छुपा तंत्र, एक बंडलिंग तंत्र, या दोनों के संयोजन मतलब करने के लिए प्रयोग किया जाता है।
उदाहरण के लिए, बयान में "मैं अपने ही वर्ग में डेटा एक्सेस कोड समझाया गया है", कैप्सूलीकरण की व्याख्या मोटे तौर पर Separation of Concerns प्रिंसिपल (ठोस में एस) के बराबर है, और तर्कसंगत रूप से refactoring के पर्याय के रूप में इस्तेमाल किया जा सकता है।
[1] एक बार जब आप बूच के encapsulation cat picture तुम कभी नहीं कैप्सूलीकरण भूल कर सकेंगे देखा है - ऑब्जेक्ट ओरिएंटेड विश्लेषण और अनुप्रयोगों के साथ डिजाइन के P46, 2 एड
तो जावा एपीआई जिसका उपयोग हम करते हैं वह एक अमूर्त है? – sras
हां, एक उच्च स्तर पर, एक एपीआई उपभोक्ता के उपयोग के लिए एक सरल अमूर्त प्रदान करता है, जो अपने आंतरिक डिजाइन के पीछे अंतर्निहित जटिलता से अनजान है। जावा स्पष्ट रूप से एक भाषा है, कई संबंधित उच्च स्तरीय ढांचे के साथ। हालांकि, मैं अधिक विशेष रूप से विश्वास करता हूं कि ओओ डिज़ाइन [प्रिंसिपल टर्मिनोलॉजी] (https://en.wikipedia.org/wiki/Object-oriented_design) का निर्माण किया गया था, कि अवशोषण अधिक विशेष रूप से कक्षा स्तर के डिजाइन और अपघटन का जिक्र कर रहा था , ढांचे या उद्यम स्तर डिजाइन का जिक्र करने के बजाय। – StuartLC