2013-08-09 6 views
8

मैं Stroustrup की 'सी ++ प्रोग्रामिंग भाषा "पढ़ रहा है और वह" कपोल-कल्पना "एक बहुत का उल्लेख है:"abstractions" क्या हैं?

सबसे, लचीला, कुशल और उपयोगी कपोल-कल्पना से कई प्रकार के (वर्ग) के parameterization शामिल और एल्गोरिदम अन्य प्रकार के (कार्यों) और एल्गोरिदम

और

सी ++ के विकास और सुरुचिपूर्ण और कुशल कपोल-कल्पना का उपयोग कर के लिए एक भाषा है।

क्या यह सी ++ में अमूर्त कक्षाओं से संबंधित किसी भी तरह से है? या बहुरूपता, विरासत, या टेम्पलेट का उपयोग करने के साथ?

क्या कोई उदाहरण दे सकता है?

+2

कल्पना कीजिए कि यह कार्य पूरा करने के लिए बहुत अधिक काम करता है। अब कल्पना करें कि यह करने के लिए उनका एक आसान काम था। वोला, एक अमूर्तता। – chris

+1

बीस्ट्रॉस्ट्रप (http://www.stroustrup.com/glossary.html) - * अमूर्त - सामान्य इंटरफ़ेस छुपा कार्यान्वयन विवरण निर्दिष्ट करने का कार्य। कक्षाएं, सार वर्ग, और टेम्पलेट्स सी ++ में प्राथमिक अमूर्त तंत्र हैं। यह भी देखें: encapsulation। * – SChepurin

+2

कृपया इस प्रश्न को दोबारा खोलें, [इसका उचित उत्तर है] (http://www.boost.org/community/generic_programming.html#concept) – TemplateRex

उत्तर

15

अमूर्त (n) - घटनाओं

बजाय विचारों के साथ काम की गुणवत्ता

— स्रोत: Oxford English Dictionary

Stroustrup सार वर्ग या में अन्य विशिष्ट विचारों की बात नहीं कर रहा है प्रोग्रामिंग। इसके बजाय, वह शब्द अबास्ट्रक्शन का जिक्र कर रहा है।

अवशोषण मानसिक सहायक हैं। वे हमें प्रत्यक्ष आवेदन के बजाय "सिद्धांत" में सोचने में मदद करते हैं। गणित अमूर्तता की कला है। प्रोग्रामिंग लागू abstractions की कला है।

अमूर्त हमें चीजों के बारे में सोचने में मदद करने के लिए, पदानुक्रमों जैसे मानसिक मॉडल बनाने में हमारी सहायता करते हैं। अमूर्तता के कारण बहुरूपता संभव है। आइए एक उदाहरण देखें।

उदाहरण

1st level

मैं एक ओलेक्सी Dobrodum है। मैं इसे ओलेक्सिया डोब्रोडम के रूप में संदर्भित करता हूं, मैं इसे ओलेक्सिया डोब्रोडम की तरह मानता हूं, यह सब कभी ओलेक्सिया डोब्रोडम होगा। ओलेक्सिया डोब्रोडम के लिए जो कुछ भी मैं करता हूं वह विशेष रूप से इसके लिए होता है। अब हम अमूर्तता के पहले स्तर पर हैं, या सबसे विशिष्ट हम इस ओलेक्सिया डोब्रोडम के साथ काम करते समय कभी भी होंगे।

हाल ही में मैंने ज़च लट्टा हासिल किया, इसलिए अब मेरे पास ओलेक्सिया डोब्रोडम और जच लट्टा दोनों हैं।

More 1st level

मैं एक ओलेक्सी Dobrodum के रूप में तो और एक ज़ैक Latta के रूप में व्यक्तिगत रूप से उन दोनों की जानकारी दे सकती है, लेकिन है कि जल्दी से अनावश्यक बढ़ने और साबित लचीला नहीं होगा। इसके बजाए, हम केवल ओलेक्सिया डोब्रोडम और जच लट्टा को एक साथ समूहित कर सकते हैं और उन्हें मानव कहते हैं। अब हम अमूर्त स्तर 2 प्राप्त कर चुके हैं 2. व्यक्तिगत रूप से प्रत्येक व्यक्ति से निपटने के बजाय, हम उन्हें मानव के रूप में संदर्भित कर सकते हैं। ऐसा करने से, हमने "कार्यान्वयन", या प्रत्येक व्यक्ति के विशिष्ट विवरणों को समझाया है और विचारों पर ध्यान केंद्रित करना शुरू कर दिया है, इसलिए अब हम सार में सोच रहे हैं।

More 2nd level

बेशक

हम कर सकते हैं सार यह आगे है, लेकिन उम्मीद है कि आपको कपोल-कल्पना के पीछे विचार प्राप्त करने के लिए शुरू कर रहे हैं। इससे मुख्य अधिग्रहण यह है कि एक अमूर्त विवरण (या कार्यान्वयन) छुपाता है। हमारे मानव अबास्ट्रक्शन में ब्योरा छिपाकर, हम खुद को सामान्यताओं में बात करने की अनुमति देते हैं। हम संक्षेप में बात करेंगे कि यह अगले खंड में प्रोग्रामिंग में कैसे लागू होता है।

लागू करने चीजें

अब जब कि हम क्या एक अमूर्त है, चलो इसे लागू करते हैं पर संक्षेप में छुआ है। अमूर्तता के कारण बहुरूपता संभव है। पिछले उदाहरण के मॉडल के बाद, कहते हैं कि हम निम्नलिखित दो वर्गों है:

class OleksiyDobrodum 
    name = "Oleksiy Dobrodum" 
    smarts = :mega-smart 
    mood = :happy 
    favorite_candy = :chocolate 
end 

class ZachLatta 
    name = "Zach Latta" 
    smarts = :so-so 
    mood = :indifferent 
    hair_color = :brown 
end 

अगर मैं ZachLatta का एक उदाहरण मैं विशेष रूप से यह का उल्लेख करना चाहिए के साथ बातचीत करना चाहते हैं। OleksiyDobrodum उदाहरणों के लिए भी यही है।

zach = new ZachLatta 
print zach.name 

oleksiy = new OleksiyDobrodum 
print oleksiy.favorite_candy 

अगर मैं Human कहा जाता है एक अमूर्त वर्ग बना सकते हैं और, यह से दोनों OleksiyDobrodum और ZachLatta इनहेरिट है तो मैं कर सकते हैं सार दूर कार्यान्वयन दोनों वर्गों की और बस Human रूप में उनमें से दोनों मामलों को देखें।

class Human 
    name 
    smarts 
    mood 
end 

class OleksiyDobrodum < Human 
    name = "Oleksiy Dobrodum" 
    smarts = :mega-smart 
    mood = :happy 
    favorite_candy = :chocolate 
end 

class ZachLatta < Human 
    name = "Zach Latta" 
    smarts = :so-so 
    mood = :indifferent 
    hair_color = :brown 
end 

हमारे वर्ग रेखाचित्र अब ऐसा दिखाई देता है:

Class diagram for code above

मैं हमेशा के कार्यान्वयन के बारे में पर घूमना सकता है, लेकिन हमारे में महत्वपूर्ण परिणाम पर चलते हैं।

में महत्वपूर्ण परिणाम

  • कपोल-कल्पना कर रहे हैं विचारों, नहीं विशिष्ट घटनाओं
  • सार कुछ करने के लिए इसके कार्यान्वयन से दूर ले जाने और बड़े विचारों
  • कपोल-कल्पना कोड व्यवस्थित करने के लिए इस्तेमाल किया जा सकता के बारे में सोचना है (और कई अन्य चीजें) प्रभावी ढंग से
  • ऑब्जेक्ट उन्मुख प्रोग्रामिंग पूरी तरह से अवशोषण पर निर्भर है। उपर्युक्त बुलेट बिंदु देखें।
+0

क्या आप कृपया एक उदाहरण दे सकते हैं? – Oleksiy

+1

@ ज़च लट्टा: मैं सहमत हूं और आपके उत्तर को उखाड़ फेंक दिया है, लेकिन अमूर्त मानसिक मददगार और मानसिक मॉडल से अधिक हैं। वे वास्तविक कोड व्यवस्थित करते हैं। – Frodo

+1

@ फ्रोडो * कुछ * abstractions कोड व्यवस्थित करने में मदद कर सकते हैं। – juanchopanza

1

हां यह सी ++ में अमूर्त कक्षाओं से संबंधित है और यह उस संदर्भ तक सीमित नहीं है, उन्होंने एक सामान्य तरीके से समझाया कि सी ++ में अमूर्तता का पूर्ण समर्थन है।

उदाहरण के लिए: सी ++ में, हम वर्ग प्रकार का उपयोग कर सकते हैं या समारोह दोनों समारोह अन्य प्रकार में कहता है, उदाहरण के लिए एक समारोह कॉल एक वर्ग प्रकार/एक पैरामीटर के रूप कार्य हो सकता है, और एक वर्ग के एक फार्म के लिए संदर्भित करता है अमूर्त- (यहां अमूर्तता कार्य की परिभाषा को छिपाने या उपयोगकर्ता से कक्षा को छिपाने के लिए संदर्भित करती है)

+0

यह वास्तव में सार वर्गों से व्यापक है। उदाहरण के लिए, जेनेरिक प्रोग्रामिंग (टेम्पलेट्स) में लिखते समय, आप abstractions से निपटते हैं: पैरामीटर सटीक प्रकार अज्ञात है, लेकिन आपके पास कुछ अपेक्षाएं हैं। –

2

सामान्य प्रोग्रामिंग में, अवशेषों का सटीक अर्थ होता है, और उन्हें "अवधारणाएं" कहा जाता है। एक अवधारणा defined as follows:

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

  • मान्य भाव सी ++ अभिव्यक्ति कर रहे हैं जो अभिव्यक्ति में शामिल वस्तुओं के लिए सफलतापूर्वक संकलन चाहिए अवधारणा के मॉडल पर विचार किया जाएगा।
  • एसोसिएटेड प्रकार ऐसे प्रकार हैं जो मॉडलिंग प्रकार से संबंधित हैं जिसमें वे एक या अधिक मान्य अभिव्यक्तियों में भाग लेते हैं। आम तौर पर जुड़े प्रकारों को मॉडलिंग प्रकार के लिए कक्षा परिभाषा के भीतर घिरे टाइप किए गए टाइपपीफ के माध्यम से एक्सेस किया जा सकता है, या उन्हें एक विशेषता वर्ग के माध्यम से उपयोग किया जाता है।
  • Invariants ऑब्जेक्ट्स की रन-टाइम विशेषताओं हैं जो हमेशा सत्य होना चाहिए, यानी, वस्तुओं को शामिल करने वाले कार्यों को इन विशेषताओं को संरक्षित करना होगा। आविष्कार अक्सर पूर्व-परिस्थितियों और बाद की स्थितियों का रूप लेते हैं।
  • जटिलता गारंटी मान्य अभिव्यक्तियों में से किसी एक के निष्पादन को कितनी देर तक ले जाएगा, या इसकी गणना कितनी संसाधनों का उपयोग करेगी, इस पर अधिकतम सीमाएं हैं। सी ++ मानक पुस्तकालय में उपयोग की जाने वाली अवधारणाओं को SGI STL site पर दस्तावेज किया गया है।

वास्तविक कोड में एक अवधारणा को लागू करने के कई तरीकों से किया जा सकता है। शास्त्रीय ओओपी दृष्टिकोण मान्य अभिव्यक्तियों और संबंधित प्रकार प्रदान करने वाला एक सार आधार वर्ग लिखना है। कंक्रीट व्युत्पन्न कक्षाएं तब इनवेरिएंट और जटिलता गारंटी प्रदान करती हैं। टेम्पलेट्स के लिए, मान्य अभिव्यक्ति अधिक निहित हैं और केवल तत्कालता के बाद जांच की जाती हैं। टेम्पलेट को लागू अवधारणाओं duck typing का एक रूप है: अगर यह एक बतख की तरह लग रहा है,, एक बतख की तरह नीम हकीमों ....

C++ 0x विकास की प्रक्रिया devoted a lot of effort अवधारणाओं सीधे कोड में व्यक्त करने के लिए, लेकिन यह not incorporated into the C++11 Standard था। हालांकि, Concepts Lite संस्करण अगले सी ++ 14 मानक में दिखाई देने की संभावना है।

संबंधित मुद्दे