ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग

वस्तु-उन्मुख प्रोग्रामिंग (वस्तु-उन्मुख प्रोग्रामिंग) ऑब्जेक्ट (कंप्यूटर विज्ञान) की अवधारणा पर आधारित एक प्रोग्रामिंग प्रतिमान है, जिसमें डेटा और कंप्यूटर प्रोग्राम सम्मिलित हो सकते हैं। डेटा फ़ील्ड (कंप्यूटर विज्ञान) के रूप में है (प्रायः विशेषता (कंप्यूटिंग) या  गुण  के रूप में जाना आंकड़े है), और कोड प्रक्रियाओं के रूप में होता है (प्रायः 'विधि (कंप्यूटर विज्ञान)' के रूप में जाना जाता है) ).

वस्तुओं की एक सामान्य विशेषता यह है कि प्रक्रियाएँ (या विधियाँ) उनसे जुड़ी होती हैं और वस्तु के डेटा क्षेत्रों तक पहुँच और संशोधित कर सकती हैं। वस्तु-उन्मुख प्रोग्रामिंग के इस ब्रांड में सामान्य रूप से एक विशेष नाम होता है जैसे यह (कंप्यूटर प्रोग्रामिंग)|thisया self वर्तमान वस्तु को संदर्भित करने के लिए उपयोग किया जाता है। वस्तु-उन्मुख प्रोग्रामिंग में, कंप्यूटर प्रोग्राम को उन वस्तुओं से बनाकर डिज़ाइन किया जाता है जो एक दूसरे के साथ इंटरैक्ट करते हैं। वस्तु-उन्मुख प्रोग्रामिंग भाषाएँ विविध हैं, लेकिन सबसे लोकप्रिय हैं क्लास आधारित प्रोग्रामिंग | क्लास-आधारित, जिसका अर्थ है कि ऑब्जेक्ट क्लास (कंप्यूटर विज्ञान) के उदाहरण (कंप्यूटर विज्ञान) हैं, जो उनके डेटा प्रकार को भी निर्धारित करते हैं।

सबसे व्यापक रूप से उपयोग की जाने वाली प्रोग्रामिंग भाषाओं में से कई (जैसे सी ++, जावा, पायथन, आदि) बहु-प्रतिमान प्रोग्रामिंग भाषा हैं।, प्रक्रियात्मक प्रोग्रामिंग।

महत्वपूर्ण वस्तु-उन्मुख भाषाओं में सम्मिलित हैं: एडा (प्रोग्रामिंग भाषा), ActionScript, सी ++, सामान्य लिस्प, सी शार्प (प्रोग्रामिंग भाषा) | सी #, डार्ट (प्रोग्रामिंग भाषा), एफिल (प्रोग्रामिंग भाषा), फोरट्रान, मिला हुआ, जावा (प्रोग्रामिंग भाषा), जावास्क्रिप्ट, कोटलिन (प्रोग्रामिंग भाषा), लोगो (प्रोग्रामिंग भाषा), MATLAB, उद्देश्य सी, वस्तु पास्कल, पर्ल, पीएचपी, पायथन (प्रोग्रामिंग भाषा), आआर (प्रोग्रामिंग भाषा), राकू (प्रोग्रामिंग भाषा), रूबी (प्रोग्रामिंग भाषा) ), स्काला (प्रोग्रामिंग भाषा), SIMSCRIPT, प्रारंभ, स्मॉलटॉक, स्विफ्ट (प्रोग्रामिंग भाषा), वाला (प्रोग्रामिंग भाषा) और विजुअल बेसिक.नेट।

इतिहास
1950 के दशक के अंत और 1960 के दशक की प्रारंभ में वस्तु-उन्मुख प्रोग्रामिंग के आधुनिक अर्थों में वस्तुओं का आह्वान करने वाली और उन्मुख शब्दावली ने MIT में अपनी पहली उपस्थिति दर्ज की। कृत्रिम होशियारी समूह के वातावरण में, 1960 की प्रारंभ में, वस्तु गुणों (विशेषताओं) के साथ पहचानी गई वस्तुओं (लिस्प (प्रोग्रामिंग भाषा) परमाणुओं) को संदर्भित कर सकती थी; एलन के ने बाद में 1966 में अपनी सोच पर एक मजबूत प्रभाव के रूप में LISP इंटर्नल्स की विस्तृत समझ का हवाला दिया।

एक और प्रारंभिक एमआईटी उदाहरण 1960-1961 में इवान सदरलैंड द्वारा बनाया गया स्केचपैड था; स्केचपैड के बारे में अपने शोध प्रबंध पर आधारित 1963 की तकनीकी रिपोर्ट की शब्दावली में, सदरलैंड ने वस्तु और उदाहरण की धारणाओं को परिभाषित किया (मास्टर या परिभाषा द्वारा कवर की गई क्लास अवधारणा के साथ), हालांकि ग्राफिकल इंटरैक्शन के लिए विशेष। साथ ही, एक MIT ALGOL संस्करण, AED-0, डेटा संरचनाओं (उस बोली में प्लेक्सस) और प्रक्रियाओं के बीच एक सीधा लिंक स्थापित करता है, जो बाद में संदेशों, विधियों और सदस्य कार्यों को पूर्वनिर्धारित करता है। सिमूला ने महत्वपूर्ण अवधारणाओं को पेश किया जो आज वस्तु-उन्मुख प्रोग्रामिंग का एक अनिवार्य हिस्सा है, जैसे कि क्लास (कंप्यूटर प्रोग्रामिंग) और ऑब्जेक्ट (कंप्यूटर विज्ञान), इनहेरिटेंस और डायनेमिक बाइंडिंग (कंप्यूटिंग)। वस्तु-उन्मुख सिमुला प्रोग्रामिंग भाषा का उपयोग मुख्य रूप से भौतिक मॉडलिंग से जुड़े शोधकर्ताओं द्वारा किया गया था, जैसे कि कार्गो पोर्ट के माध्यम से जहाजों की आवाजाही और उनकी सामग्री का अध्ययन और सुधार करने के लिए मॉडल।

