Unit 1
Need of Object Oriented Programming
Object Oriented programming को समझ ने से पहले हमें यह होगा की "प्रोसीज़रल ओरिएंटेड प्रोग्रामिंग" क्या होता है। पहले प्रोग्रामिंग प्रोसीजर ओरिएंटेड होती थी इस में प्रोग्राम छोटे छोटे पार्ट्स में डिवाइड रहता है जिसे फंक्शन कहते है। मतलब इसमें लिखा हुआ लाइन ऑफ़ कोड एक लीनियर सीरीज में चलता है। इस में कई सारी कमिया है जैसे प्रोसीज़रल ओरिएंटेड प्रोग्रामिंग में हमें किसी भी प्रकार का एक्सेस स्पेसिफिएर नहीं होता है । P.O.P. में डेटा को एक्सेस करने का लिया कोई प्रॉपर टर्म नहीं है ओर procedural oriented programming में ओवरलोडिंग भी संभव नहीं है। पॉप(procedural oriented programming) में ज्यादातर फंक्शन ग्लोबल डेटा को शेयरिंग के लिए यूज़ में लेता है जो की एक सिस्टम में फंक्शन टु फंक्शन फ्रीली एक्सेस हो सकता है। "प्रोसीज़रल ओरिएंटेड प्रोग्रामिंग" मे काफी सारी कमी होने के बाद हमें अपडेट होने की नीड पड़ी। इतनी सारी कमी को पूरा करने का लिए "ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग" को यूज़ में लिया जाने लगा।
Object Oriented programming (OOP) एक programming paradigm है जिसमें क्लास ओर ऑब्जेक्ट को यूज़ में लिया जाता है। OOP के द्वारा सॉफ्टवेयर प्रोग्राम को simply लिखा जा सकता है और उस लिखे हुए "लाइन ऑफ़ कोड" को हम reuse भी कर सकते है। c++, java and python ऐसी programming language है जो ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग को यूज़ में लेती है।
OOPs की विशेषता (Characteristics of OOPs)
- ऑब्जेक्ट और क्लास (object and class)
- इनहेरिटेंस (inheritance)
- रीयूज़ेबिलिटी (reusability)
- पोलीमॉरफीसम (polymorphism)
- ओवरलोडिंग (overloading)
ऑब्जेक्ट और क्लास (object and class):-क्लास को एनकैपसुलेशन की बेसिक इकाई के रूप में जाना जाता है। एक क्लास फंक्शन कोड और डेटा(Variable) का कलेक्शन होता है जिसको object oriented programming का मूल कहा जाता है। क्लास एक अब्स्ट्रक्ट(abstract) डेटा टाइप होता है। क्लास के अंदर फंक्शन एंड वेरिएबल डिफाइन रहते है जो तब अस्तितव में आते है जब उस क्लास का ऑब्जेक्ट(object) क्रिएट किया जाता है। क्लास एक लॉजिकल एंटिटी(entity) होती है। लेकिन ऑब्जेक्ट एक फिजिकल एंटिटी होती है और इसे इंस्टैंस ऑफ़ क्लास(instance of class) कहा जाता है। एक क्लास के एक से अधिक ऑब्जेक्ट बनाए जा सक्ते है। एक क्लास में प्रत्येक ऑब्जेक्ट के पास समान डाटा का समूह होता है और ये क्लास के फंक्शन का यूज़ करके डाटा का मैनीपुलेशन कर सकते है। उदाहरण के लिए:- हम कार नाम की एक क्लास बना सकते है जिसमे कई सारी प्रॉपर्टीज जैसे कंपनी , मोडल , फ्यूल टाइप ,कलर आदि ओर एक फंक्शन repaint() बना सकते है।
ऑब्जेक्ट c++ प्रोग्रामिंग लैंग्वेज में एक बेसिक एंटिटी होती है। सभी ऑब्जेक्ट क्लास के इंस्टैंस(instance) होते है। एक ऑब्जेक्ट डेली लाइफ में यूज़ होने वाली किसी भी वस्तु को रिप्रेजेंट कर सकता है जैसे चेयर, स्टूडेंट ,एम्प्लोयी , बुक ,कार , स्पीकर आदि।जब भी हम ऑब्जेक्ट क्रिएट करते है तो वो ऑब्जेक्ट मेमोरी में कुछ स्पेस लेता है और सारे ऑब्जेक्ट सेम सेट के डेटा आइटम को शेयर करते है जो की क्लास क्रिएट करते समय डिफाइन किये जाता है। दो ऑब्जेक्ट मैसेज पासिंग के थ्रू आपस में कम्यूनिकेट कर सकते है।
इनहेरिटेंस(inheritance):-किसी क्लास के गुणों(properties ) और विशेषताओं(characteristics ) को किसी अन्य क्लास से प्राप्त करने की क्षमता को इनहेरिटेंस(inheritance) कहा जाता है। इनहेरिटेंस ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग(oop) का एक महत्वपूर्ण फीचर(feature) होता है। oop में इनहेरिटेंस रीयूजेबिलिटी(reusability) के बेसिक आईडिया को दर्शाता है। एक नई क्लास , पुरानी क्लास के फीचर को इन्हेरिट कर सकती है। ओल्ड क्लास को बेस (base), परेंट(parent) ,सुपर(super) क्लास बोलते है और नई क्लास को derived, चाइल्ड(child), सब(sub) क्लास कहते है।
Sub Class(child class):-वह क्लास जो दूसरी क्लास के प्रॉपर्टीज को इन्हेरिट करती है, derived क्लास कहलाती है।
Super Class(parent class):-वह क्लास जिसकी प्रॉपर्टीज को sub(child) क्लास द्वारा इन्हेरिट किया जाता है ,पैरेंट या सुपर क्लास कहा जाता है।
इनहेरिटेंस का यूज़ क्यों और कब करता है ?
हम एक व्हीकल्स(vehicles) के ग्रुप को कंसीडर करते है। व्हीकल्स में बस , कार्स , ट्रक आते है। तो इस के लिए हमें बस ,कार, ट्रक नाम की तीन क्लास बनानी पड़ेगी जिसमे fuel amount(), capacity() ,apply-brakes() आदि मेथड(method) तीनो क्लास के लिए सेम(same) रहेंगे। अगर हम इन क्लासो को बिना इनहेरिटेंस के क्रिएट(create) करेंगे तो हमें तीनो क्लास के लिए ये तीनो मेथड(method) अलग अलग लिखने पड़ेंगे।
आप यह स्पस्ट देख सकते है की उपरोक्त प्रक्रिया का रिजल्ट 3 बार सामान कोड के धोराने का परिणाम है। मतलब सेम(same) फंक्शन को तीनो क्लास कॉन्टैन(contain) कर रही है। यह प्रक्रिया data redundancy और गलती होने के चांस(chance) को भड़ा सकती है। इस प्रकार की situation को हटाने के लिए इनहेरिटेंस(inheritance) का यूज़ किया जाता है।
इनहेरिटेंस का उपयोग करते हुए, हमें फंक्शन को तीन बार के बजाय केवल एक बार लिखना होगा क्योंकि हमें बेस क्लास (व्हीकल) से तीनों क्लास का बाकी हिस्सा विरासत में मिल जायगा।
रीयूज़ेबिलिटी (reusability):- c++ reusability के कांसेप्ट(concept) को स्ट्रॉन्ग्ली(strongly) सपोर्ट करता है। c++ प्रोग्रामिंग लैंग्वेज में बनी हुई क्लासेस कई तरह से रीयूज़(reuse) की जा सकती है। जब किसी प्रोग्रामर द्वारा कोई क्लास लिखी जाती है तो और जब उस क्लास की टेस्टिंग सही ढंग से पूरी हो जाती है तो यह क्लास किसी दूसरे डेवलपर द्वारा उसके requirement के अनुसार adopt कर ली जाती है। इसे ही reusability कहा जाता है।
उदहारण के लिए :- मान लीजिए मैने एक क्लास बनाई addition नाम की उसमे sum() नाम का एक मेथड(function) है। तो अगर फ्यूचर में मुझे sum() फंक्शन की जरुरत पड़ी तो मुझे कोई नई क्लास नहीं बनानी पड़ेगी। में पहले से बानी क्लास addition class का यूज़ करलूँगा।
पोलीमॉरफीसम (polymorphism):-पॉलीमॉरफिस्म (polymorphism) शब्द का अर्थ है कई रूप। सरल शब्दो में हम पॉलीमॉरफिस्म(polymorphism) के द्वारा एक मैसेज(message) को एक से अधिक रुपो में प्रदर्शित करने की क्षमता के रूप में परिभाषित कर सकते है। हम पॉलीमॉरफिस्म(polymorphism) को एक रियल लाइफ example से समझने की कोशिश करते है। जैसे एक व्यक्ति एक टाइम पर कई विशेषताएँ रख सकता है। जैसे एक व्यक्ति एक टाइम पे father, employee and husband हो सकता है। तो एक व्यक्ति अलग-अलग स्थितियों में अलग-अलग व्यवहार रखता है। इसे ही बहुरूपता(polymorphism) कहा जाता है। बहुरूपता(polymorphism) को ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग(oop) की महत्वपूर्ण विशेषताओं में से एक माना जाता है।
c++ में बहुरूपता(polymorphism) को मुख्य रूप से दो प्रकारों में विभाजित किया गया है:
- Compile Time Polymorphism
- Run Time Polymorphism
Compile Time Polymorphism: compile time polymorphism, फ़ंक्शन(function) ओवरलोडिंग या ऑपरेटर(operator) ओवरलोडिंग द्वारा प्राप्त किया जाता है। compile time polymorphism दो टाइप के होते है।
- Function overloading
- Operator overloading
Function Overloading:-जब एक नाम के बहुत सारे फंक्शन हो लेकिन उनके पैरामीटर्स(Parameters) अलग अलग हो तो इसे फंक्शन ओवरलोडिंग(Function Overloading) कहा जाता है। फंक्शन को आर्गुमेंट(Argument) की संख्या और आर्गुमेंट के टाइप को चेंज करके ओवरलोड(Overload) कर सकते है।
An Example of Function Overloading
// C++ program for function overloading
#include <bits/stdc++.h>
using namespace std;
class Over_loading
{
public:
// function with 1 int parameter
void func(int x)
{
cout << "value of x is " << x << endl;
}
// function with same name but 1 double parameter
void func(double x)
{
cout << "value of x is " << x << endl;
}
// function with same name and 2 int parameters
void func(int x, int y)
{
cout << "value of x and y is " << x << ", " << y << endl;
}
};
int main() {
Over_loading obj1;
// Which function is called will depend on the parameters passed
// The first 'func' is called
obj1.func(10);
// The second 'func' is called
obj1.func(5.234);
// The third 'func' is called
obj1.func(54,23);
return 0;
}
Output:
value of x is 10
value of x is 5.234
value of x and y is 54, 23
Operator Overloading:-C++ में ऑपरेटर ओवरलोडिंग(Operator Overloading) का विकल्प भी दिया गया है। Example के लिए :- हम एक स्ट्रिंग क्लास के लिए एक ऑपरेटर (+) बना सकते है जो दो स्ट्रिंग को concatenate कर सकते है। और हम यह जानते है की यह Addition ऑपरेटर है जिसका काम दो ऑपरेंड(operands) को जोड़ना होता है।
इसलिए जब '+' ऑपरेटर पूर्णांक(Integers) ऑपरेंड्स के बीच रखा जाता है, तो उन्हें जोड़ता है और जब स्ट्रिंग ऑपरेंड्स के बीच रखा जाता है, तो उन्हें संक्षिप्त(concatenate) करता है।
// CPP program to illustrate
// Operator Overloading
#include<iostream>
using namespace std;
class Complex_number {
private:
int real, imag;
public:
Complex_number(int r = 0, int i =0) {real = r; imag = i;}
// This is automatically called when '+' is used with
// between two Complex objects
Complex_number operator + (Complex_number const &obj) {
Complex_number res;
res.real = real + obj.real;
res.imag = imag + obj.imag;
return res;
}
void print() { cout << real << " + i" << imag << endl; }
};
int main()
{
Complex_number c1(10, 5), c2(2, 4);
Complex_number c3 = c1 + c2; // An example call to "operator+"
c3.print();
}
Run Time Polymorphism:-Run Time polymorphism को फ़ंक्शन ओवरराइडिंग(Function overriding) द्वारा प्राप्त किया जाता है।
Function overriding:-रन टाइम पॉलीमॉरफिस्म को फ़ंक्शन-ओवरराइडिंग(Function overriding) द्वारा प्राप्त किया जाता है। जब Derived क्लास में व्ही फंक्शन यूज़ में लिया जाय जो फंक्शन बेस क्लास(Base class) में है तो इसे फंक्शन ओवरलोडिंग कहा जाता है। तो उस बेस क्लास के फंक्शन को ओवरराइड कहा जाता है।
An Example of Function Overriding
// C++ program for function overloading
#include <bits/stdc++.h>
using namespace std;
class base
{
public:
virtual void print ()
{ cout<< "print base class" <<endl; }
void show ()
{ cout<< "show base class" <<endl; }
};
class derived:public base
{
public:
void print () //print () is already virtual function in derived class, we could also declared as virtual void print () explicitly
{ cout<< "print derived class" <<endl; }
void show ()
{ cout<< "show derived class" <<endl; }
};
//main function
int main()
{
base *bptr;
derived d;
bptr = &d;
//virtual function, binded at runtime (Runtime polymorphism)
bptr->print();
// Non-virtual function, binded at compile time
bptr->show();
return 0;
}
Output:
print derived class
show base class
ओवरलोडिंग वाला टॉपिक पॉलीमॉरफिस्म में कवर कर लिया है।
OOP के लाभ(Benefits of OOP's)
- इनहेरिटेंस का द्वारा हम निर्थक कोड को हटा सकते है और हम मोजूद क्लास के यूज़ को भड़ा सकते है। जो की प्रोसीजर ओरिएंटेड प्रोग्रामिंग में नहीं हो सकता है।
- opps में डेटा हाईड करने का प्रिंसिपल होता है जिससे प्रोग्रामर सुरक्षित प्रोग्रामिंग कर सकता है।
- इसमें नए फंक्शन और डेटा आइटम्स को ऐड करना आसान होता है।
- हम स्टैंडर्ड वर्किंग मॉडल्स के द्वारा प्रोग्राम बिल्ड कर सकते है जिससे प्रोग्राम जल्दी और हाई प्रोडक्टिविटी के साथ बन जाता है।
- हम आपने प्रोजेक्ट को छोटे छोटे भाग में बाट सकते है जिससे एरर(error) को जल्दी ढूंढा जा सकता है।
No comments: