Projektowanie obiektowe zaczęło się już w momencie wynalezienia komputerów. Pojawiło się programowanie i pojawiły się podejścia do programowania. Programowanie polega zasadniczo na wydawaniu pewnych instrukcji komputerowi.
Na początku ery komputerowej programowanie ograniczało się zwykle do programowania w języku maszynowym. Język maszynowy oznacza zestawy instrukcji specyficznych dla konkretnej maszyny lub procesora, które mają postać zer i jedynek. Są to ciągi bitów (0100110…). Jednak napisanie programu lub opracowanie oprogramowania w języku maszynowym jest dość trudne.
Właściwie nie da się opracować oprogramowania używanego w dzisiejszych scenariuszach za pomocą sekwencji bitów. To był główny powód, dla którego programiści przeszli do następnej generacji języków programowania, opracowując języki asemblerowe, które były na tyle bliskie językowi angielskiemu, że można je było łatwo zrozumieć. Te języki asemblera były używane w mikroprocesorach. Wraz z wynalezieniem mikroprocesora, języki asemblera rozkwitły i zawładnęły branżą, ale to nie wystarczyło. Znów programiści wymyślili coś nowego, czyli programowanie strukturalne i proceduralne.

Programowanie strukturalne –
Podstawową zasadą programowania strukturalnego jest podzielenie programu na funkcje i moduły. Zastosowanie modułów i funkcji sprawia, że program jest bardziej zrozumiały i czytelny. Pomaga pisać czystszy kod i zachować kontrolę nad funkcjami i modułami. Podejście to nadaje znaczenie funkcjom, a nie danym. Koncentruje się na tworzeniu dużych aplikacji, na przykład C był używany do tworzenia nowoczesnych systemów operacyjnych. Języki programowania: PASCAL (wprowadzony przez Niklausa Wirtha) i C (wprowadzony przez Dennisa Ritchiego) podążają za tym podejściem.
Podejście do programowania proceduralnego –
Podejście to nazywane jest również podejściem od góry do dołu. W tym podejściu program dzieli się na funkcje, które realizują określone zadania. To podejście jest stosowane głównie w aplikacjach średniej wielkości. Dane mają charakter globalny i wszystkie funkcje mają dostęp do danych globalnych. Podstawową wadą podejścia do programowania proceduralnego jest to, że dane nie są zabezpieczone, ponieważ mają charakter globalny i można uzyskać do nich dostęp za pomocą dowolnej funkcji. Przepływ kontroli programu realizowany jest poprzez wywołania funkcji i instrukcje goto. Języki programowania: FORTRAN (opracowany przez IBM) i COBOL (opracowany przez dr Grace Murray Hopper) podążają za tym podejściem.
Te konstrukcje programistyczne zostały opracowane pod koniec lat 70. i 80. XX wieku. Nadal występowały pewne problemy z tymi językami, chociaż spełniały one kryteria dobrze ustrukturyzowanych programów, oprogramowania itp. Nie były one tak ustrukturyzowane, jak wymagania w tamtym czasie. Wydają się być nadmiernie uogólnione i nie korelują z aplikacjami czasu rzeczywistego.
Aby rozwiązać tego typu problemy, opracowano podejście obiektowe OOP.

