Programmazione Orientata agli Oggetti (OOP): differenze tra le versioni

Da Bioingegneria Elettronica e Informatica.
Riga 1: Riga 1:
Quando si deve sviluppare un programma particolarmente complesso che richiede molto codice, la programmazione strutturata mediante l’uso di funzioni o procedure può risultare non più sufficiente per garantire una totale leggibilità e comprensibilità del progetto. Inoltre, si immagini di lavorare in un’azienda di sviluppo software gestionale; molte funzioni o procedure scritte per un determinato programma, verosimilmente saranno utili anche per altri progetti con scopi simili. Inoltre l’uso della programmazione strutturata può trovare dei limiti in quanto non è adatta al cosiddetto “riuso del codice”.
+
La programmazione orientata agli oggetti (OOP) consiste in un paradigma di programmazione basato sugli oggetti, ognuno delle quali è un'istanza di una classe, e queste classi sono tutte parte di una gerarchia di entità unite fra di loro da una relazione di ereditarietà. Ricapitolando:
In entrambi i succitati casi, può risultare molto più utile impostare il progetto da sviluppare seguendo le linee guida dettate dalla programmazione orientata agli oggetti.
+
# OOP utilizza un insieme di oggetti;
 +
# ogni oggetto è istanza di una classe;
 +
# ogni classe è legata alle altre attraverso una relazione detta eredità.
  
 +
== Le Classi ==
 +
Alla base della programmazione ad oggetti c’è il concetto di "classe". Una classe è un costrutto utilizzato per la modellazione di entità, quindi per la creazione (istanziazione) di oggetti; quindi, un'istanza della classe si definisce “oggetto”.
  
== Introduzione ==
+
All'interno di una classe si possono distinguere i seguenti elementi:
 +
* Attributo/i;
 +
* Metodo/i.
  
== Le Classi ==
+
Concettualmente parlando, non cambia nulla rispetto a quanto imparato nella programmazione strutturata: il codice, la necessità di sviluppare una funzione o una procedura, ecc… rimane la stessa. Si immagini una classe come l’estensione di una “struct”, all’interno della quale è possibile andare a definire, oltre che alle semplici variabili, anche delle funzionalità.
 +
Gli “attributi”, o variabili membro, definiti all’interno di una classe, costituiscono lo stato della classe stessa. Un “metodo” di una classe, invece, definisce una funzionalità della classe stessa; i metodi servono a specificare il comportamento dell’entità (ovvero l’oggetto) di cui la classe è rappresentazione. Trattandosi di funzioni, un metodo può ritornare valori, oppure nulla (come le procedure o “funzioni void”).
 +
Un importante concetto associato ai metodi e agli attributi delle classi è la “visibilità”. In C++ si definiscono tre tipologie di attributi e metodi:
 +
• Public - gli attributi o i metodi sono accessibili dall’esterno della stessa classe;
 +
• Private - gli attributi o i metodi sono accessibili solo dalla stessa classe;
 +
• Protected - gli attributi o i metodi sono accessibili dalla stessa classe o da quelle derivate da essa.
 +
L’importanza di assegnare un tipo visibilità al metodo o all’attributo, risiede nel “controllo” dell’istanza associata alla classe (oggetto). Poter permettere ad una riga di codice esterna alla classe di modificare un attributo privato può portare a comportamenti non previsti del codice e quindi a crash del programma.
 +
 
 +
 
 +
E’ buona prassi di programmazione, associare:
 +
• Public - metodi che possono essere richiamati all’esterno della classe;
 +
• Private - attributi della classe e metodi che lavorano con variabili della classe stessa senza generare un output “utile” all’esterno.
 +
Nell’ambito della programmazione orientata agli oggetti, è necessario definire tre importanti proprietà:
 +
• Incapsulamento – si basa sul principio dell’information hiding e permette di nascondere all’utente i dettagli implementativi di una classe; quindi l’utente interagisce con gli oggetti di una determinata classe attraverso le interfacce messe a disposizione dall’oggetto stesso.
 +
• Ereditarietà – la possibilità per un oggetto di acquisire le caratteristiche di un’altra classe; tramite le relazioni di generalizzazione/specializzazione, una superclasse definisce un concetto generale, che viene poi specializzato dalle sottoclassi.
 +