1970 के दशक में, स्मॉलटाक प्रोग्रामिंग भाषा का पहला संस्करण ज़ेरॉक्स PARC में एलन के, डैन इंगल्स और एडेल गोल्डबर्ग (कंप्यूटर वैज्ञानिक) द्वारा विकसित किया गया था। स्मालटाक -72 में एक प्रोग्रामिंग वातावरण सम्मिलित था और गतिशील प्रोग्रामिंग था, और पहले इंटरप्रेटर (कंप्यूटिंग) था, न कि संकलक। स्मॉलटाक भाषा-स्तर पर ऑब्जेक्ट ओरिएंटेशन के अपने एप्लिकेशन और इसके ग्राफिकल विकास परिवेश के लिए विख्यात हुआ। स्मॉलटाक विभिन्न संस्करणों से गुजरा और भाषा में रुचि बढ़ी। जबकि स्मॉलटाक सिमुला 67 में पेश किए गए विचारों से प्रभावित था, इसे पूरी तरह से गतिशील प्रणाली के रूप में डिजाइन किया गया था जिसमें कक्षाएं बनाई जा सकती थीं और गतिशील रूप से संशोधित की जा सकती थीं। 1970 के दशक में, स्मॉलटाक ने लिस्प (प्रोग्रामिंग भाषा)#भाषा नवाचारों को लिस्प (प्रोग्रामिंग भाषा)#ऑब्जेक्ट प्रणाली|ऑब्जेक्ट-आधारित तकनीकों को सम्मिलित करने के लिए प्रभावित किया, जिन्हें लिस्प मशीन के माध्यम से डेवलपर्स के लिए पेश किया गया था। लिस्प के विभिन्न एक्सटेंशन के साथ प्रयोग (जैसे लूप्स और जायके (प्रोग्रामिंग भाषा) एकाधिक इनहेरिटेंस और मिश्रण को पेश करते हुए) अंततः कॉमन लिस्प ऑब्जेक्ट प्रणाली का नेतृत्व किया, जो कार्यात्मक प्रोग्रामिंग और वस्तु-उन्मुख प्रोग्रामिंग को एकीकृत करता है और मेटा-ऑब्जेक्ट प्रोटोकॉल के माध्यम से विस्तार की स्वीकृति देता है। 1980 के दशक में, प्रोसेसर संरचना को डिजाइन करने के कुछ प्रयास हुए जिनमें स्मृति में वस्तुओं के लिए हार्डवेयर समर्थन सम्मिलित था लेकिन ये सफल नहीं रहे। उदाहरणों में Intel iAPX 432 और Linn Products Rekursiv सम्मिलित हैं।

1981 में, गोल्डबर्ग ने बाइट पत्रिका के अगस्त अंक को संपादित किया, जिसमें व्यापक दर्शकों के लिए स्मॉलटाक और वस्तु-उन्मुख प्रोग्रामिंग की प्रारंभ की गई। 1986 में, कम्प्यूटिंग मशीनरी एसोसिएशन ने वस्तु-उन्मुख प्रोग्रामिंग, सिस्टम्स, लैंग्वेजेज और एप्लिकेशन (OOPSLA) पर पहला सम्मेलन आयोजित किया, जिसमें अप्रत्याशित रूप से 1,000 लोगों ने भाग लिया। 1980 के दशक के मध्य में ऑब्जेक्टिव-सी को ब्रैड कॉक्स द्वारा विकसित किया गया था, जिन्होंने आईटीटी इंक. में स्मॉलटाक का उपयोग किया था, और बज़्ने स्ट्रॉस्ट्रुप, जिन्होंने अपनी पीएचडी थीसिस के लिए सिमुला का उपयोग किया था, अंततः वस्तु-उन्मुख सी++ बनाने के लिए गए। 1985 में, बर्ट्रेंड मेयर ने एफिल (प्रोग्रामिंग भाषा) का पहला डिज़ाइन भी तैयार किया। सॉफ्टवेयर गुणवत्ता पर केंद्रित, एफिल विशुद्ध रूप से वस्तु-उन्मुख प्रोग्रामिंग भाषा है और संपूर्ण सॉफ्टवेयर जीवनचक्र का समर्थन करने वाला एक संकेत है। मेयर ने वस्तु-उन्मुख सॉफ्टवेयर निर्माण में सॉफ्टवेयर इंजीनियरिंग और कंप्यूटर विज्ञान से कुछ प्रमुख विचारों के आधार पर एफिल सॉफ्टवेयर डेवलपमेंट मेथड का वर्णन किया। एफिल की गुणवत्ता पर ध्यान केंद्रित करने के लिए अनिवार्य है मेयर की विश्वसनीयता तंत्र, अनुबंध द्वारा डिजाइन, जो विधि और भाषा दोनों का एक अभिन्न अंग है।

1990 के दशक की प्रारंभ और मध्य में वस्तु-उन्मुख प्रोग्रामिंग प्रमुख प्रोग्रामिंग प्रतिमान के रूप में विकसित हुई जब तकनीकों का समर्थन करने वाली प्रोग्रामिंग भाषाएं व्यापक रूप से उपलब्ध हो गईं। इनमें विजुअल फॉक्सप्रो 3.0,  सी ++, और डेल्फी (प्रोग्रामिंग भाषा). ग्राफिकल यूज़र इंटरफ़ेस की बढ़ती लोकप्रियता से इसका प्रभुत्व और बढ़ गया, जो वस्तु-उन्मुख प्रोग्रामिंग तकनीकों पर बहुत अधिक निर्भर करता है। बारीकी से संबंधित गतिशील जीयूआई पुस्तकालय और वस्तु-उन्मुख प्रोग्रामिंग भाषा का एक उदाहरण Mac OS X पर कोको (सॉफ्टवेयर) ढांचे में पाया जा सकता है, जो ऑब्जेक्टिव-सी में लिखा गया है, जो स्मॉलटॉक पर आधारित सी के लिए एक वस्तु-उन्मुख, गतिशील संदेश विस्तार है। वस्तु-उन्मुख प्रोग्रामिंग टूलकिट ने घटना-संचालित प्रोग्रामिंग की लोकप्रियता को भी बढ़ाया (हालांकि यह अवधारणा वस्तु-उन्मुख प्रोग्रामिंग तक सीमित नहीं है)।

