Of अमूर्त की परत ’और ind परोक्ष के स्तर’ में क्या अंतर है?


38

मुझे यकीन नहीं है कि अगर दोनों शब्दों का परस्पर उपयोग किया जा सकता है। शायद कंप्यूटर विज्ञान में कुछ शैक्षणिक अंतर है जो दिन-प्रतिदिन की प्रोग्रामिंग के लिए प्रासंगिक नहीं है? या क्या मैं गलत तरीके से गलत हुए बिना दोनों शब्द का इस्तेमाल कर सकता हूं? शायद यह उस संदर्भ पर निर्भर करता है जिसमें मैं दोनों शब्दों का उपयोग करता हूं?

संपादित करें: इस कारण से कि मुझे दोनों शब्द मिल रहे हैं संभवतया विनिमेय है एब्सट्रैक्शन परत के बारे में विकिपीडिया प्रविष्टि । वहाँ आप डेविड व्हीलर का उद्धरण पा सकते हैं 'कंप्यूटर विज्ञान की सभी समस्याओं को एक अन्य स्तर के अप्रत्यक्ष रूप से हल किया जा सकता है।'


7
... परोक्ष के कई स्तरों की समस्या को छोड़कर!
मेसन व्हीलर

@ मेसनवैलर: आप अप्रत्यक्ष रूप से एक और, कम अप्रत्यक्ष स्तर जोड़ सकते हैं ...
जॉन पूर्डी

C ++ आपको अप्रत्यक्ष की एक परत के बिना अमूर्त की एक परत जोड़ने की अनुमति देता है, इसलिए उनका मतलब समान नहीं हो सकता है।
fredoverflow

जवाबों:


30

अमूर्तता सरलीकरण से संबंधित है, अप्रत्यक्ष स्थान से संबंधित है।

  • मतिहीनताएक ऐसा तंत्र है जो किसी वस्तु के जटिल विवरण को सरलता से, शब्दों को हेरफेर करने के लिए आसान बनाता है। प्रोग्रामिंग में, एक अच्छा उदाहरण मशीन कोड और एप्लिकेशन बनाने के लिए विभिन्न उपकरणों के बीच विवरण में अंतर है जो अंततः मशीन कोड पर आधारित होते हैं। विजुअल स्टूडियो आईडीई के साथ एक विंडोज फॉर्म एप्लिकेशन बनाने पर विचार करें। आईडीई आपको व्हाट्स-यू-सी-इस-यू-व्हाट-यू-गेट तरीके में आसान-से-हेरफेर आइटम के मामले में आवेदन के बारे में सोचने देता है। एक स्क्रीन विजेट की स्थिति एक फ्रेम में एक दृश्य स्थान के लिए बाहर सार है जिसे आप विजेट को चारों ओर खींचकर बदल सकते हैं। आंतरिक रूप से, IDE एक उच्च स्तरीय भाषा (जैसे C #) के रूप में अमूर्त की एक और परत का उपयोग करके विजेट को हेरफेर करता है। C # को मशीन कोड का उपयोग करके हेरफेर नहीं किया जाता है, यह "सामान्य रनटाइम पर्यावरण" का उपयोग करके हेरफेर किया जाता है

  • अप्रत्यक्षता से तात्पर्य किसी वस्तु के स्थान को पारदर्शी बनाने से है। यदि आप किसी वेब संसाधन के URI को जानते हैं, तो आप इसके सटीक स्थान को जाने बिना संसाधन तक पहुँच सकते हैं। आप सीधे संसाधन का उपयोग नहीं करते हैं, इसके बजाय आप एक चैनल के माध्यम से पहुंचते हैं जो आपके अनुरोध को सर्वर, एप्लिकेशन और राउटर की एक श्रृंखला से गुजरता है। अप्रत्यक्ष रूप से एक विशेष प्रकार का अमूर्त माना जा सकता है जहां स्थान का सार होता है।


2
+1 श्रेष्ठ उत्तर अभी तक! एक लिखने के बारे में था, लेकिन यह एक काफी करीब है जो मेरे मन में था।
न्यूटोपियन

27

अप्रत्यक्ष उपयोग से सार लागू होते हैं।

उदाहरण के लिए, वर्चुअल मेमोरी: एब्स्ट्रक्शन पूरी तरह से आपके निपटान में एक सन्निहित पता स्थान है। यह अमूर्त एक पृष्ठ तालिका के माध्यम से अप्रत्यक्ष रूप से उपयोग किया जाता है। भौतिक मेमोरी पते पर सीधे पहुंचने के बजाय, उन्हें वर्चुअल पते से भौतिक पते पर अनुवादित किया जाता है।

अमूर्तता की एक परत जोड़ने के लिए, आपको अप्रत्यक्ष की एक परत को जोड़ना होगा। लेकिन अप्रत्यक्ष रूप से जोड़ना जरूरी नहीं कि आप एक अमूर्तता दें। उदाहरण के लिए, हर एक चर पर गेटर्स और सेटर होना अप्रत्यक्ष की एक परत है, लेकिन यदि वे सभी करते हैं और सरल मान सेट करते हैं तो कोई अमूर्तता नहीं है।


2
वास्तव में, अंतिम उदाहरण बहुत अच्छा नहीं है। प्लेन गेटर्स और सेटर एब्सट्रैक्ट को जोड़ते हैं। केवल जानने वाले, वे सादे हैं, वर्ग उन्हें घोषित कर रहा है। यदि आप कार्यान्वयन को बदलने का निर्णय लेते हैं, तो अमूर्तता के खिलाफ बनाया गया कोई भी कोड प्रभावित नहीं होता है।
back2dos

क्या आप कोई बेहतर उदाहरण दे सकते हैं जो अप्रत्यक्ष हो लेकिन अमूर्त नहीं?
मिस्टर कोडर

1
निश्चित रूप से एक गलत उदाहरण
Morg।

3
वर्गों के बारे में कुछ भी किसने कहा? मैंने एक चर की दृश्यता को बदलने के बारे में भी कुछ नहीं कहा। कुछ भी आपको सीधे इसे एक्सेस करने से नहीं रोक रहा है; यह एक परिवर्तनशील है। लेकिन आप इसे गेटर और सेटर के माध्यम से अप्रत्यक्ष स्तर के साथ भी कर सकते हैं। चूंकि गेट्टर और सेटर का उपयोग करने के शब्दार्थ सीधे चर तक पहुंचने के समान हैं, इसलिए कोई अमूर्तता नहीं है।
ऑस्टिन

2
सिवाय इसके कि गेट्टर और सेटर जरूरी नहीं कि 'सिर्फ' वेरिएबल तक पहुंचें। यदि आप एक गेटर और सेटर का उपयोग कर रहे हैं, तो आप एक अमूर्त जोड़ रहे हैं क्योंकि आप उन्हें उपयोगकर्ता के बिना एक अलग चर का उपयोग करने के लिए बदल सकते हैं, इसलिए यह एक अमूर्त है।
डोमिनिक मैकडोनेल

9

सबसे पहले, शर्तों के लिए उचित परिभाषा आज़माते हैं:

  1. अमूर्तता की परत का मतलब है:

     a) there is large number of positions which use abstraction
          (layer = all the positions together)
     b) each position is hiding some complex stuff, but allows invoking it 
          using only simple code. 
         (abstraction == one-to-one mapping between simple code and complex code)
    
  2. दूसरी ओर अप्रत्यक्ष स्तर का मतलब है:

      a) you're counting levels
      b) indirection==there are several steps before you can reach or access the data
      c) level of indirection is just how many steps it takes to access the data
    

