Progettazione orientata agli oggetti è iniziato fin dal momento in cui sono stati inventati i computer. La programmazione era lì e gli approcci alla programmazione sono entrati in scena. La programmazione consiste fondamentalmente nel dare determinate istruzioni al computer.
All’inizio dell’era informatica, la programmazione era solitamente limitata alla programmazione in linguaggio macchina. Per linguaggio macchina si intendono quegli insiemi di istruzioni specifici per una particolare macchina o processore, che sono sotto forma di 0 e 1. Si tratta di sequenze di bit (0100110…). Ma è piuttosto difficile scrivere un programma o sviluppare software in linguaggio macchina.
In realtà è impossibile sviluppare software utilizzato negli scenari odierni con sequenze di bit. Questa fu la ragione principale per cui i programmatori passarono alla generazione successiva di linguaggi di programmazione, sviluppando linguaggi assembly, che erano abbastanza vicini alla lingua inglese da poter essere facilmente compresi. Questi linguaggi assembly sono stati utilizzati nei microprocessori. Con l’invenzione del microprocessore, i linguaggi assembly fiorirono e dominarono il settore, ma non bastarono. Ancora una volta, i programmatori hanno inventato qualcosa di nuovo, ovvero una programmazione strutturata e procedurale.

Programmazione strutturata –
Il principio di base dell'approccio di programmazione strutturata è dividere un programma in funzioni e moduli. L'uso di moduli e funzioni rende il programma più comprensibile e leggibile. Aiuta a scrivere codice più pulito e a mantenere il controllo sulle funzioni e sui moduli. Questo approccio dà importanza alle funzioni piuttosto che ai dati. Si concentra sullo sviluppo di applicazioni software di grandi dimensioni, ad esempio C è stato utilizzato per lo sviluppo di sistemi operativi moderni. I linguaggi di programmazione: PASCAL (introdotto da Niklaus Wirth) e C (introdotto da Dennis Ritchie) seguono questo approccio.
Approccio alla programmazione procedurale –
Questo approccio è noto anche come approccio top-down. In questo approccio, un programma è suddiviso in funzioni che eseguono compiti specifici. Questo approccio viene utilizzato principalmente per applicazioni di medie dimensioni. I dati sono globali e tutte le funzioni possono accedere ai dati globali. Lo svantaggio fondamentale dell’approccio di programmazione procedurale è che i dati non sono protetti perché sono globali e sono accessibili da qualsiasi funzione. Il flusso di controllo del programma viene ottenuto tramite chiamate di funzioni e istruzioni goto. I linguaggi di programmazione: FORTRAN (sviluppato da IBM) e COBOL (sviluppato dalla Dr. Grace Murray Hopper) seguono questo approccio.
Questi costrutti di programmazione furono sviluppati alla fine degli anni '70 e '80. C'erano ancora alcuni problemi con questi linguaggi, sebbene soddisfacessero i criteri di programmi, software, ecc. ben strutturati. Non erano così strutturati come lo erano i requisiti in quel momento. Sembrano essere eccessivamente generalizzati e non sono correlati alle applicazioni in tempo reale.
Per risolvere questo tipo di problemi, è stato sviluppato come soluzione l'OOP, un approccio orientato agli oggetti.

L’approccio della programmazione orientata agli oggetti (OOP) –
Il concetto OOP è stato fondamentalmente progettato per superare l'inconveniente delle metodologie di programmazione di cui sopra, che non erano così vicine alle applicazioni del mondo reale. La domanda è aumentata, ma sono stati comunque utilizzati metodi convenzionali. Questo nuovo approccio ha portato una rivoluzione nel campo della metodologia di programmazione.
La programmazione orientata agli oggetti (OOP) non è altro che ciò che consente la scrittura di programmi con l'ausilio di determinate classi e oggetti in tempo reale. Possiamo dire che questo approccio è molto vicino al mondo reale e alle sue applicazioni perché lo stato e il comportamento di queste classi e oggetti sono quasi gli stessi degli oggetti del mondo reale.
Andiamo più in profondità nei concetti generali di OOP, che sono riportati di seguito:
Cosa sono classe e oggetto?
È il concetto base dell'OOP; un concetto esteso della struttura utilizzata in C. È un tipo di dati astratto e definito dall'utente. È composto da diverse variabili e funzioni. Lo scopo principale della classe è archiviare dati e informazioni. I membri di una classe definiscono il comportamento della classe. Una classe è il progetto dell'oggetto, ma possiamo anche dire che l'implementazione della classe è l'oggetto. La classe non è visibile al mondo, ma l'oggetto lo è.
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();> }> |
>
>
Qui, la classe car ha le proprietà car_id, color, engine_no e distance. Assomiglia all'auto del mondo reale che ha le stesse specifiche, che possono essere dichiarate pubbliche (visibili a tutti al di fuori della classe), protette e private (visibili a nessuno). Inoltre, ci sono alcuni metodi come distance_travelled(), petrol_used(), music_player() e display(). Nel codice riportato di seguito, l'auto è una classe e c1 è un oggetto dell'auto.
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;> }> |
convertire una stringa in intero in Java
>
>
Astrazione dei dati -
L'astrazione si riferisce all'atto di rappresentare caratteristiche importanti e speciali senza includere i dettagli di fondo o la spiegazione di tale caratteristica. L'astrazione dei dati semplifica la progettazione del database.