ईटीएच ज्यूरिख में, निकोलस विर्थ और उनके सहयोगी भी डेटा अमूर्तता और प्रतिरूपकता (प्रोग्रामिंग) जैसे विषयों की जांच कर रहे थे (हालांकि यह 1960 या उससे पहले सामान्य उपयोग में था)। मॉड्यूल-2 (1978) में दोनों सम्मिलित थे, और उनके सफल डिजाइन, ओबेरॉन (प्रोग्रामिंग भाषा) में ऑब्जेक्ट ओरिएंटेशन, क्लासेस और इस तरह के एक विशिष्ट दृष्टिकोण सम्मिलित थे।

Ada (प्रोग्रामिंग भाषा), BASIC, फोरट्रान, पास्कल (प्रोग्रामिंग भाषा), और COBOL सहित कई पूर्व-सम्मिलित भाषाओं में वस्तु-उन्मुख सुविधाओं को जोड़ा गया है। इन सुविधाओं को उन भाषाओं में जोड़ना जो प्रारंभ में उनके लिए डिज़ाइन नहीं की गई थीं, प्रायः कोड की संगतता और रखरखाव के साथ समस्याएं पैदा हुईं।

हाल ही में, कई भाषाएं उभरी हैं जो मुख्य रूप से वस्तु-उन्मुख हैं, लेकिन वे प्रक्रियात्मक पद्धति के साथ भी संगत हैं। ऐसी दो भाषाएँ हैं पायथन (प्रोग्रामिंग भाषा) और रूबी प्रोग्रामिंग भाषा। सन माइक्रोसिस्टम्स द्वारा विकसित जावा (प्रोग्रामिंग भाषा), साथ ही सी शार्प (प्रोग्रामिंग भाषा)|सी# और विज़ुअल बुनियादी.नेट (वीबी.नेट), दोनों ही माइक्रोसॉफ्ट के .नेट के लिए डिज़ाइन की गई हैं। रूपरेखा|नेट प्लेटफॉर्म। इन दो रूपरेखाओं में से प्रत्येक अपने तरीके से, कार्यान्वयन से एक अमूर्तता बनाकर वस्तु-उन्मुख प्रोग्रामिंग का उपयोग करने का लाभ दिखाता है। VB.NET और C# क्रॉस-भाषा इनहेरिटेंस का समर्थन करते हैं, एक भाषा में परिभाषित क्लास को दूसरी भाषा में परिभाषित सबक्लास वर्गों की स्वीकृति देते हैं।

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

गैर-वस्तु-उन्मुख प्रोग्रामिंग भाषाओं के साथ साझा

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

मॉड्यूलर प्रोग्रामिंग समर्थन संगठनात्मक उद्देश्यों के लिए फाइलों और मॉड्यूल में समूह प्रक्रियाओं की क्षमता प्रदान करता है। मॉड्यूल नामस्थान हैं इसलिए एक मॉड्यूल में पहचानकर्ता किसी अन्य फ़ाइल या मॉड्यूल में समान नाम साझा करने वाली प्रक्रिया या चर के साथ संघर्ष नहीं करेंगे।

ऑब्जेक्ट्स और क्लासेस
वस्तु-उन्मुख प्रोग्रामिंग (वस्तु-उन्मुख प्रोग्रामिंग) का समर्थन करने वाली भाषाएं सामान्य रूप से क्लास-आधारित प्रोग्रामिंग या प्रोटोटाइप-आधारित प्रोग्रामिंग के रूप में कोड पुन: उपयोग और एक्स्टेंसिबिलिटी के लिए इनहेरिटेंस (वस्तु-उन्मुख प्रोग्रामिंग) का उपयोग करती हैं। वे जो क्लास का उपयोग करते हैं वे दो मुख्य अवधारणाओं का समर्थन करते हैं:
 * क्लास (कंप्यूटर विज्ञान) - किसी दिए गए प्रकार या वस्तु के क्लास के लिए डेटा प्रारूप और उपलब्ध प्रक्रियाओं की परिभाषाएँ; डेटा और प्रक्रियाएं भी सम्मिलित हो सकती हैं (जिसे क्लास विधियों के रूप में जाना जाता है), अर्थात क्लास में डेटा सदस्य और सदस्य कार्य होते हैं
 * वस्तु (कंप्यूटर विज्ञान) - क्लास के उदाहरण

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

प्रत्येक वस्तु को एक विशेष क्लास का एक उदाहरण (कंप्यूटर विज्ञान) कहा जाता है (उदाहरण के लिए, एक वस्तु जिसका नाम फ़ील्ड मैरी पर सेट है, क्लास कर्मचारी का एक उदाहरण हो सकता है)। वस्तु-उन्मुख प्रोग्रामिंग में प्रक्रियाओं को विधि (कंप्यूटर विज्ञान) के रूप में जाना जाता है; चर को फील्ड (कंप्यूटर विज्ञान), सदस्यों, विशेषताओं या गुणों के रूप में भी जाना जाता है। यह निम्नलिखित शर्तों की ओर जाता है:
 * क्लास चर्स - एक पूरे के रूप में क्लास से संबंधित हैं; हर एक की केवल एक प्रति है
 * उदाहरण चर या विशेषताएँ - डेटा जो व्यक्तिगत वस्तुओं से संबंधित है; हर वस्तु की हर एक की अपनी प्रति होती है
 * सदस्य चर - क्लास और उदाहरण चर दोनों को संदर्भित करता है जो किसी विशेष क्लास द्वारा परिभाषित किए जाते हैं
 * क्लास मेथड्स - पूरी तरह से क्लास से संबंधित हैं और प्रक्रिया कॉल से केवल क्लास वेरिएबल्स और इनपुट तक ही पहुंच है
 * इंस्टेंस मेथड्स - अलग-अलग ऑब्जेक्ट्स से संबंधित हैं, और विशिष्ट ऑब्जेक्ट के लिए इंस्टेंस वेरिएबल्स तक पहुंच है, जिन्हें वे इनपुट, और क्लास वेरिएबल्स कहते हैं

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

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

कुछ भाषाओं में क्लास और वस्तुओं को अन्य अवधारणाओं जैसे विशेषता (कंप्यूटर प्रोग्रामिंग) और मिश्रणों का उपयोग करके बनाया जा सकता है।