Podejście do programowania obiektowego (OOP) –
Koncepcja OOP została zasadniczo zaprojektowana w celu przezwyciężenia wad powyższych metodologii programowania, które nie były tak bliskie aplikacjom w świecie rzeczywistym. Wzrosło zapotrzebowanie, ale nadal stosowano metody konwencjonalne. To nowe podejście przyniosło rewolucję w dziedzinie metodologii programowania.
Programowanie obiektowe (OOP) to nic innego jak programowanie, które pozwala na pisanie programów przy pomocy określonych klas i obiektów czasu rzeczywistego. Można powiedzieć, że to podejście jest bardzo zbliżone do świata rzeczywistego i jego zastosowań, ponieważ stan i zachowanie tych klas i obiektów jest prawie takie samo jak obiektów ze świata rzeczywistego.
Zagłębmy się w ogólne koncepcje OOP, które podano poniżej:
Czym są klasy i obiekty?
Jest to podstawowa koncepcja OOP; rozszerzona koncepcja struktury używana w C. Jest to abstrakcyjny i zdefiniowany przez użytkownika typ danych. Składa się z kilku zmiennych i funkcji. Podstawowym celem tej klasy jest przechowywanie danych i informacji. Członkowie klasy definiują zachowanie klasy. Klasa jest planem obiektu, ale możemy też powiedzieć, że implementacja klasy jest obiektem. Klasa nie jest widoczna dla świata, ale obiekt tak.
CPP
Class car> {> >int> car_id;> >char> colour[4];> >float> engine_no;> >double> distance;> > >void> distance_travelled();> >float> petrol_used();> >char> music_player();> >void> display();> }> |
>
>
Tutaj klasa samochód ma właściwości car_id, kolor, nr silnika i odległość. Przypomina samochód ze świata rzeczywistego, który ma te same specyfikacje, który można zadeklarować jako publiczny (widoczny dla wszystkich spoza klasy), chroniony i prywatny (niewidoczny dla nikogo). Istnieją również pewne metody, takie jak Distance_travelled(), benzyna_used(), music_player() i display(). W kodzie podanym poniżej samochód jest klasą, a c1 jest obiektem samochodu.
CPP
#include> using> namespace> std;> > class> car {> public>:> >int> car_id;> >double> distance;> > >void> distance_travelled();> > >void> display(>int> a,>int> b)> >{> >cout <<>'car id is= '> << a <<>'
distance travelled = '> << b + 5;> >}> };> > int> main()> {> >car c1;>// Declare c1 of type car> >c1.car_id = 321;> >c1.distance = 12;> >c1.display(321, 12);> > >return> 0;> }> |
>
>
Abstrakcja danych –
Abstrakcja odnosi się do aktu przedstawiania ważnych i specjalnych cech bez uwzględnienia szczegółów tła lub wyjaśnień na temat tej cechy. Abstrakcja danych upraszcza projektowanie baz danych.

- Poziom fizyczny:
Opisuje sposób przechowywania rekordów, które często są ukryte przed użytkownikiem. Można to opisać sformułowaniem blok pamięci.
Poziom logiczny:
Opisuje dane przechowywane w bazie danych oraz relacje pomiędzy danymi. Programiści zazwyczaj pracują na tym poziomie, ponieważ są świadomi funkcji potrzebnych do utrzymania relacji między danymi.
Zobacz poziom:
Programy aplikacyjne ukrywają szczegóły typów danych i informacje ze względów bezpieczeństwa. Ten poziom jest zwykle wdrażany za pomocą GUI i wyświetlane są szczegóły przeznaczone dla użytkownika.
Kapsułkowanie -
Hermetyzacja jest jedną z podstawowych koncepcji programowania obiektowego (OOP). Opisuje ideę zawijania danych oraz metody działające na danych w ramach jednej jednostki, np. klasy w Javie. Koncepcja ta jest często używana do ukrywania reprezentacji stanu wewnętrznego obiektu przed zewnątrz.
Dziedziczenie –
Dziedziczenie to zdolność jednej klasy do dziedziczenia możliwości lub właściwości innej klasy, zwanej klasą nadrzędną. Pisząc klasę, dziedziczymy właściwości innych klas. Kiedy więc tworzymy klasę, nie musimy ciągle wpisywać wszystkich właściwości i funkcji, ponieważ można je odziedziczyć od innej klasy, która je posiada. Dziedziczenie pozwala użytkownikowi na ponowne użycie kodu, gdy tylko jest to możliwe, i zmniejszenie jego redundancji.

