Programmazione orientata agli oggetti: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
fix È |
mNessun oggetto della modifica Etichette: Modifica da mobile Modifica da applicazione mobile Modifica da applicazione Android App full source |
||
(23 versioni intermedie di 10 utenti non mostrate) | |||
Riga 1:
{{F|programmazione|febbraio 2013}}
{{NN|informatica|gennaio 2024}}
In [[informatica]], la '''programmazione orientata agli oggetti''' (in [[Lingua inglese|inglese]] ''object-oriented programming'', in [[acronimo]] '''OOP'''), a volte chiamata semplicemente '''programmazione ad 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. È 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 a oggetti è quello delle [[Interfaccia grafica|interfacce grafiche]].▼
▲In [[informatica]], la '''programmazione orientata agli oggetti''' (
Per "scambio di messaggi" s'intende la capacità degli oggetti di chiamare i metodi pubblici di altri oggetti, per esempio passandogli dati da elaborare e ricevendo il risultato della loro elaborazione. La OOP è 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 a oggetti è quello delle [[Interfaccia grafica|interfacce grafiche]].
Tra gli altri vantaggi della programmazione orientata agli oggetti:
*
* permette una più facile gestione e manutenzione di progetti di grandi dimensioni;
* l'organizzazione del [[codice sorgente|codice]] sotto forma di [[Classe (informatica)|classi]] favorisce la [[Modularità (informatica)|modularità]] e il [[riuso di codice]].
== 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).
== Descrizione ==
La programmazione
La parte del programma che fa uso di un oggetto si chiama
Un linguaggio di programmazione è definito
* [[#Ereditarietà|ereditarietà]]
* 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.
▲L<nowiki>'</nowiki>'''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.
▲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; nel tempo di esecuzione tale client potrà attivare comportamenti diversi senza conoscere a priori il tipo specifico dell'oggetto che gli viene dato in ingresso.
=== Classi ===
Riga 36 ⟶ 35:
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 da zero
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.
Riga 45 ⟶ 44:
=== Oggetti ===
{{vedi anche|Oggetto (informatica)}}
Un oggetto è una istanza di una classe. Esso è dotato di tutti gli attributi e i metodi definiti dalla classe,
Inviare un messaggio
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à singola; viceversa, si parla di eredità multipla. Alcuni linguaggi (tra gli altri, Java, Smalltalk) forniscono supporto esclusivo all'ereditarietà singola. Altri (C++, Python) prevedono anche l'ereditarietà multipla.
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 a ''runtime'' (invece che al momento della [[compilatore|compilazione]]). Questa funzionalità è detta ''
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 <
<syntaxhighlight lang="java" line="1">
void metodo(int input) {
Classe1 c;
Riga 115 ⟶ 114:
</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 [[C sharp|C#]], tramite una conversione automatica chiamata
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 ([[problema della classe base fragile]]).
Riga 134 ⟶ 133:
== 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}}
Riga 144 ⟶ 152:
* [[Copia di un oggetto]]
* [[Unified Modeling Language]]
== Altri progetti ==
{{Interprogetto|preposizione=sulla}}
== Collegamenti esterni ==
* {{Collegamenti esterni}}
* {{FOLDOC|object-oriented programming|object-oriented programming}}
* {{cita web
|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}}
|