क्लास-आधारित बनाम प्रोटोटाइप-आधारित
क्लास-बेस्ड प्रोग्रामिंग | क्लास-बेस्ड भाषा में क्लास पहले से परिभाषित होती हैं और क्लास के आधार पर ऑब्जेक्ट्स को इंस्टैंट किया जाता है। यदि दो वस्तुओं सेब और नारंगी को क्लास फल से तत्काल किया जाता है, तो वे स्वाभाविक रूप से फल हैं और यह गारंटी है कि आप उन्हें उसी तरह से संभाल सकते हैं; उदा. एक प्रोग्रामर रंग या चीनी_सामग्री या is_ripe जैसी समान विशेषताओं के अस्तित्व की अपेक्षा कर सकता है।

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

डायनेमिक डिस्पैच/संदेश देना
किसी विधि कॉल के जवाब में निष्पादित करने के लिए प्रक्रियात्मक कोड का चयन करने के लिए वस्तु की जिम्मेदारी है, किसी बाहरी कोड की नहीं, सामान्य रूप से ऑब्जेक्ट से जुड़ी तालिका में रन टाइम पर विधि को देखकर। इस सुविधा को गतिशील प्रेषण के रूप में जाना जाता है। यदि कॉल परिवर्तनशीलता एक से अधिक प्रकार की वस्तु पर निर्भर करती है, जिस पर इसे कहा जाता है (अर्थात कम से कम एक अन्य पैरामीटर ऑब्जेक्ट विधि विकल्प में सम्मिलित है), एक से अधिक प्रेषण की बात करता है।

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

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

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

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

संरचना, विरासत, और प्रतिनिधिमंडल
वस्तुओं में उनके उदाहरण चर में अन्य वस्तुएँ हो सकती हैं; इसे वस्तु रचना के रूप में जाना जाता है। उदाहरण के लिए, कर्मचारी क्लास में एक वस्तु में (या तो सीधे या एक सूचक के माध्यम से) पता क्लास में एक वस्तु हो सकती है, इसके अतिरिक्त अपने स्वयं के उदाहरण चर जैसे first_name और स्थिति। ऑब्जेक्ट संरचना का उपयोग संबंधों को दर्शाने के लिए किया जाता है: प्रत्येक कर्मचारी का एक पता होता है, इसलिए प्रत्येक कर्मचारी ऑब्जेक्ट के पास एड्रेस ऑब्जेक्ट स्टोर करने के लिए एक जगह तक पहुंच होती है (या तो सीधे अपने भीतर एम्बेड किया जाता है, या एक पॉइंटर के माध्यम से संबोधित एक अलग स्थान पर)।

क्लास का समर्थन करने वाली भाषाएं लगभग हमेशा इनहेरिटेंस (वस्तु-उन्मुख प्रोग्रामिंग) का समर्थन करती हैं। यह क्लास को एक पदानुक्रम में व्यवस्थित करने की स्वीकृति देता है जो कि एक प्रकार के संबंधों का प्रतिनिधित्व करता है। उदाहरण के लिए, क्लास कर्मचारी क्लास व्यक्ति से प्राप्त हो सकता है। पैरेंट क्लास के लिए उपलब्ध सभी डेटा और मेथड्स चाइल्ड क्लास में भी उन्हीं नामों के साथ दिखाई देते हैं। उदाहरण के लिए, क्लास व्यक्ति चर first_name और last_name को विधि make_full_name के साथ परिभाषित कर सकता है। ये क्लास कर्मचारी में भी उपलब्ध होंगे, जो चर स्थिति और वेतन जोड़ सकते हैं। यह तकनीक एक सहज तरीके से वास्तविक विश्व के रिश्तों को संभावित रूप से प्रतिबिंबित करने के अतिरिक्त समान प्रक्रियाओं और डेटा परिभाषाओं के आसान पुन: उपयोग की स्वीकृति देती है। डेटाबेस टेबल और प्रोग्रामिंग सबरूटीन्स का उपयोग करने के अतिरिक्त, डेवलपर उन वस्तुओं का उपयोग करता है जिनसे उपयोगकर्ता अधिक परिचित हो सकता है: उनके एप्लिकेशन डोमेन से ऑब्जेक्ट। सबक्लास सुपरक्लास द्वारा परिभाषित विधियों को ओवरराइड कर सकते हैं। कुछ भाषाओं में एकाधिक इनहेरिटेंस की स्वीकृति है, हालांकि यह समाधान को ओवरराइड को जटिल बना सकता है। कुछ भाषाओं में मिश्रण के लिए विशेष समर्थन होता है, हालांकि किसी भी भाषा में एकाधिक इनहेरिटेंस के साथ, एक मिश्रण केवल एक क्लास है जो एक प्रकार के संबंध का प्रतिनिधित्व नहीं करता है। मिक्सिन्स का उपयोग सामान्य रूप से एक ही तरीके को कई वर्गों में जोड़ने के लिए किया जाता है। उदाहरण के लिए, क्लास FileReader और क्लास WebPageScraper में सम्मिलित होने पर, क्लास UnicodeConversionMixin एक विधि unicode_to_ascii प्रदान कर सकता है, जो एक सामान्य माता-पिता को साझा नहीं करता है।

सार वर्गों को वस्तुओं में तत्काल नहीं किया जा सकता है; वे केवल अन्य ठोस वर्गों में इनहेरिटेंस के उद्देश्य से सम्मिलित हैं जिन्हें तत्काल किया जा सकता है। जावा में,  किसी क्लास को उपवर्गित होने से रोकने के लिए कीवर्ड का उपयोग किया जा सकता है।

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

खुला/बंद सिद्धांत इस बात की वकालत करता है कि कक्षाएं और कार्य विस्तार के लिए खुले होने चाहिए, लेकिन संशोधन के लिए बंद होने चाहिए।

प्रत्यायोजन (वस्तु-उन्मुख प्रोग्रामिंग) एक अन्य भाषा सुविधा है जिसका उपयोग इनहेरिटेंस के विकल्प के रूप में किया जा सकता है।

बहुरूपता
उपप्रकार - बहुरूपता (कंप्यूटर विज्ञान) का एक रूप - जब कॉलिंग कोड स्वतंत्र हो सकता है कि समर्थित पदानुक्रम में यह किस क्लास पर काम कर रहा है - मूल क्लास या उसके वंश में से एक। इस बीच, विरासत पदानुक्रम में वस्तुओं के बीच एक ही ऑपरेशन का नाम अलग-अलग गतिविधि कर सकता है।