- Livello fisico:
Descrive come vengono archiviati i record, che spesso sono nascosti all'utente. Può essere descritto con la frase blocco di archiviazione.
Livello logico:
Descrive i dati archiviati nel database e le relazioni tra i dati. I programmatori generalmente lavorano a questo livello poiché conoscono le funzioni necessarie per mantenere le relazioni tra i dati.
Visualizza livello:
I programmi applicativi nascondono dettagli su tipi di dati e informazioni per motivi di sicurezza. Questo livello è generalmente implementato con l'aiuto della GUI e vengono mostrati i dettagli destinati all'utente.
Incapsulamento –
L'incapsulamento è uno dei concetti fondamentali nella programmazione orientata agli oggetti (OOP). Descrive l'idea di racchiudere i dati e i metodi che funzionano sui dati all'interno di un'unità, ad esempio una classe in Java. Questo concetto viene spesso utilizzato per nascondere all'esterno la rappresentazione dello stato interno di un oggetto.
Eredità –
L'ereditarietà è la capacità di una classe di ereditare capacità o proprietà di un'altra classe, chiamata classe genitore. Quando scriviamo una classe, ereditiamo proprietà da altre classi. Quindi, quando creiamo una classe, non abbiamo bisogno di riscrivere tutte le proprietà e le funzioni più e più volte, poiché queste possono essere ereditate da un'altra classe che la possiede. L'ereditarietà consente all'utente di riutilizzare il codice quando possibile e di ridurne la ridondanza.

Giava
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);> >}> }> |
>
>
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. }> |
>
>
ordinamento Java arraylistProduzione
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!>
Polimorfismo –
Il polimorfismo è la capacità dei dati di essere elaborati in più di una forma. Permette lo svolgimento dello stesso compito in vari modi. Consiste nell'overloading e nell'overriding del metodo, ovvero scrivere il metodo una volta ed eseguire una serie di attività utilizzando lo stesso nome del metodo.

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;> }> |
>
>
Alcuni punti importanti da sapere sull'OOP:
- L'OOP tratta i dati come un elemento critico.
- L’accento è posto sui dati piuttosto che sulla procedura.
- Scomposizione del problema in moduli più semplici.
- Non consente ai dati di fluire liberamente nell'intero sistema, ovvero flusso di controllo localizzato.
- I dati sono protetti da funzioni esterne.
Vantaggi degli OOP –
- Modella molto bene il mondo reale.
- Con l'OOP, i programmi sono facili da comprendere e gestire.
- OOP offre la riusabilità del codice. Le classi già create possono essere riutilizzate senza doverle riscrivere.
- L'OOP facilita il rapido sviluppo di programmi in cui è possibile lo sviluppo parallelo di classi.
- Con l'OOP, i programmi sono più facili da testare, gestire ed eseguire il debug.
Svantaggi dell'OOP –
- Con l'OOP, le classi a volte tendono ad essere eccessivamente generalizzate.
- I rapporti tra le classi a volte diventano superficiali.
- La progettazione OOP è complessa e richiede conoscenze adeguate. Inoltre, è necessario eseguire una pianificazione e una progettazione adeguate per la programmazione OOP.
- Per programmare con OOP, il programmatore necessita di competenze adeguate come progettazione, programmazione e pensiero in termini di oggetti e classi, ecc.