• Polimorfismo – la possibilità di utilizzare uno stesso nome per definire metodi diversi permettendo di avere accesso a diverse implementazioni di una funzione attraverso un solo nome (un’interfaccia, più metodi). Il polimorfismo può essere effettuato sia a compile-time che a run-time; il primo caso può essere realizzato tramite overload di funzioni e operatori, mentre quello a run-time prevede l’uso di classi derivate e funzioni virtuali (affrontate nel seguito).
  
 
== Ereditarietà ==
 
== Ereditarietà ==
  
 
== Polimorfismo ==
 
== Polimorfismo ==

Versione delle 17:43, 12 apr 2017

La programmazione orientata agli oggetti (OOP) consiste in un paradigma di programmazione basato sugli oggetti, ognuno delle quali è un'istanza di una classe, e queste classi sono tutte parte di una gerarchia di entità unite fra di loro da una relazione di ereditarietà. Ricapitolando:

  1. OOP utilizza un insieme di oggetti;
  2. ogni oggetto è istanza di una classe;
  3. ogni classe è legata alle altre attraverso una relazione detta eredità.

Le Classi

Alla base della programmazione ad oggetti c’è il concetto di "classe". Una classe è un costrutto utilizzato per la modellazione di entità, quindi per la creazione (istanziazione) di oggetti; quindi, un'istanza della classe si definisce “oggetto”.

All'interno di una classe si possono distinguere i seguenti elementi:

  • Attributo/i;
  • Metodo/i.

Concettualmente parlando, non cambia nulla rispetto a quanto imparato nella programmazione strutturata: il codice, la necessità di sviluppare una funzione o una procedura, ecc… rimane la stessa. Si immagini una classe come l’estensione di una “struct”, all’interno della quale è possibile andare a definire, oltre che alle semplici variabili, anche delle funzionalità. Gli “attributi”, o variabili membro, definiti all’interno di una classe, costituiscono lo stato della classe stessa. Un “metodo” di una classe, invece, definisce una funzionalità della classe stessa; i metodi servono a specificare il comportamento dell’entità (ovvero l’oggetto) di cui la classe è rappresentazione. Trattandosi di funzioni, un metodo può ritornare valori, oppure nulla (come le procedure o “funzioni void”). Un importante concetto associato ai metodi e agli attributi delle classi è la “visibilità”. In C++ si definiscono tre tipologie di attributi e metodi: • Public - gli attributi o i metodi sono accessibili dall’esterno della stessa classe; • Private - gli attributi o i metodi sono accessibili solo dalla stessa classe; • Protected - gli attributi o i metodi sono accessibili dalla stessa classe o da quelle derivate da essa. L’importanza di assegnare un tipo visibilità al metodo o all’attributo, risiede nel “controllo” dell’istanza associata alla classe (oggetto). Poter permettere ad una riga di codice esterna alla classe di modificare un attributo privato può portare a comportamenti non previsti del codice e quindi a crash del programma.


E’ buona prassi di programmazione, associare: • Public - metodi che possono essere richiamati all’esterno della classe; • Private - attributi della classe e metodi che lavorano con variabili della classe stessa senza generare un output “utile” all’esterno. Nell’ambito della programmazione orientata agli oggetti, è necessario definire tre importanti proprietà: • Incapsulamento – si basa sul principio dell’information hiding e permette di nascondere all’utente i dettagli implementativi di una classe; quindi l’utente interagisce con gli oggetti di una determinata classe attraverso le interfacce messe a disposizione dall’oggetto stesso. • Ereditarietà – la possibilità per un oggetto di acquisire le caratteristiche di un’altra classe; tramite le relazioni di generalizzazione/specializzazione, una superclasse definisce un concetto generale, che viene poi specializzato dalle sottoclassi. • Polimorfismo – la possibilità di utilizzare uno stesso nome per definire metodi diversi permettendo di avere accesso a diverse implementazioni di una funzione attraverso un solo nome (un’interfaccia, più metodi). Il polimorfismo può essere effettuato sia a compile-time che a run-time; il primo caso può essere realizzato tramite overload di funzioni e operatori, mentre quello a run-time prevede l’uso di classi derivate e funzioni virtuali (affrontate nel seguito).

Ereditarietà

Polimorfismo