Programmazione Orientata agli Oggetti (OOP)

Da Bioingegneria Elettronica e Informatica.

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