Programmazione orientata agli oggetti: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Reverted to revision 201579 by Leofbrj (talk): Rv (TwinkleGlobal)
Etichetta: Annulla
TheRukk (discussione | contributi)
Uso di linguaggio più comprensibile senza conoscenze approfondite. Wikificato parzialmente.
 
Riga 1:
 
{{risorsa|tipo=lezione|materia1=Programmazione orientata agli oggetti}}
La '''programmazione orientata agli oggetti''' ('''OOP''', '''O'''bject '''O'''riented '''P'''rogramming) è un [[w:paradigma di programmazione|paradigma di programmazione]], che prevede di raggruppare in un'unica entità (la [[w:classe (informatica)|classe]]) sia le [[w:struttura dati|strutture dati]] che le [[w:funzione (informatica)|procedure]] (o funzioni) che operano su di esse, creando per l'appunto un "[[w:oggetto (informatica)|oggetto]]" software dotato di '''proprietà''' (dati) e '''metodi''' ([[w:funzione (informatica)|procedure]]) che operano sui dati dell'oggetto stesso.
 
La [[w:modularizzazione|modularizzazione]] di un programma viene realizzata progettando e realizzando il codice sotto forma di classi che interagiscono tra di loro. Un programma ideale, realizzato applicando i criteri dell'OOP, sarebbe completamente costituito da oggetti software ('''istanze''' di classi) che interagiscono gli uni con gli altri.
Riga 8:
 
==Storia==
Il concetto di '''classe''' può essere considerato l'erede del [[w:tipo di dato astratto|tipo di dato astratto]], una tendenza che si è sviluppata all'interno del paradigma della [[w:programmazione procedurale|programmazione procedurale]], tipica di linguaggi come il [[Linguaggio C|C]], secondo la quale un [[w:Modulo (programmazione)|modulo]] dovrebbe implementare un [[w:tipo di dato|tipo di dato]] definito dall'utente, con cui si possa interagire solo attraverso una [[w:interfaccia|interfaccia]] ben definita, che nasconda agli altri moduli i dettagli dell'implementazione, in modo che sia possibile modificarli contenendo gli effetti della modifica sul resto del programma. La classe può essere vista come il costrutto che permette di realizzare questa astrazione con un supporto strutturato da parte del linguaggio.
La classe può essere vista come il costrutto che permette di realizzare questa astrazione con un supporto strutturato da parte del linguaggio.
 
Il primo linguaggio di programmazione orientato agli oggetti fu il [[w:Simula|Simula]] ([[w:1967|1967]]), seguito negli [[w:Anni 1970|anni '70]] da [[w:Smalltalk|Smalltalk]] e da varie estensioni del [[w:Lisp|Lisp]]. Negli [[w:Anni 1980|anni '80]] sono state create estensioni orientate ad oggetti del linguaggio [[w:C (linguaggio)|C]] ([[w:C++|C++]], [[w:Objective C|Objective C]], e altri), e di altri linguaggi ([[w:Object Pascal|Object Pascal]]). Negli [[w:Anni 1990|anni '90]] è diventato il paradigma dominante, per cui gran parte dei linguaggi di programmazione erano o nativamente orientati agli oggetti o avevano una estensione in tal senso.
Oggi i linguaggi più usati tra quelli che supportano solo il paradigma di programmazione orientata agli oggetti sono Smalltalk ed [[w:Eiffel (linguaggio)|Eiffel]]. Tuttavia sono linguaggi in generale poco usati.
I linguaggi più usati sono invece quelli che supportano ''anche'' il paradigma di programmazione orientata agli oggetti, come [[w:C++|C++]], [[w:Java (linguaggio)|Java]], [[w:Delphi|Delphi]], [[w:Python|Python]], [[w:C sharp|C#]], [[w:Visual Basic .NET|Visual Basic .NET]], [[w:Perl|Perl]].
 
Oggi i linguaggi più usati tra quelli che supportano solo il paradigma di programmazione orientata agli oggetti sono Smalltalk ed [[w:Eiffel (linguaggio)|Eiffel]]. Tuttavia sono linguaggi in generale poco usati. I linguaggi più usati sono invece quelli che supportano ''anche'' il paradigma di programmazione orientata agli oggetti, come [[w:C++|C++]], [[w:Java (linguaggio)|Java]], [[w:Delphi|Delphi]], [[w:Python|Python]], [[w:C sharp|C#]], [[w:Visual Basic .NET|Visual Basic .NET]], [[w:Perl|Perl]].
Un linguaggio di programmazione per poter essere definito ''ad oggetti'' deve possedere le tre proprietà seguenti : Incapsulamento, Ereditarietà e Polimorfismo (''vedi sotto'').
 
Le tre proprietà principali del paradigma di programmazione ad oggetti, spesso dette anche ''pilastri'' sono:
 
* Incapsulamento
* Ereditarietà
* Polimorfismo
 
(''vedi sotto'')
 
==Classi==
Line 23 ⟶ 28:
Come tutti i costrutti che permettono di definire le strutture dati, una classe definisce un nuovo [[w:tipo di dato|tipo di dato]].
 
I membri di una classe sono:
I membri di una classe sono dati (esattamente come i membri di un [[w:Struttura dati#record o struct|record]]), chiamati '''attributi''', e '''metodi''', ovvero [[w:funzione (informatica)|procedure]], che operano su un oggetto.
 
I membri di una classe sono* dati (esattamente come i membri di un [[w:Struttura dati#record o struct|record]]), chiamati '''attributi''', e '''metodi''', ovvero [[w:funzione (informatica)|procedure]], che operano su un oggetto.;
Dal punto di vista matematico, una classe definisce un [[w:insieme|insieme]] in modo intensivo, ovvero definendone le caratteristiche invece che elencandone gli elementi. Se l'accesso agli attributi è ristretto ai soli membri della classe, le caratteristiche dell'insieme possono includere vincoli sui possibili valori che la [[w:tupla|tupla]] degli attributi può o non può assumere, e anche sulle possibili transizioni tra questi stati. Un oggetto può quindi essere visto come una [[w:macchina a stati finiti|macchina a stati finiti]].
* e '''metodi''', ovvero [[w:funzione (informatica)|procedure]], che operano su un oggetto.
 
Dal punto di vista matematico, una classe definisce un [[w:insieme|insieme]] in modo intensivo, ovvero definendone le caratteristiche invece che elencandone gli elementi. Se l'accesso agli attributi è ristretto aiè soliinoltre membripossibile della classe, le caratteristiche dell'insieme possono includerecreare vincoli sui possibili valori che la [[w:tupla|tupla]] degligli attributi puòpossono o non puòpuossono assumere, e anche sulle possibili transizioni tra questi stati. Un oggetto può quindi essere visto come una [[w:macchina a stati finiti|macchina a stati finiti]].
Una classe può dichiarare riservate una parte delle sue proprietà e/o dei suoi metodi, e riservarne l'uso a sé stesso e/o a particolari tipi di oggetti a lui correlati.
 
Una classe può dichiarare ''riservate'' una parte delle sue proprietà e/o dei suoi metodi, e riservarne l'uso a sé stesso e/o a particolari tipi di oggetti a lui correlati.
 
==Oggetti==
 
Un [[w:oggetto (informatica)|oggetto]] è una '''istanza''' di una classe. Un oggetto occupa memoria, la sua classe definisce come sono organizzati i dati (gli attributi) in questa memoria.
 
Ogni oggetto possiede tutti gli [[w:attributi|attributi]] definiti nella classe, ed essi hanno un valore, che può mutare durante l'esecuzione del programma come quello di qualsiasi [[w:variabile (informatica)|variabile]].
 
* mutare durante l'esecuzione del programma (in questo caso l'attributo è definito '''mutabile''')
* o rimanere fissi dalla creazione alla distruzione dell'oggetto (in questo caso l'attributo è definito '''immutabile''').
 
Un oggetto è immutabile se e solo se tutti i suoi attributi sono immutabili.
 
IlUno paradigmadei OOPpilastri suggeriscedel unparadigma principio noto come [[w:informationOOP hiding|informationè hiding]]l'incapsulamento che indicaimpone che si debba accedere agli attributi dell'istanza solo tramite metodi invocati su quello stesso oggetto.
Ogni oggetto possiede tutti gli [[w:attributi|attributi]] definiti nella classe, ed essi hanno un valore, che può mutare durante l'esecuzione del programma come quello di qualsiasi [[w:variabile (informatica)|variabile]].
Il paradigma OOP suggerisce un principio noto come [[w:information hiding|information hiding]] che indica che si debba accedere agli attributi dell'istanza solo tramite metodi invocati su quello stesso oggetto.
 
Sintatticamente, i metodi di una classe vengono invocati "su" un particolare oggetto, e ricevono come parametro implicito l'oggetto su cui sono stati invocati. Questo parametro normalmente può essere referenziato esplicitamente; per esempio, a tale scopo in [[w:C++|C++]], in [[w:Linguaggio di programmazione Java|Java]], e in [[w:C_sharp|C#]] si usa la parola chiave <code>this</code>, mentre in [[w:Smalltalk|Smalltalk]], in [[w:Objective_C|Objective-C]], [[w:Python|Python]] e in [[w:Ruby|Ruby]] si usa la parola-chiave <code>self</code>.
Questo parametro normalmente può essere referenziato esplicitamente; per esempio, a tale scopo in [[w:C++|C++]], in [[w:Linguaggio di programmazione Java|Java]], e in [[w:C_sharp|C#]] si usa la parola chiave '''this''', mentre in [[w:Smalltalk|Smalltalk]], in [[w:Objective_C|Objective-C]], [[w:Python|Python]] e in [[w:Ruby|Ruby]] si usa la parola-chiave '''self'''.
 
Gli oggetti effettivamente creati sono membri dell'insieme definito dalla loro classe.