हाय! आजच्या धड्यात, आपण ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंगच्या तत्त्वांबद्दल बोलू. Java ची रचना नेमकी तशी का केली आहे याचा तुम्ही कधी विचार केला आहे का? म्हणजे, तुम्ही क्लासेस घोषित करता आणि क्लासेसवर आधारित ऑब्जेक्ट्स तयार करता, क्लासेसमध्ये मेथड्स असतात, इ. पण प्रोग्राम्समध्ये क्लासेस आणि ऑब्जेक्ट्स असतात आणि इतर कशाचाही समावेश नसावा म्हणून भाषेची रचना का केली जाते? "ऑब्जेक्ट" ची संकल्पना का शोधली गेली आणि आघाडीवर ठेवली गेली? सर्व भाषा अशा प्रकारे डिझाइन केल्या आहेत का? नसल्यास, ते Java ला कोणते फायदे देते? जसे आपण पाहू शकता, तेथे बरेच प्रश्न आहेत :) आजच्या धड्यात त्या प्रत्येकाची उत्तरे देण्याचा प्रयत्न करूया.
ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग (OOP) म्हणजे काय?
अर्थात, Java केवळ मनोरंजनासाठी वस्तू आणि वर्गांनी बनलेले नाही. ते जावाच्या निर्मात्यांच्या लहरी नाहीत आणि त्यांचा शोधही नाही. वस्तूंवर आधारित इतर अनेक भाषा आहेत. अशी पहिली भाषा "सिमुला" नावाची होती. नॉर्वेमध्ये 1960 च्या दशकात त्याचा शोध लागला. इतकेच काय, सिमुलामध्ये "वर्ग" आणि "पद्धत" च्या संकल्पना दिसल्या. सॉफ्टवेअर डेव्हलपमेंटच्या मानकांनुसार, "सिमुला" ही एक प्राचीन भाषा आहे, परंतु कोणीही जावाशी तिचे "कौटुंबिक साम्य" पाहू शकतो. तुम्ही कदाचित या भाषेत लिहिलेला कोड सहज वाचू शकता आणि ते काय करते ते विस्तृत स्ट्रोकमध्ये स्पष्ट करू शकता :)
Begin
Class Rectangle (Width, Height); Real Width, Height;
Begin
Real Area, Perimeter;
Procedure Update;
Begin
Area := Width * Height;
OutText("Rectangle is updating, Area = "); OutFix(Area,2,8); OutImage;
Perimeter := 2*(Width + Height);
OutText("Rectangle is updating, Perimeter = "); OutFix(Perimeter,2,8); OutImage;
End of Update;
Update;
OutText("Rectangle created: "); OutFix(Width,2,6);
OutFix(Height,2,6); OutImage;
End of Rectangle;
Rectangle Class ColouredRectangle (Color); Text Color;
Begin
OutText("ColouredRectangle created, color = "); OutText(Color);
OutImage;
End of ColouredRectangle;
Ref(Rectangle) Cr;
Cr :- New ColouredRectangle(10, 20, "Green");
End;
हा कोड नमुना कोड Weekly-geekly द्वारे "Simula - 50 Years of OOP" मधून घेतला होता. तुम्ही बघू शकता, जावा त्याच्या आजोबांपेक्षा फारसा वेगळा नाही :) हे सिमुलाच्या दिसण्यामुळे नवीन संकल्पना जन्माला आली: ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग. विकिपीडिया ओओपीची अशी व्याख्या करतो: "ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (ओओपी)" हे "ऑब्जेक्ट" च्या संकल्पनेवर आधारित प्रोग्रामिंग पॅराडाइम आहे, ज्यामध्ये फील्ड (बहुतेकदा विशेषता म्हणून ओळखले जाते) आणि कोडच्या स्वरूपात डेटा असू शकतो. प्रक्रियांची (बहुतेकदा पद्धती म्हणून ओळखले जाते). माझ्या मते, ही खरोखर चांगली व्याख्या आहे. तुम्ही जावा शिकण्यास सुरुवात केली होती हे फार पूर्वी नव्हते, परंतु या व्याख्येमध्ये कदाचित तुम्हाला माहित नसलेले कोणतेही शब्द नाहीत :) आज OOP ही सर्वात सामान्य प्रोग्रामिंग पद्धत आहे. जावा व्यतिरिक्त, OOP तत्त्वे अनेक लोकप्रिय भाषांमध्ये वापरली जातात ज्यांच्याबद्दल तुम्ही ऐकले असेल. उदाहरणार्थ, C++ (गेम डेव्हलपमेंटमध्ये सक्रियपणे वापरला जातो), ऑब्जेक्टिव्ह-सी आणि स्विफ्ट (ऍपल उपकरणांसाठी प्रोग्राम लिहिण्यासाठी वापरला जातो), पायथन (मशीन लर्निंगमध्ये सर्वात लोकप्रिय), PHP (सर्वात लोकप्रिय वेब विकास भाषांपैकी एक), JavaScript ( ते कशासाठी वापरले जात नाही हे सांगणे सोपे आहे) आणि इतर अनेक. तर, तरीही OOP ची तत्त्वे काय आहेत? आम्ही तुम्हाला तपशीलवार सांगू. तरीही OOP ची तत्त्वे काय आहेत? आम्ही तुम्हाला तपशीलवार सांगू. तरीही OOP ची तत्त्वे काय आहेत? आम्ही तुम्हाला तपशीलवार सांगू.
OOP तत्त्वे
हे फाउंडेशनचा पाया आहेत. 4 मुख्य वैशिष्ट्ये जी एकत्रितपणे ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग प्रतिमान तयार करतात. यशस्वी प्रोग्रामर होण्यासाठी त्यांना समजून घेणे आवश्यक आहे.तत्त्व 1. वारसा
चांगली बातमी: तुम्हाला OOP ची काही तत्त्वे आधीच माहित आहेत! :) आम्ही धड्यांमध्ये आधीच दोन वेळा वारसा अनुभवला आहे आणि आम्ही ते वापरण्यात व्यवस्थापित केले. वारसा ही एक यंत्रणा आहे जी तुम्हाला विद्यमान (पालक) वर्गावर आधारित नवीन वर्गाचे वर्णन करू देते. असे करताना, नवीन वर्ग मूळ वर्गाचे गुणधर्म आणि कार्यक्षमता उधार घेतो. वारसा कशासाठी आहे आणि ते कोणते फायदे प्रदान करते? सर्वात महत्त्वाचे म्हणजे, कोडचा पुनर्वापर. पालक वर्गांमध्ये घोषित केलेले फील्ड आणि पद्धती वंशज वर्गांमध्ये वापरल्या जाऊ शकतात. सर्व प्रकारच्या कारमध्ये 10 सामाईक फील्ड आणि 5 समान पद्धती असल्यास, तुम्हाला त्यांना फक्त ऑटोमध्ये हलवावे लागेल .पालक वर्ग. आपण त्यांना कोणत्याही समस्यांशिवाय वंशज वर्गात वापरू शकता. ठोस फायदे: दोन्ही परिमाणवाचक (कमी कोड) आणि परिणामी, गुणात्मक (वर्ग बरेच सोपे होतात). शिवाय, वारसा खूप लवचिक आहे — तुम्ही वंशज गहाळ असलेली स्वतंत्र कार्यक्षमता जोडू शकता (काही फील्ड किंवा वर्तन जे विशिष्ट वर्गासाठी विशिष्ट आहेत). सर्वसाधारणपणे, वास्तविक जीवनाप्रमाणे, आपण सर्व काही प्रमाणात आपल्या पालकांसारखेच आहोत, परंतु त्यांच्यापेक्षा काहीसे वेगळे देखील आहोत :)तत्त्व 2. अमूर्तता
हे एक अतिशय साधे तत्व आहे. अॅब्स्ट्रॅक्शन म्हणजे एखाद्या गोष्टीची मुख्य, सर्वात महत्त्वाची वैशिष्ट्ये ओळखणे, त्याच वेळी लहान आणि क्षुल्लक काहीही टाकून देणे. चाक पुन्हा शोधण्याची गरज नाही. वर्गांबद्दलच्या जुन्या धड्यातील एक उदाहरण आठवूया. समजा आम्ही कंपनी कर्मचार्यांसाठी फाइलिंग सिस्टम तयार करत आहोत. "कर्मचारी" ऑब्जेक्ट्स तयार करण्यासाठी, आम्ही एक कर्मचारी वर्ग लिहिला आहे. कंपनी फाइलिंग सिस्टममध्ये त्यांचे वर्णन करण्यासाठी कोणती वैशिष्ट्ये महत्त्वाची आहेत? नाव, जन्मतारीख, SSN आणि कर्मचारी आयडी. परंतु या प्रकारच्या रेकॉर्डसाठी आम्हाला कर्मचार्यांची उंची, डोळ्यांचा रंग किंवा केसांचा रंग आवश्यक असण्याची शक्यता नाही. कंपनीला कर्मचाऱ्याबद्दल अशा माहितीची गरज नाही. तर, कर्मचारी वर्गात, आम्ही खालील व्हेरिएबल्स घोषित करतो:, int वय , int socialSecurityNumber , आणि int कर्मचारी आयडी . आणि आम्ही डोळ्याच्या रंगासारखी अनावश्यक माहिती काढून टाकतो. तथापि, आम्ही मॉडेलिंग एजन्सीसाठी फाइलिंग सिस्टम बनवत असल्यास, परिस्थिती नाटकीयरित्या बदलते. मॉडेलची उंची, डोळ्यांचा रंग आणि केसांचा रंग ही महत्त्वाची वैशिष्ट्ये आहेत, परंतु तिचा SSN आमच्यासाठी पूर्णपणे अप्रासंगिक आहे. तर, मॉडेल क्लासमध्ये, आम्ही खालील व्हेरिएबल्स तयार करतो: स्ट्रिंगची उंची , स्ट्रिंग केस , स्ट्रिंग डोळे .तत्त्व 3. एन्कॅप्सुलेशन
आम्ही आधीच या मध्ये धाव घेतली आहे. Java मध्ये, encapsulation म्हणजे डेटा वाचण्याची आणि बदलण्याची क्षमता मर्यादित करणे. जसे आपण पाहू शकता, हा शब्द "कॅप्सूल" या शब्दावर आधारित आहे. आम्ही काही महत्त्वाचा डेटा लपवण्यासाठी "कॅप्सूल" वापरू जे इतरांनी बदलू नये असे आम्हाला वाटते. वास्तविक जीवनातील एक साधे उदाहरण येथे आहे. तुमचे नाव आणि आडनाव आहे. तुमचे सर्व मित्र त्यांना ओळखतात. पण तुमचे नाव किंवा आडनाव बदलण्याची त्यांची क्षमता नाही. आम्ही असे म्हणू शकतो की ते करण्याची प्रक्रिया न्यायालयीन प्रणालीद्वारे "एनकॅप्स्युलेट" आहे: तुम्ही तुमचे आडनाव फक्त कोर्ट क्लर्कद्वारे बदलू शकता आणि ते फक्त तुम्हीच करू शकता. इतर "वापरकर्ते" कडे तुमच्या नाव आणि आडनावाचा "रीड-ओन्ली" प्रवेश आहे :) दुसरे स्पष्ट उदाहरण म्हणजे घरी रोख रक्कम. आपल्या खोलीच्या मध्यभागी ते साध्या दृष्टीक्षेपात सोडणे चांगली कल्पना नाही. कोणताही "वापरकर्ता" (तुमच्या घरी येणारी व्यक्ती) तुमच्या पैशाची रक्कम बदलू शकेल, म्हणजेच ते तुमचे पैसे घेऊ शकतात. ते एका सेफमध्ये कॅप्स्युलेट करणे चांगले होईल. मग प्रवेश फक्त तुम्हाला आणि फक्त एक विशेष कोड वापरून उपलब्ध असेल. एन्कॅप्स्युलेशनची स्पष्ट उदाहरणे ज्यावर तुम्ही आधीच काम केले आहे ते ऍक्सेस मॉडिफायर (खाजगी, सार्वजनिक इ.), तसेच सेटर्स आणि गेटर्स आहेत. आपण encapsulate नाही तरमांजर वर्गाचे वय फील्ड, नंतर कोणीही लिहू शकतो:
Cat.age = -1000;
एन्कॅप्स्युलेशन मेकॅनिझम आम्हाला सेटर पद्धतीने वय फील्डचे संरक्षण करू देते, जेथे आम्ही खात्री करू शकतो की वय नकारात्मक संख्येवर सेट केले जाऊ शकत नाही.
तत्त्व 4. बहुरूपता
पॉलिमॉर्फिझम म्हणजे अनेक प्रकारांसह कार्य करण्याची क्षमता जसे की ते समान प्रकारचे आहेत. शिवाय, वस्तूंचे वर्तन त्यांच्या प्रकारानुसार भिन्न असेल. ते क्लिष्ट वाटते का? त्याचा आत्ताच अर्थ लावूया. सर्वात साधे उदाहरण घ्या: प्राणी. सिंगल स्पीक() पद्धतीसह प्राणी वर्ग तयार करा आणि दोन उपवर्ग — मांजर आणि कुत्रा .
public class Animal {
public void speak() {
System.out.println("Hello!");
}
}
public class Dog extends Animal {
@Override
public void speak() {
System.out.println ("Woof-woof!");
}
}
public class Cat extends Animal {
@Override
public void speak() {
System.out.println("Meow!");
}
}
आता आपण प्राणी संदर्भ व्हेरिएबल घोषित करण्याचा प्रयत्न करू आणि त्यास डॉग ऑब्जेक्ट नियुक्त करू.
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
dog.speak();
}
}
तुम्हाला कोणती पद्धत म्हटले जाईल असे वाटते? Animal.speak() किंवा Dog.speak() ? कुत्र्याच्या वर्गातील पद्धतीला असे म्हटले जाईल: वूफ-वूफ! आम्ही प्राणी संदर्भ तयार केला, परंतु वस्तू कुत्र्यासारखी वागते . आवश्यक असल्यास, ते मांजर, घोडा किंवा इतर प्राण्यांसारखे वागू शकते. महत्त्वाची गोष्ट म्हणजे सामान्य प्राणी संदर्भ व्हेरिएबलला विशिष्ट उपवर्ग नियुक्त करणे. हे अर्थपूर्ण आहे, कारण सर्व कुत्रे प्राणी आहेत. "वस्तूंचे वर्तन त्यांच्या प्रकारानुसार भिन्न असेल" असे आम्ही म्हटले तेव्हा आमच्या मनात तेच होते. जर आपण मांजरीची वस्तू तयार केली तर...
public static void main(String[] args) {
Animal cat = new Cat();
cat.speak();
}
स्पीक () पद्धत "म्याऊ!" दर्शवेल! पण 'अनेक प्रकारांबरोबर काम करण्याची क्षमता, जणू ते एकाच प्रकारचे आहेत' याचा अर्थ काय? हे देखील अगदी सरळ आहे. चला कल्पना करूया की आम्ही प्राण्यांसाठी नाईचे दुकान तयार करत आहोत. आमचे नाईचे दुकान कोणत्याही प्राण्याला ट्रिम देण्यास सक्षम असले पाहिजे, म्हणून आम्ही प्राणी पॅरामीटर (प्राण्याला केस कापत आहे) सह ट्रिम() पद्धत तयार करतो.
public class AnimalBarbershop {
public void trim(Animal animal) {
System.out.println("The haircut is done!");
}
}
आणि आता आपण कॅट आणि डॉग ऑब्जेक्ट्स ट्रिम() पद्धतीने पास करू शकतो!
public static void main(String[] args) {
Cat cat = new Cat();
Dog dog = new Dog();
AnimalBarbershop barbershop = new AnimalBarbershop();
barbershop.trim(cat);
barbershop.trim(dog);
}
आणि येथे एक स्पष्ट उदाहरण आहे: अॅनिमलबार्बरशॉप वर्ग मांजर आणि कुत्र्यांच्या प्रकारांसह कार्य करतो जणू ते समान प्रकारचे आहेत. त्याच वेळी, मांजर आणि कुत्र्याची वागणूक भिन्न आहे: ते प्रत्येकजण वेगळ्या पद्धतीने बोलतात.
GO TO FULL VERSION