उदाहरण के लिए, वृत्त और क्लास प्रकार की वस्तुएँ आकार नामक एक सामान्य क्लास से ली गई हैं। प्रत्येक प्रकार के आकार के लिए ड्रा फ़ंक्शन लागू होता है जो स्वयं को आकर्षित करने के लिए आवश्यक होता है जबकि कॉलिंग कोड किसी विशेष प्रकार के आकार को आकर्षित करने के प्रति उदासीन रह सकता है।

यह एक अन्य प्रकार का अमूर्त है जो क्लास पदानुक्रम के बाहर के कोड को सरल करता है और चिंताओं के मजबूत पृथक्करण को सक्षम बनाता है।

खुला पुनरावर्तन
ओपन रिकर्सन का समर्थन करने वाली भाषाओं में, ऑब्जेक्ट मेथड्स एक ही ऑब्जेक्ट (स्वयं सहित) पर अन्य तरीकों को कॉल कर सकते हैं, सामान्य रूप से एक विशेष चर या कीवर्ड का उपयोग करते हुए कहा जाता है  या. यह वेरिएबल नाम बंधन|लेट-बाउंड; यह एक क्लास में परिभाषित एक विधि को दूसरी विधि का आह्वान करने की स्वीकृति देता है जिसे बाद में उसके कुछ उपवर्गों में परिभाषित किया गया है।

वस्तु-उन्मुख प्रोग्रामिंग भाषाएं
सिमुला (1967) को सामान्य रूप से वस्तु-उन्मुख भाषा की प्राथमिक विशेषताओं वाली पहली भाषा के रूप में स्वीकार किया जाता है। यह कंप्यूटर सिमुलेशन बनाने के लिए बनाया गया था, जिसमें वस्तुओं को सबसे महत्वपूर्ण सूचना प्रतिनिधित्व कहा जाने लगा। स्मॉलटाक (1972 से 1980) एक और प्रारंभिक उदाहरण है, और वह जिसके साथ वस्तु-उन्मुख प्रोग्रामिंग के अधिकांश सिद्धांत विकसित किए गए थे। वस्तु अभिविन्यास की डिग्री के संबंध में, निम्नलिखित भेद किए जा सकते हैं:


 * शुद्ध वस्तु-उन्मुख भाषाएँ कहलाने वाली भाषाएँ, क्योंकि उनमें सब कुछ एक वस्तु के रूप में लगातार गतिविधि किया जाता है, आदिम से लेकर वर्ण और विराम चिह्न तक, सभी तरह से पूरी क्लास, प्रोटोटाइप, ब्लॉक, मॉड्यूल आदि तक। वे विशेष रूप से सुविधा के लिए डिज़ाइन किए गए थे, यहाँ तक कि लागू करें, वस्तु-उन्मुख तरीके। उदाहरण: रूबी (प्रोग्रामिंग भाषा), स्काला (प्रोग्रामिंग भाषा), स्मॉलटाक, एफिल (प्रोग्रामिंग भाषा), पन्ना (प्रोग्रामिंग भाषा), JADE (प्रोग्रामिंग भाषा), स्वयं (प्रोग्रामिंग भाषा), राकू (प्रोग्रामिंग भाषा)।
 * मुख्य रूप से वस्तु-उन्मुख प्रोग्रामिंग के लिए डिज़ाइन की गई भाषाएँ, लेकिन कुछ प्रक्रियात्मक तत्वों के साथ। उदाहरण: जावा (प्रोग्रामिंग भाषा), पायथन (प्रोग्रामिंग भाषा), सी++, सी शार्प (प्रोग्रामिंग भाषा)|सी#, डेल्फी (प्रोग्रामिंग भाषा)/ऑब्जेक्ट पास्कल, वीबी.नेट।
 * भाषाएँ जो ऐतिहासिक रूप से प्रक्रियात्मक प्रोग्रामिंग हैं, लेकिन कुछ वस्तु-उन्मुख सुविधाओं के साथ विस्तारित की गई हैं। उदाहरण: PHP, पर्ल, मूल दृश्य (बेसिक से प्राप्त), MATLAB, COBOL 2002, फोरट्रान 2003, ABAP, Ada (प्रोग्रामिंग भाषा), पास्कल (प्रोग्रामिंग भाषा)।
 * वस्तुओं (वर्गों, विधियों, विरासत) की अधिकांश विशेषताओं वाली भाषाएँ, लेकिन एक विशिष्ट मूल रूप में। उदाहरण: ओबेरॉन (प्रोग्रामिंग भाषा) (ओबेरॉन-1 या ओबेरॉन-2)।
 * अमूर्त डेटा प्रकार समर्थन वाली भाषाएँ जिनका उपयोग वस्तु-उन्मुख प्रोग्रामिंग के समान करने के लिए किया जा सकता है, लेकिन ऑब्जेक्ट-ओरिएंटेशन की सभी विशेषताओं के बिना। इसमें ऑब्जेक्ट-आधारित|ऑब्जेक्ट-आधारित और प्रोटोटाइप-आधारित प्रोग्रामिंग|प्रोटोटाइप-आधारित भाषाएं सम्मिलित हैं। उदाहरण: JavaScript, Lua (प्रोग्रामिंग भाषा), Modula-2, CLU (प्रोग्रामिंग भाषा)।
 * गिरगिट भाषाएँ जो वस्तु-उन्मुख सहित कई प्रतिमानों का समर्थन करती हैं। TclOO के लिए इनमें से Tcl सबसे अलग है, एक हाइब्रिड ऑब्जेक्ट प्रणाली जो प्रोटोटाइप-आधारित प्रोग्रामिंग और क्लास-आधारित वस्तु-उन्मुख दोनों का समर्थन करता है।

गतिशील भाषाओं में वस्तु-उन्मुख प्रोग्रामिंग
हाल के वर्षों में, वस्तु-उन्मुख प्रोग्रामिंग गतिशील प्रोग्रामिंग भाषाओं में विशेष रूप से लोकप्रिय हो गई है। पायथन (प्रोग्रामिंग भाषा), विंडोज पॉवरशेल, रूबी (प्रोग्रामिंग भाषा) और ग्रूवी (प्रोग्रामिंग भाषा) वस्तु-उन्मुख प्रोग्रामिंग सिद्धांतों पर निर्मित गतिशील भाषाएं हैं, जबकि पर्ल और पीएचपी पर्ल 5 और पीएचपी 4 के बाद से वस्तु-उन्मुख फीचर जोड़ रहे हैं, और संस्करण के बाद से ठंडा गलन 6.

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

