Programmazione orientata agli oggetti: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
→Collegamenti esterni: Creazione link con il Thesaurus del Nuovo Soggettario |
→Voci correlate: Nuova voce correlata a scopo disorfanizzazione. |
||
(73 versioni intermedie di 49 utenti non mostrate) | |||
Riga 1:
{{F|programmazione|febbraio 2013}}
{{NN|informatica|gennaio 2024}}
In [[informatica]] la '''[[Programmazione (informatica)|programmazione]] orientata agli oggetti''' ('''OOP''', '''O'''bject '''O'''riented '''P'''rogramming) è un [[paradigma di programmazione]] che permette di definire [[Oggetto (informatica)|oggetti]] [[software]] in grado di interagire gli uni con gli altri attraverso lo scambio di messaggi. È particolarmente adatta nei contesti in cui si possono definire delle relazioni di interdipendenza tra i concetti da modellare (contenimento, uso, specializzazione). Un ambito che più di altri riesce a sfruttare i vantaggi della programmazione ad oggetti è quello delle [[Interfaccia grafica|interfacce grafiche]].▼
In [[informatica]], la '''programmazione orientata agli oggetti''' ({{Inglese|object-oriented programming}}, in [[acronimo]] '''OOP'''), a volte chiamata semplicemente '''programmazione a oggetti''', è un [[paradigma di programmazione]] che permette di definire [[Oggetto (informatica)|oggetti]] [[software]] in grado di interagire gli uni con gli altri attraverso lo scambio di messaggi.
Tra gli altri vantaggi della programmazione orientata agli oggetti:▼
*fornisce un supporto naturale alla modellazione [[software]] degli oggetti del mondo reale o del modello astratto da riprodurre▼
*permette una più facile gestione e manutenzione di progetti di grandi dimensioni▼
*l'organizzazione del [[codice sorgente|codice]] sotto forma di classi favorisce la [[modularità]] e il [[riuso di codice]]▼
▲
La programmazione ad oggetti prevede di raggruppare in una zona circoscritta del [[codice sorgente]] (chiamata ''[[#Classi|classe]]''), la dichiarazione delle [[struttura dati|strutture dati]] e delle [[funzione (informatica)|procedure]] che operano su di esse. Le classi, quindi, costituiscono dei modelli astratti, che a [[tempo di esecuzione]] vengono invocate per istanziare o creare [[#Oggetti|oggetti]] software relativi alla classe invocata. Questi ultimi sono dotati di ''attributi'' (dati) e ''[[Metodo (programmazione)|metodi]]'' (procedure) secondo quanto definito/dichiarato dalle rispettive classi.▼
▲Tra gli altri vantaggi della programmazione orientata agli oggetti:
La parte del programma che fa uso di un oggetto si chiama ''client''.▼
▲* fornisce un supporto naturale alla modellazione [[software]] degli oggetti del mondo reale o del modello astratto da riprodurre;
▲* permette una più facile gestione e manutenzione di progetti di grandi dimensioni;
Un linguaggio di programmazione è definito ''ad oggetti'' quando permette di implementare tre meccanismi usando la sintassi nativa del linguaggio:<ref>Questi meccanismi possono essere simulati anche nei linguaggi che non sono considerati ad oggetti, a patto di adottare altri costrutti e di rispettare determinate convenzioni durante la scrittura del testo del programma.</ref>▼
▲* l'organizzazione del [[codice sorgente|codice]] sotto forma di [[Classe (informatica)|classi]] favorisce la [[Modularità (informatica)|modularità]] e il [[riuso di codice]].
* [[#Ereditarietà|ereditarietà]]▼
L'incapsulamento consiste nella separazione della cosiddetta ''[[Interfaccia (informatica)#Interfaccia nella programmazione orientata agli oggetti|interfaccia]]'' di una classe dalla corrispondente ''implementazione'', in modo che i ''client'' di un oggetto di quella classe possano utilizzare la prima, ma non la seconda.▼
L'ereditarietà permette essenzialmente di definire delle classi a partire da altre già definite.▼
Il polimorfismo permette di scrivere un ''client'' che può servirsi di oggetti di classi diverse, ma dotati di una stessa [[Interfaccia (informatica)#Interfaccia nella programmazione orientata agli oggetti|interfaccia]] comune; a tempo di esecuzione, quel client attiverà comportamenti diversi senza conoscere a priori il tipo specifico dell'oggetto che gli viene passato.▼
== Storia ==
Il concetto di
I costrutti sintattici che permettono di definire una classe, nei linguaggi a oggetti, possono essere visti come un supporto strutturato per realizzare i dati astratti.
Il primo linguaggio di programmazione orientato agli oggetti fu il [[Simula]] (
Linguaggi che supportano solo il paradigma di programmazione orientata agli oggetti sono Smalltalk ed [[Eiffel (linguaggio)|Eiffel]].
Più spesso si incontra una realizzazione non esclusiva del paradigma di programmazione orientata agli oggetti, come in [[C++]], [[Java (linguaggio di programmazione)|Java]], [[Delphi]], [[Python]], [[C sharp|C#]], [[Visual Basic .NET]], [[Perl]], [[PHP]] (a partire dalla versione 4).
==
▲La programmazione
▲Un linguaggio di programmazione è definito
▲
▲
▲
* Astrazione: Si tratta del processo di identificazione degli aspetti essenziali di una forma o concetto, astratti dalle specifiche realizzazioni. In OOP, significa definire le interfacce separate dalle implementazioni, consentendo al programmatore di lavorare con concetti ad alto livello senza preoccuparsi dei dettagli.
=== Classi ===
{{vedi anche|Classe (informatica)}}
Le classi definiscono dei [[
La classe è composta da:
*
*
Un paragone (impreciso) con la [[matematica]] è il seguente: si può pensare che una classe definisca un [[insieme]] in modo intensivo, ovvero indicandone le caratteristiche invece che elencandone gli elementi, e che gli oggetti siano gli elementi di quell'insieme. Tuttavia, in matematica, il [[cardinalità|numero degli elementi]] è una caratteristica intrinseca dell'insieme stesso, e risulta definito nel momento in cui si definisce l'insieme, mentre in programmazione è possibile istanziare una classe un numero di volte arbitrario (teoricamente
In altri termini, una classe è paragonabile al [[progetto]] di un'[[infrastruttura]] che può poi essere messa in opera/esercizio ovvero realizzata o meno con l'istanziazione dei suoi oggetti tutti con le medesime caratteristiche, ovvero gli attributi (con valori diversi), su cui opereranno i metodi o funzioni.
=== Oggetti ===
{{vedi anche|Oggetto (informatica)}}
Un
Dal punto di vista del calcolatore, ogni oggetto è identificato da una certa [[memoria RAM|zona di memoria]], nella quale sono memorizzati gli
Il codice eseguibile del programma accede a tale zona di memoria sempre e solo secondo le modalità definite dalla classe.<br />
Secondo il principio noto come ''[[#Incapsulamento|information hiding]]'', l'accesso ai campi di un oggetto deve essere permesso solo tramite metodi invocati su quello stesso oggetto. Il vantaggio principale è che il controllo completo sullo stato interno viene assegnato
== Incapsulamento ==
{{Vedi anche|Incapsulamento (informatica)}}
L
== Ereditarietà ==
{{Vedi anche|Ereditarietà (informatica)}}
Il meccanismo dell
Quando una classe eredita da una sola superclasse si parla di eredità
Alcuni linguaggi tipizzati (Java, C#) prevedono l'ereditarietà delle interfacce, oltre che delle classi.
Riga 68 ⟶ 67:
; Esempio
Se nel programma esiste già una classe <
=== Sottotipizzazione ===
{{vedi anche|Sottotipo (informatica)}}
Sebbene concettualmente esistano delle differenze ben marcate, il meccanismo di eredità fra classi (''subclassing''), attraverso il meccanismo del polimorfismo per inclusione, permette nei linguaggi
Secondo il [[principio di sostituzione di Liskov]], un tipo <
Con gli opportuni accorgimenti è possibile creare una relazione di classe-sottoclasse che rispetti anche i vincoli della relazione tipo-sottotipo. Da un punto di vista sintattico, ciò richiede che tutti i metodi della superclasse siano presenti nella sottoclasse, e che le rispettive
Tuttavia, il rispetto delle restrizioni sintattiche non è sufficiente, da solo, ad assicurare il rispetto della condizione di Liskov: la [[overriding|ridefinizione dei metodi]] o la {{chiarire|riassegnazione degli attributi}}, infatti, potrebbe compromettere la compatibilità in tempo di esecuzione.
In molti linguaggi, nella definizione di una sottoclasse, si può decidere di eliminare o cambiare le proprietà di accesso a un metodo ereditato. In tal caso, l'operazione di ''subclassing'' non corrisponde a quella di ''subtyping''. Alcuni linguaggi a oggetti, in particolare [[Sather]], dividono esplicitamente a livello sintattico ''subclassing'' e ''subtyping''.
In linguaggi con [[tipizzazione statica]] ed [[tipizzazione esplicita|esplicita]], la sottotipizzazione viene supportata attraverso il polimorfismo per inclusione delle sottoclassi: una stessa variabile può fare riferimento
== Polimorfismo ==
{{Vedi anche|Polimorfismo (informatica)}}
Nella programmazione
=== Binding dinamico o polimorfismo orizzontale ===
{{vedi anche|Binding}}
Il [[polimorfismo (informatica)|polimorfismo]] è particolarmente utile quando la versione del metodo da eseguire viene scelta sulla base del tipo di oggetto effettivamente contenuto in una variabile
Se una variabile di tipo
Per ritornare all'esempio precedente, si suppone che un
Il supporto al ''binding
Il supporto ''runtime'' di una chiamata di metodo polimorfa richiede che a una variabile polimorfa venga associato un [[metadato]] implicito che contiene il tipo del dato contenuto nella variabile in un dato momento, oppure la tabella delle funzioni polimorfe.
==== Esempio - Binding dinamico ====
Si supponga di avere il seguente pseudo codice in Java dove
<
void metodo(int input) {
Classe1 c;
Riga 113 ⟶ 112:
c.faiQualcosaDiImportante();
}
</syntaxhighlight>
Si noti che
=== Polimorfismo verticale ===
Riga 124 ⟶ 123:
Alcuni meccanismi inclusi nella gestione degli oggetti causano un overhead in termini di tempo e memoria, che in determinate situazioni può portare a problemi di efficienza.
Alcuni linguaggi come [[Java (linguaggio di programmazione)|Java]] e [[C++]] preferiscono un approccio ibrido rispetto all'OOP "puro", ad esempio del linguaggio [[Smalltalk]], prevedendo che alcuni tipi di dati primitivi non siano considerati come oggetti. I vantaggi di quest'approccio sono particolarmente evidenti in presenza di computazioni numeriche; di contro, ogni volta che è necessario un oggetto in luogo di un tipo primitivo è necessario ricorrere
Tale wrapper può anche essere dato automaticamente dal linguaggio stesso, come nel caso del Java o del
Altre critiche all'OOP riguardano la maggiore complessità strutturale rispetto ai linguaggi procedurali, a fronte delle limitazioni introdotte per seguire il paradigma a oggetti. Esistono inoltre alcune carenze concettuali (in particolare riguardo alla sottotipizzazione), che aggiunte alle diverse implementazioni nei linguaggi possono causare problemi al programmatore. Ad esempio il funzionamento in contesti polimorfi non è garantito quando i metodi vengano ridefiniti in una catena di eredità. Inoltre cambiare le definizioni nelle classi base può portare a introdurre errori in cascata nelle sottoclassi (
== Note ==
<references/>
== Bibliografia ==
* {{cita pubblicazione
|titolo = What is ‘‘Object-Oriented Programming’’? (1991 revised version)
|autore = [[Bjarne Stroustrup]]
|url = https://stroustrup.com/whatis.pdf
|editore = AT&T [[Bell Laboratories]]
|città = Murray Hill
|data = 1991
|lingua = en
}}
* {{RivistaVG|mc|101|272-275|11|1990|titolo=Introduzione alla programmazione orientata all'oggetto - Prima parte}}
* {{RivistaVG|mc|102|241-245|12|1990|titolo=Introduzione alla programmazione orientata all'oggetto - Seconda parte}}
== Voci correlate ==
* [[Progettazione orientata agli oggetti]]
* [[Programmazione basata sull'interfaccia]]
* [[Programmazione ad eventi]]
* [[Programmazione orientata agli aspetti]]
* [[Base di dati a oggetti]]
* [[Copia di un oggetto]]
* [[Unified Modeling Language]]
== Altri progetti ==
{{Interprogetto|preposizione=sulla}}
== Collegamenti esterni ==
* {{Collegamenti esterni}}
* {{FOLDOC|object-oriented programming|object-oriented programming}}
* {{
|url=https://www.html.it/guide/guida-programmazione-orientata-agli-oggetti/
|titolo = Guida programmazione orientata agli oggetti
|autore = Marco Altese
|anno = 2006
}}
{{Paradigmi di programmazione}}
|