जब तक आप उपयोग करते हैं, तब तक इन दोनों चीजों का एक ही मतलब हो सकता है:

  a) step = going from simple code to complex code. 

7

मेरी समझ यह है कि अमूर्तता ज्यादातर कार्यों को संदर्भित करती है और अप्रत्यक्ष रूप से ज्यादातर डेटा को संदर्भित करती है। दूसरे शब्दों में, अमूर्तता का स्तर आपके स्टैक ट्रेस को कितना गहरा मिलता है, और अप्रत्यक्षता का स्तर यह है कि आपको कितने बिंदुओं को रोकना है। कम से कम यह है कि मैं शर्तों का उपयोग कैसे करूं।


वर्चुअल फ़ंक्शंस के लिए पॉइंटर्स के रूप में मॉडलिंग की जा रही है?
केलथ

7

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

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

अमूर्तता की एक परत अमूर्तता का एकत्रीकरण है और उन्हें एक वैचारिक अखंडता और उपयोग की निरंतरता दे रही है। CreateProcess कोड के एक समूह के लिए win32 एपीआई नाम है जो एक प्रक्रिया बनाता और निष्पादित करता है। "नाम" इस संदर्भ में महत्वपूर्ण है क्योंकि अगर हम फ़ंक्शन को DoAllocMemThenMakeEnvThenFindEntryPoint जैसे कुछ कहते हैं ... तो यह वास्तव में बहुत सार नहीं होगा। Win32 API जैसी एक परत एक अवरोध प्रदान करती है जिसके लिए एक प्रोग्रामर को सलाह दी जा सकती है कि वह उद्यम न करे। यह कम शक्ति (लचीलापन, प्रदर्शन आदि) की कीमत पर कॉलर के दृष्टिकोण से जटिलता को दूर करता है। लीक से हटकर सार के बार-बार चर्चा से इस व्यापार को उजागर किया जाता है: हमें अभी भी हाइबरनेट का उपयोग करते समय प्रत्यक्ष SQL कॉल करने की आवश्यकता हो सकती है। .NET का उपयोग करते समय Win32 कॉल करें।