एक नेटवर्क प्रोटोकॉल में वस्तु-उन्मुख प्रोग्रामिंग
क्लाइंट-सर्वर वातावरण में सेवाओं का अनुरोध करने के लिए कंप्यूटर के बीच प्रवाहित होने वाले संदेशों को क्लाइंट और सर्वर दोनों के लिए ज्ञात क्लास वस्तुओं द्वारा परिभाषित वस्तुओं के रैखिककरण के रूप में डिज़ाइन किया जा सकता है। उदाहरण के लिए, एक साधारण रेखीयकृत वस्तु में एक लम्बाई क्षेत्र, क्लास की पहचान करने वाला एक कोड बिंदु और एक डेटा मान सम्मिलित होगा। एक अधिक जटिल उदाहरण एक कमांड होगा जिसमें कमांड की लंबाई और कोड बिंदु और कमांड के पैरामीटर का प्रतिनिधित्व करने वाले रैखिक वस्तुओं से युक्त मूल्य सम्मिलित होंगे। ऐसे प्रत्येक आदेश को सर्वर द्वारा उस वस्तु के लिए निर्देशित किया जाना चाहिए जिसका क्लास (या सुपरक्लास) आदेश को पहचानता है और अनुरोधित सेवा प्रदान करने में सक्षम है। ग्राहकों और सर्वरों को जटिल वस्तु-उन्मुख संरचनाओं के रूप में सर्वोत्तम रूप से तैयार किया जाता है। वितरित डेटा प्रबंधन संरचना (डीडीएम) ने इस दृष्टिकोण को अपनाया और औपचारिक पदानुक्रम के चार स्तरों पर वस्तुओं को परिभाषित करने के लिए क्लास ऑब्जेक्ट्स का इस्तेमाल किया:
 * संदेश बनाने वाले डेटा मानों को परिभाषित करने वाले फ़ील्ड, जैसे कि उनकी लंबाई, कोड बिंदु और डेटा मान।
 * संदेश और मापदंडों के लिए स्मॉलटाक प्रोग्राम में जो मिलेगा उसके समान वस्तुओं का संग्रह और संग्रह।
 * IBM i Object (IBM i) के समान प्रबंधक, जैसे मेटाडेटा और रिकॉर्ड वाली फ़ाइलों और फ़ाइलों की निर्देशिका। प्रबंधक अवधारणात्मक रूप से अपनी निहित वस्तुओं के लिए मेमोरी और प्रोसेसिंग संसाधन प्रदान करते हैं।
 * एक क्लाइंट या सर्वर जिसमें एक पूर्ण प्रसंस्करण वातावरण को लागू करने के लिए आवश्यक सभी प्रबंधक सम्मिलित हैं, जो निर्देशिका सेवाओं, सुरक्षा और समवर्ती नियंत्रण जैसे पहलुओं का समर्थन करते हैं।

डीडीएम का प्रारंभिक संस्करण वितरित फ़ाइल सेवाओं को परिभाषित करता है। इसे बाद में जिला ग्रामीण विकास एजेंसी (डीआरडीए) की नींव के रूप में विस्तारित किया गया।

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

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

चार डिजाइन पैटर्न का गिरोह
डिजाइन पैटर्न (पुस्तक) | डिजाइन पैटर्न: पुन: प्रयोज्य वस्तु-उन्मुख सॉफ्टवेयर के तत्व 1994 में एरिक गामा, रिचर्ड हेल्म, राल्फ जॉनसन (कंप्यूटर वैज्ञानिक), और जॉन व्लिससाइड्स द्वारा प्रकाशित एक प्रभावशाली पुस्तक है, जिसे प्रायः मजाक में चार की गिरोह के रूप में संदर्भित किया जाता है।. वस्तु-उन्मुख प्रोग्रामिंग की क्षमताओं और नुकसान की खोज के साथ-साथ, यह 23 सामान्य प्रोग्रामिंग समस्याओं और उन्हें हल करने मुखौटा पैटर्न का वर्णन करता है। अप्रैल 2007 तक, पुस्तक अपने 36वें मुद्रण में थी।

पुस्तक निम्नलिखित पैटर्न का वर्णन करती है:
 * क्रिएशनल पैटर्न (5): फैक्टरी विधि पैटर्न, सार कारखाना पैटर्न, सिंगलटन पैटर्न, बिल्डर पैटर्न, प्रोटोटाइप पैटर्न
 * सं[[रचनात्मक पैटर्न]] (7): एडेप्टर पैटर्न, ब्रिज पैटर्न, समग्र पैटर्न, डेकोरेटर पैटर्न, फेकाडे पैटर्न, फ्लाईवेट पैटर्न, प्रॉक्सी पैटर्न
 * गतिविधि पैटर्न (11): चेन-ऑफ-जिम्मेदारी पैटर्न, कमांड पैटर्न, दुभाषिया पैटर्न, इटरेटर पैटर्न, मध्यस्थ पैटर्न, स्मृति चिन्ह पैटर्न, पर्यवेक्षक पैटर्न, राज्य पैटर्न, रणनीति पैटर्न, टेम्पलेट विधि पैटर्न, विज़िटर पैटर्न

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

ऐसे वस्तु डेटाबेस भी हैं जिनका उपयोग संबंधपरक डेटाबेस प्रबंधन प्रणाली को बदलने के लिए किया जा सकता है, लेकिन ये संबंधपरक डेटाबेस प्रबंधन प्रणाली की तरह तकनीकी और व्यावसायिक रूप से सफल नहीं रहे हैं।

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

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

हालांकि, निकलॉस विर्थ (जिन्होंने विर्थ के नियम के रूप में जानी जाने वाली कहावत को लोकप्रिय बनाया: हार्डवेयर की तुलना में सॉफ्टवेयर तेजी से धीमा हो रहा है) ने अपने पेपर में वस्तु-उन्मुख प्रोग्रामिंग के बारे में कहा, लुकिंग ग्लास के माध्यम से अच्छे विचार, यह प्रतिमान बारीकी से प्रणाली की संरचना को दर्शाता है 'में वास्तविक विश्व', और इसलिए यह जटिल व्यवहारों के साथ मॉडल जटिल प्रणालियों के लिए उपयुक्त है (विपरीत KISS सिद्धांत)।