Jawa
import> java.io.*;> > class> GFG {> >public> static> void> main(String[] args)> >{> >System.out.println(>'GfG!'>);> > >Dog dog =>new> Dog();> >dog.name =>'Bull dog'>;> >dog.color =>'Brown'>;> >dog.bark();> >dog.run();> > >Cat cat =>new> Cat();> >cat.name =>'Rag doll'>;> >cat.pattern =>'White and slight brownish'>;> >cat.meow();> >cat.run();> > >Animal animal =>new> Animal();> > >animal.name =>'My favourite pets'>;> > >animal.run();> >}> }> > class> Animal {> >String name;> >public> void> run()> >{> > >System.out.println(>'Animal is running!'>);> >}> }> > class> Dog>extends> Animal {> > /// the class dog is the child and animal is the parent> > >String color;> >public> void> bark()> >{> >System.out.println(name +>' Wooh ! Wooh !'> >+>'I am of colour '> + color);> >}> }> > class> Cat>extends> Animal {> > >String pattern;> > >public> void> meow()> >{> >System.out.println(name +>' Meow ! Meow !'> >+>'I am of colour '> + pattern);> >}> }> |
obsługa ciągów w C++
>
>
C++
#include> #include> using> namespace> std;> > class> Animal {> public>:> >string name;> >void> run(){> >cout<<>'Animal is running!'>< } }; class Dog : public Animal { /// the class dog is the child and animal is the parent public: string color; void bark(){ cout<' Wooh ! Wooh !' <<'I am of colour '< } }; class Cat : public Animal { public: string pattern; void meow(){ cout<' Meow ! Meow !'<<'I am of colour '< } }; int main(){ cout<<'GFG'< Dog dog; dog.name = 'Bull dog'; dog.color = 'Brown'; dog.bark(); dog.run(); Cat cat; cat.name = 'Rag doll'; cat.pattern = 'White and slight brownish'; cat.meow(); cat.run(); Animal animal; animal.name = 'My favourite pets'; animal.run(); return 0; //code contributed by Sanket Gode. }> |
>
>Wyjście
GfG! Bull dog Wooh ! Wooh !I am of colour Brown Animal is running! Rag doll Meow ! Meow !I am of colour White and slight brownish Animal is running! Animal is running!>
Polimorfizm –
Polimorfizm to zdolność danych do przetwarzania w więcej niż jednej formie. Pozwala na realizację tego samego zadania na różne sposoby. Polega na przeciążaniu metody i nadpisywaniu metody, czyli jednokrotnym zapisaniu metody i wykonaniu szeregu zadań przy użyciu tej samej nazwy metody.

CPP
#include> using> namespace> std;> > void> output(>float>);> void> output(>int>);> void> output(>int>,>float>);> > int> main()> {> >cout <<>'
GfG!
'>;> >int> a = 23;> >float> b = 2.3;> > >output(a);> >output(b);> >output(a, b);> > >return> 0;> }> > void> output(>int> var)> {>// same function name but different task> >cout <<>'Integer number: '> << var << endl;> }> > void> output(>float> var)> {>// same function name but different task> >cout <<>'Float number: '> << var << endl;> }> > void> output(>int> var1,>float> var2)> {>// same function name but different task> >cout <<>'Integer number: '> << var1;> >cout <<>' and float number:'> << var2;> }> |
>
>
Kilka ważnych punktów, które warto wiedzieć o OOP:
- OOP traktuje dane jako element krytyczny.
- Nacisk położony jest na dane, a nie na procedurę.
- Rozłożenie problemu na prostsze moduły.
- Nie pozwala na swobodny przepływ danych w całym systemie, czyli zlokalizowany przepływ sterowania.
- Dane są chronione przed funkcjami zewnętrznymi.
Zalety OOP –
- Bardzo dobrze modeluje realny świat.
- Dzięki OOP programy są łatwe do zrozumienia i utrzymania.
- OOP oferuje możliwość ponownego użycia kodu. Już utworzone klasy można wykorzystać ponownie bez konieczności ich ponownego pisania.
- OOP umożliwia szybki rozwój programów, w których możliwy jest równoległy rozwój zajęć.
- Dzięki OOP programy są łatwiejsze do testowania, zarządzania i debugowania.
Wady OOP –
- W przypadku OOP klasy czasami są nadmiernie uogólnione.
- Relacje między klasami stają się czasami powierzchowne.
- Projekt OOP jest skomplikowany i wymaga odpowiedniej wiedzy. Należy także odpowiednio zaplanować i zaprojektować programowanie OOP.
- Aby programować za pomocą OOP, programista potrzebuje odpowiednich umiejętności, takich jak projektowanie, programowanie, myślenie obiektowe i klasowe itp.