Programmazione Orientata agli Oggetti (OOP): differenze tra le versioni
Riga 1: | Riga 1: | ||
− | + | 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: | |
− | + | # 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”. | ||
− | + | 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à == | == 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:
- 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”.
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).