स्टीव येगे और अन्य ने नोट किया कि प्राकृतिक भाषाओं में कार्यों (विधियों/क्रियाओं) से पहले चीजों (वस्तुओं/संज्ञाओं) को सख्ती से प्राथमिकता देने के वस्तु-उन्मुख प्रोग्रामिंग दृष्टिकोण की कमी है। यह समस्या वस्तु-उन्मुख प्रोग्रामिंग को प्रक्रियात्मक प्रोग्रामिंग की तुलना में अधिक जटिल समाधान भुगतने का कारण बन सकती है।

वस्तु-उन्मुख प्रोग्रामिंग और नियंत्रण प्रवाह
वस्तु-उन्मुख प्रोग्रामिंग को कोड के पुन: उपयोग और स्रोत कोड के सॉफ़्टवेयर रखरखाव को बढ़ाने के लिए विकसित किया गया था। नियंत्रण प्रवाह के पारदर्शी प्रतिनिधित्व की कोई प्राथमिकता नहीं थी और इसका मतलब एक संकलक द्वारा नियंत्रित किया जाना था। समानांतर हार्डवेयर और थ्रेड (कंप्यूटर विज्ञान) की बढ़ती प्रासंगिकता के साथ, पारदर्शी नियंत्रण प्रवाह विकसित करना अधिक महत्वपूर्ण हो जाता है, वस्तु-उन्मुख प्रोग्रामिंग के साथ कुछ हासिल करना कठिन होता है।

उत्तरदायित्व- बनाम डेटा-संचालित डिज़ाइन
उत्तरदायित्व-संचालित डिजाइन एक अनुबंध के संदर्भ में वर्गों को परिभाषित करता है, अर्थात, एक क्लास को एक जिम्मेदारी और उसके द्वारा साझा की जाने वाली जानकारी के आसपास परिभाषित किया जाना चाहिए। यह डेटा-संचालित प्रोग्रामिंग के साथ Wirfs-Brock और Wilkerson द्वारा विपरीत है। डेटा-संचालित डिज़ाइन, जहां क्लास को डेटा-संरचनाओं के आसपास परिभाषित किया जाना चाहिए। लेखकों का मानना ​​है कि जिम्मेदारी से संचालित डिजाइन बेहतर है।

ठोस और GRASP दिशानिर्देश
SOLID (वस्तु-उन्मुख डिज़ाइन) माइकल फेदर्स द्वारा आविष्कार किया गया एक स्मरक है जो पाँच सॉफ्टवेयर इंजीनियरिंग डिज़ाइन सिद्धांतों को बताता है:
 * एकल जिम्मेदारी सिद्धांत
 * खुला / बंद सिद्धांत
 * लिस्कोव प्रतिस्थापन सिद्धांत
 * इंटरफ़ेस पृथक्करण सिद्धांत
 * निर्भरता उलटा सिद्धांत

GRASP (वस्तु-उन्मुख डिज़ाइन) (जनरल रिस्पॉन्सिबिलिटी असाइनमेंट सॉफ़्टवेयर पैटर्न) क्रेग लर्मन द्वारा समर्थित दिशानिर्देशों का एक और सेट है।

आलोचना
वस्तु-उन्मुख प्रोग्रामिंग प्रतिमान की कई कारणों से आलोचना की गई है, जिसमें पुन: प्रयोज्यता और मॉड्यूलरिटी के अपने घोषित लक्ष्यों को पूरा नहीं करना सम्मिलित है, और अन्य महत्वपूर्ण पहलुओं (गणना/एल्गोरिदम) की कीमत पर सॉफ्टवेयर डिजाइन और मॉडलिंग (डेटा/ऑब्जेक्ट्स) के एक पहलू पर अधिक जोर देने के लिए।

Luca Cardelli ने दावा किया है कि वस्तु-उन्मुख प्रोग्रामिंग कोड प्रक्रियात्मक कोड की तुलना में आंतरिक रूप से कम कुशल है, वस्तु-उन्मुख प्रोग्रामिंग को संकलित करने में अधिक समय लग सकता है, और यह कि वस्तु-उन्मुख प्रोग्रामिंग भाषाओं में क्लास विस्तार और संशोधन के संबंध में बेहद खराब मॉड्यूलरिटी गुण हैं, और यह बेहद जटिल हैं। उत्तरार्द्ध बिंदु जो आर्मस्ट्रांग (प्रोग्रामिंग) द्वारा दोहराया गया है, जो एरलांग (प्रोग्रामिंग भाषा) के प्रमुख आविष्कारक हैं, जिन्हें यह कहते हुए उद्धृत किया गया है:

"The problem with object-oriented languages is they've got all this implicit environment that they carry around with them. You wanted a banana but what you got was a gorilla holding the banana and the entire jungle."

पोटोक एट अल द्वारा एक अध्ययन। वस्तु-उन्मुख प्रोग्रामिंग और प्रक्रियात्मक दृष्टिकोण के बीच उत्पादकता में कोई महत्वपूर्ण अंतर नहीं दिखाया है। क्रिस्टोफर जे. डेट ने कहा कि वस्तु-उन्मुख प्रोग्रामिंग की अन्य तकनीकों से महत्वपूर्ण तुलना, विशेष रूप से संबंधपरक, वस्तु-उन्मुख प्रोग्रामिंग की एक सहमत और कठोर परिभाषा की कमी के कारण कठिन है; हालाँकि, डेट और डार्वेन ने वस्तु-उन्मुख प्रोग्रामिंग पर एक सैद्धांतिक आधार प्रस्तावित किया है जो RDBMS का समर्थन करने के लिए वस्तु-उन्मुख प्रोग्रामिंग को एक प्रकार के अनुकूलन योग्य डेटा प्रकार के रूप में उपयोग करता है। एक लेख में लॉरेंस क्रुबनेर ने दावा किया कि अन्य भाषाओं (एलआईएसपी बोलियों, कार्यात्मक भाषाओं, आदि) की तुलना में वस्तु-उन्मुख प्रोग्रामिंग भाषाओं में कोई अनोखी ताकत नहीं है, और अनावश्यक जटिलता का भारी बोझ डालती है। अलेक्जेंडर स्टेपानोव ऑब्जेक्ट ओरिएंटेशन की तुलना सामान्य प्रोग्रामिंग से प्रतिकूल रूप से करता है:

"I find OOP technically unsound. It attempts to decompose the world in terms of interfaces that vary on a single type. To deal with the real problems you need multisorted algebras — families of interfaces that span multiple types. I find OOP philosophically unsound. It claims that everything is an object. Even if it is true it is not very interesting — saying that everything is an object is saying nothing at all."

पॉल ग्राहम (कंप्यूटर प्रोग्रामर) ने सुझाव दिया है कि बड़ी कंपनियों के भीतर वस्तु-उन्मुख प्रोग्रामिंग की लोकप्रियता औसत प्रोग्रामर के बड़े (और प्रायः बदलते) समूहों के कारण है। ग्राहम के अनुसार, वस्तु-उन्मुख प्रोग्रामिंग द्वारा लगाया गया अनुशासन किसी एक प्रोग्रामर को बहुत अधिक नुकसान करने से रोकता है। लियो ब्रॉडी ने वस्तुओं की स्टैंडअलोन प्रकृति और डुप्लिकेट कोड की प्रवृत्ति के बीच संबंध का सुझाव दिया है खुद को न दोहराने के सिद्धांत का उल्लंघन करते हुए सॉफ्टवेयर विकास की।

स्टीव येगे ने नोट किया कि कार्यात्मक प्रोग्रामिंग के विपरीत:

"Object Oriented Programming puts the nouns first and foremost. Why would you go to such lengths to put one part of speech on a pedestal? Why should one kind of concept take precedence over another? It's not as if OOP has suddenly made verbs less important in the way we actually think. It's a strangely skewed perspective."

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

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

औपचारिक सेमेन्टिक्स
वस्तु-उन्मुख प्रणाली में ऑब्जेक्ट रन-टाइम इकाइयां हैं। वे किसी व्यक्ति, स्थान, बैंक खाते, डेटा की तालिका, या किसी भी आइटम का प्रतिनिधित्व कर सकते हैं जिसे प्रोग्राम को संभालना है।

वस्तु-उन्मुख प्रोग्रामिंग में उपयोग की जाने वाली अवधारणाओं को औपचारिक रूप देने के कई प्रयास किए गए हैं। वस्तु-उन्मुख प्रोग्रामिंग अवधारणाओं की व्याख्या के रूप में निम्नलिखित अवधारणाओं और निर्माणों का उपयोग किया गया है:
 * कोलजेब्रा में
 * पुनरावर्ती प्रकार
 * समझाया राज्य
 * इनहेरिटेंस (वस्तु-उन्मुख प्रोग्रामिंग)
 * रिकॉर्ड (कंप्यूटर विज्ञान) वस्तुओं को समझने के लिए आधार हैं यदि समारोह शाब्दिक को फ़ील्ड्स (जैसे कार्यात्मक-प्रोग्रामिंग भाषाओं) में संग्रहीत किया जा सकता है, लेकिन वास्तविक कैलकुली को वस्तु-उन्मुख प्रोग्रामिंग की आवश्यक विशेषताओं को सम्मिलित करने के लिए काफी अधिक जटिल होना चाहिए। प्रणाली F-sub|System F के कई विस्तार<:परिवर्तनीय वस्तुओं से संबंधित अध्ययन किया गया है; ये उपप्रकार बहुरूपता और पैरामीट्रिक बहुरूपता (जेनेरिक) दोनों की स्वीकृति देते हैं

वस्तुओं के पीछे एक सामान्य सहमति परिभाषा या सिद्धांत खोजने का प्रयास बहुत सफल प्रमाणित नहीं हुआ है (हालांकि, देखें Abadi & Cardelli, A Theory of Objects कई वस्तु-उन्मुख प्रोग्रामिंग अवधारणाओं और निर्माणों की औपचारिक परिभाषाओं के लिए), और प्रायः व्यापक रूप से अलग हो जाते हैं। उदाहरण के लिए, कुछ परिभाषाएँ मानसिक गतिविधियों पर और कुछ प्रोग्राम संरचना पर केंद्रित हैं। सरल परिभाषाओं में से एक यह है कि वस्तु-उन्मुख प्रोग्रामिंग मानचित्र डेटा संरचनाओं या सरणी का उपयोग करने का कार्य है जिसमें शीर्ष पर कुछ वाक्य रचनात्मक चीनी के साथ अन्य मानचित्रों में फ़ंक्शन और पॉइंटर्स सम्मिलित हो सकते हैं। नक्शों की क्लोनिंग (कभी-कभी प्रोटोटाइपिंग कहा जाता है) द्वारा विरासत का प्रदर्शन किया जा सकता है।

यह भी देखें

 * प्रोग्रामिंग भाषाओं की तुलना (वस्तु-उन्मुख प्रोग्रामिंग)
 * प्रोग्रामिंग प्रतिमानों की तुलना
 * घटक आधारित सॉफ्टवेयर इंजीनियरिंग
 * अनुबंध द्वारा डिजाइन
 * वस्तु संघ
 * वस्तु डाटाबेस
 * वस्तु मॉडल का संदर्भ
 * वस्तु मॉडलिंग भाषा
 * वस्तु-उन्मुख विश्लेषण और डिजाइन
 * वस्तु-संबंधपरक प्रतिबाधा बेमेल (और तीसरा घोषणापत्र)
 * वस्तु-संबंधपरक मानचित्रण

प्रणाली

 * कैड्स
 * सामान्य ऑब्जेक्ट अनुरोध ब्रोकर संरचना (कॉरबा)
 * वितरित घटक वस्तु मॉडल
 * वितरित डेटा प्रबंधन संरचना
 * जेरू

मॉडलिंग भाषाएं

 * आईडीईएफ4
 * इंटरफ़ेस विवरण भाषा
 * लेपस3
 * यूएमएल

बाहरी संबंध

 * Introduction to Object Oriented Programming Concepts (वस्तु-उन्मुख प्रोग्रामिंग) and More by L.W.C. Nirosh
 * Discussion on Cons of वस्तु-उन्मुख प्रोग्रामिंग
 * वस्तु-उन्मुख प्रोग्रामिंग Concepts (Java Tutorials)