अप्रत्यक्ष के संबंध में, अधिकांश गैर-तुच्छ कार्यक्रम उपयोगकर्ता के किसी न किसी रूप में कोडित अप्रत्यक्ष रूप से संचालित होते हैं, जो कि COBOL के INPUT-OUTPUT सेक्शन में सन्दूक से पहले दिखाई देते हैं। जब एक डेटाबेस जैसे संसाधन का उपयोग करते हुए हम कोड 0 में एक JDBC कनेक्शन स्ट्रिंग के एम्बेडिंग को लेवल 1 के रूप में देख सकते हैं, एक JNDI कनेक्शन (जो एक एप्लीकेशन कंटेनर के लिए संसाधन की पसंद को दर्शाता है) Level 1 और कुछ स्प्रिंग के रूप में मैप करता है; आवेदन जेएनडीआई पहचानकर्ता कई स्तरों के रूप में कई कंटेनर संसाधनों में से एक है। कई स्तर उस संबंध को हेरफेर करने के लिए संबंध (इस मामले में कोड निष्पादित करने और डेटाबेस के बीच एक संबंध) के लिए कई दलों को बाहरी अनुमति देते हैं। यह आंतरिक प्रोग्राम घटकों जैसे इंटरफेस और घटनाओं पर समान रूप से लागू होता है।

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


1

एक पॉइंटर को पॉइंटर से पॉइंटर को पॉइंटर से पॉइंटर करने के लिए एक पॉइंटर को पॉइंटर में छह अप्रत्यक्ष स्तर होते हैं, लेकिन एब्सट्रैक्शन की कोई भी परतें नहीं।


0

अमूर्त का एक अच्छा उदाहरण एक डेटाबेस में एक आइटम को स्टोर करने के लिए एक एकल विधि कह रहा है। विधि डेटाबेस को जोड़ने और कॉल करने के विवरण को सार करती है। जहां अप्रत्यक्ष का एक उदाहरण इंटरट्रेट्स तक पहुंचने के लिए एक संरचना का उपयोग कर रहा है। जब आप संरचना में मान सेट करते हैं तब भी आप रुकावट का सामना कर रहे होते हैं। यह स्मृति में विशिष्ट बिंदुओं को संरचनात्मक सदस्य नाम देकर केवल अप्रत्यक्ष रूप से संरचना के माध्यम से है।

इसलिए अमूर्त कार्यान्वयन के विवरण को छुपाता है जहां अप्रत्यक्ष रूप से एक "अप्रत्यक्ष" इंटरफ़ेस प्रदान करता है जिसके माध्यम से कुछ का उपयोग करना है।

अमूर्तता तब है जब आपको यह समझने की आवश्यकता नहीं है कि क्या छिपाया जा रहा है, जहां अप्रत्यक्ष रूप से आप करते हैं।


-1

अमूर्त के स्तर (या परत) को जोड़ना और अप्रत्यक्ष के स्तर को जोड़ना एक ही बात कहने के दो तरीके हैं। जब आप किसी समस्या को हल करते हैं, तो आप आमतौर पर एक प्रत्यक्ष समाधान की कोशिश करते हैं। कभी-कभी यह संभव नहीं होता है, इसलिए आप एक अप्रत्यक्ष समाधान की कोशिश करते हैं। इसके लिए समस्या को सरल बनाने के लिए कुछ अमूर्तता की शुरुआत करनी होगी - क्योंकि यह समस्या जटिल है इसलिए इसे सीधे हल नहीं किया जा सकता है। अप्रत्यक्ष दृष्टिकोण द्वारा समस्या को हल करने के बाद, समस्या को फिर से हल करने पर विचार नहीं करने का कोई कारण नहीं है, लेकिन आमतौर पर अधिक; इसमें अमूर्तता का एक और, उच्च स्तर का परिचय शामिल होगा। और यह नया, अधिक सामान्य समाधान मूल अप्रत्यक्ष समाधान की तुलना में और भी अधिक अप्रत्यक्ष है - अर्थात ताकि अप्रत्यक्ष के एक और स्तर को पेश किया गया हो।


3
इससे पहले किए गए 7 अंकों से अधिक कुछ भी नहीं लगता है और 7 उत्तर में बताया गया है
gnat

धन्यवाद, Gnat। मैं आपकी बात लेता हूं, और इसकी दया की यह दिलचस्प सवाल बहुत सारे स्पैम को आकर्षित करता है!
क्रिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.