Object-Oriented Programming (OOP)
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
Romina EramoRomina EramoRomina EramoRomina Eramo
http://www.di.univaq.it/romina.eramo/tlp
Roadmap
• Introduzione ai linguaggi di programmazione
• Principi base del paradigma OO
– Astrazione
– Oggetto e Classe
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
– Oggetto e Classe
– Incapsulamento e Information Hiding
– Modularità
– Ereditarietà
– Polimorfismo
• Java vs C++
I linguaggi di programmazione
• La programmazione può essere definita come la disciplina che demanda al calcolatore elettronico la soluzionesoluzionesoluzionesoluzione di un determinato problemaproblemaproblemaproblema
• Un linguaggio di programmazione è un insieme di
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
• Un linguaggio di programmazione è un insieme di parole, codici, e simboli che permettono al programmatore di dare istruzioni al istruzioni al istruzioni al istruzioni al calcolatorecalcolatorecalcolatorecalcolatore
• Diversi linguaggi di programmazione sono stati concepiti nel corso degli anni, ognuno con le proprie regole, o sintassi per scrivere tali istruzioni
...verso i linguaggi ad alto livello
• Linguaggio macchina
– linguaggio in cui sono scritti programmi direttamente eseguibili dal calcolatore
• Linguaggio ad alto livello
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
• Linguaggio ad alto livello
– linguaggio indipendente dall'hardware e più "facile" da utilizzare per il programmatore umano
– richiede una traduzione in linguaggio macchina
• la compilazione: traduzione che avviene una sola volta
• l’interpretazione: traduzione in tempo reale
...i livelli di astrazioni
• Tutti i linguaggi di programmazione forniscono astrazioniastrazioniastrazioniastrazioni– in linguaggio macchinalinguaggio macchinalinguaggio macchinalinguaggio macchina sono definite l'insieme di istruzioni
fondamentali che un processore è in grado di compiere e in cui i codici di programmi da eseguire devono essere tradotti
– i linguaggi a più alto livello linguaggi a più alto livello linguaggi a più alto livello linguaggi a più alto livello si ottengono come semplice codifica a partire dal linguaggio macchina in un crescendo di astrazione
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
partire dal linguaggio macchina in un crescendo di astrazione
• La complessità dei problemi che si è in grado di risolvere è direttamente correlata al genere e alla qualità dell’astrazione considerata– Il linguaggio assembler è una piccola astrazione della macchina
sottostante
– I cosiddetti linguaggi “imperativi” (Fortran, BASIC, C) sono astrazioni del linguaggio assembler anche se comunque continuano ad imporre di pensare in termini di struttura del calcolatore invece che della struttura del problema che si sta risolvendo
...i livelli di astrazioni
• Tocca al programmatore stabilire
l’associazione fra il modello della macchina
(nello “spazio delle soluzioni”) e il modello del
problema che viene risolto (nello “spazio dei
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
problema che viene risolto (nello “spazio dei
problemi”)
• Anziché modellare una macchina per risolvere
il problema si può pensare di modellare il
problema
Paradigmi di programmazione
LinguaggioLinguaggioLinguaggioLinguaggio Modello Modello Modello Modello computazionalecomputazionalecomputazionalecomputazionale
In cosa consisteIn cosa consisteIn cosa consisteIn cosa consiste un programmaun programmaun programmaun programma Esempi Esempi Esempi Esempi
ImperativoImperativoImperativoImperativo Cambiamenti di stato della memoria della macchina
Sequenza di assegnazioni cheproducano lo stato finale (soluzione del problema)
Pascal, C
FunzionaleFunzionaleFunzionaleFunzionale Definizione edapplicazione di
Combinazioni di funzioni valutate per restituire un certo output
Lisp
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
applicazione di funzioni
per restituire un certo output
Logico Logico Logico Logico Predicati logici come specifiche eseguibili
Sequenza di asserzioni di fatti e regole eseguite per verificare il soddisfacimento del goal
Prolog
Ad oggettiAd oggettiAd oggettiAd oggetti Modello ad oggetti Progettazione e realizzazione di codice sotto forma di classi che interagiscono tra di loro
Java, C++
Storia dei linguaggi di programmazione
• FortranFortranFortranFortran (Formula translator)– 1954-1956 da John Backus presso IBM
ForTranForTranForTranForTran CobolCobolCobolCobolLispLispLispLispAlgolAlgolAlgolAlgol
BASICBASICBASICBASICSIMULA SIMULA SIMULA SIMULA 67676767
PascalPascalPascalPascalCCCCSmalltalkSmalltalkSmalltalkSmalltalk
JavaJavaJavaJavaModulaModulaModulaModula----2222AdaAdaAdaAdaC ++C ++C ++C ++
anni ‘50anni ‘50anni ‘50anni ‘50 anni ‘anni ‘anni ‘anni ‘60606060 anni ‘65anni ‘65anni ‘65anni ‘65 anni ‘70anni ‘70anni ‘70anni ‘70 anni ‘80anni ‘80anni ‘80anni ‘80 anni ‘95anni ‘95anni ‘95anni ‘95
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
– 1954-1956 da John Backus presso IBM– espressioni esprimibili per mezzo di notazioni matematiche ordinarie
• i+2*j)– primo linguaggio ad introdurre le variabili, cicli, procedure, etc.– nessun supporto per ricorsione e gestione implicita della memoria
• CobolCobolCobolCobol– 1959 da Grace Murray Hopper– applicazioni finanziarie– sintassi definita in modo da rendere la scrittura di istruzioni simile alla
scrittura di frasi nel linguaggio naturale• e.g., “add 1 to x giving y” (y = x+1)
• LispLispLispLisp– 1965 da John McCarthy
Storia dei linguaggi di programmazioneForTranForTranForTranForTran CobolCobolCobolCobol
LispLispLispLispAlgolAlgolAlgolAlgol
BASICBASICBASICBASICSIMULA 67SIMULA 67SIMULA 67SIMULA 67
PascalPascalPascalPascalCCCCSmalltalkSmalltalkSmalltalkSmalltalk
JavaJavaJavaJavaModulaModulaModulaModula----2222AdaAdaAdaAdaC ++C ++C ++C ++
anni ‘50anni ‘50anni ‘50anni ‘50 anni ‘60anni ‘60anni ‘60anni ‘60 anni ‘65anni ‘65anni ‘65anni ‘65 anni ‘anni ‘anni ‘anni ‘70707070 anni ‘80anni ‘80anni ‘80anni ‘80 anni ‘95anni ‘95anni ‘95anni ‘95
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
– 1965 da John McCarthy– funzioni high-order– garbage collection– Successori del LISP: Miranda, ML, Haskell anche se non particolarmente usati
• AlgolAlgolAlgolAlgol– 1958-1960 da un comitato internazionale di informatici– un migliore sistema dei tipi– prime strutture dati
• Entrambi hanno ricorsione, funzioni e procedure
• BASIC 1964 BASIC 1964 BASIC 1964 BASIC 1964 KemenyKemenyKemenyKemeny e e e e KurtzKurtzKurtzKurtz– Il primo linguaggio di programmazione pensato per uso personale
Storia dei linguaggi di programmazioneForTranForTranForTranForTran CobolCobolCobolCobol
LispLispLispLispAlgolAlgolAlgolAlgol
BASICBASICBASICBASICSIMULA 67SIMULA 67SIMULA 67SIMULA 67
PascalPascalPascalPascalCCCCSmalltalkSmalltalkSmalltalkSmalltalk
JavaJavaJavaJavaModulaModulaModulaModula----2222AdaAdaAdaAdaC ++C ++C ++C ++
anni ‘50anni ‘50anni ‘50anni ‘50 anni ‘60anni ‘60anni ‘60anni ‘60 anni ‘65anni ‘65anni ‘65anni ‘65 anni ‘70anni ‘70anni ‘70anni ‘70 anni ‘anni ‘anni ‘anni ‘80808080 anni ‘95anni ‘95anni ‘95anni ‘95
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
– Il primo linguaggio di programmazione pensato per uso personale– Semplice da imparare anche se limitato– Le versioni correnti del linguaggio non sono così “basic” e semplici da
imparare
• SIMULA 67SIMULA 67SIMULA 67SIMULA 67– Estensione di Algol 60 progettato per la simulazione di processi concorrenti– Introduce i concetti base dell’object oriented: classe ed incapsulamento– Predecessore di Smalltalk e C++
CSI 3125, History, page 10
• PascalPascalPascalPascal– Successore di Algol 60.
Storia dei linguaggi di programmazioneForTranForTranForTranForTran CobolCobolCobolCobol
LispLispLispLispAlgolAlgolAlgolAlgol
BASICBASICBASICBASICSIMULA 67SIMULA 67SIMULA 67SIMULA 67
PascalPascalPascalPascalCCCCSmalltalkSmalltalkSmalltalkSmalltalk
JavaJavaJavaJavaModulaModulaModulaModula----2222AdaAdaAdaAdaC ++C ++C ++C ++
anni ‘anni ‘anni ‘anni ‘50505050 anni ‘60anni ‘60anni ‘60anni ‘60 anni ‘65anni ‘65anni ‘65anni ‘65 anni ‘70anni ‘70anni ‘70anni ‘70 anni ‘80anni ‘80anni ‘80anni ‘80 anni ‘anni ‘anni ‘anni ‘95959595
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
– Successore di Algol 60.– Ottimo linguaggio per introdurre la programmazione strutturata– Un buon primo linguaggio da imparare
• ModulaModulaModulaModula----2222– Successore di Pascal – Meccanismi per gestire la concorrenza (più processi in parallelo)
• AdaAdaAdaAda– Progettato per supportare in maniera efficace la concorrenza– Ci sono due standard: Ada 83 (l’originale), and Ada 95
CSI 3125, History, page 11
• CCCC– Il linguaggio di implementazione di Unix
Storia dei linguaggi di programmazioneForTranForTranForTranForTran CobolCobolCobolCobol
LispLispLispLispAlgolAlgolAlgolAlgol
BASICBASICBASICBASICSIMULA 67SIMULA 67SIMULA 67SIMULA 67
PascalPascalPascalPascalCCCCSmalltalkSmalltalkSmalltalkSmalltalk
JavaJavaJavaJavaModulaModulaModulaModula----2222AdaAdaAdaAdaC ++C ++C ++C ++
anni ‘50anni ‘50anni ‘50anni ‘50 anni ‘60anni ‘60anni ‘60anni ‘60 anni ‘65anni ‘65anni ‘65anni ‘65 anni ‘70anni ‘70anni ‘70anni ‘70 anni ‘anni ‘anni ‘anni ‘80808080 anni ‘95anni ‘95anni ‘95anni ‘95
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
– Il linguaggio di implementazione di Unix– Pericoloso se non usato opportunamente: non raccomandato per
i programmatori inesperti– Relativamente di basso livello
• SmalltalkSmalltalkSmalltalkSmalltalk– Linguaggio di programmazione object-oriented più pulito di
Java e molto più pulito di C++– Viene fornito con un’interfaccia grafica ed un ambiente di
programmazione integrato
CSI 3125, History, page 12
• C++C++C++C++– Estensione object-oriented del linguaggio imperativo C– Sintassi complicata con difficile semantica
Storia dei linguaggi di programmazioneForTranForTranForTranForTran CobolCobolCobolCobol
LispLispLispLispAlgolAlgolAlgolAlgol
BASICBASICBASICBASICSIMULA 67SIMULA 67SIMULA 67SIMULA 67
PascalPascalPascalPascalCCCCSmalltalkSmalltalkSmalltalkSmalltalk
JavaJavaJavaJavaModulaModulaModulaModula----2222AdaAdaAdaAdaC ++C ++C ++C ++
anni ‘50anni ‘50anni ‘50anni ‘50 anni ‘anni ‘anni ‘anni ‘60606060 anni ‘65anni ‘65anni ‘65anni ‘65 anni ‘70anni ‘70anni ‘70anni ‘70 anni ‘80anni ‘80anni ‘80anni ‘80 anni ‘anni ‘anni ‘anni ‘95959595
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
– Sintassi complicata con difficile semantica– Molto richiesto
• JavaJavaJavaJava– Rielaborazione del C++– Full object orientation (anche se non ai livelli di Smalltalk)– Progettato per la programmazione Internet programming, anche se general-
purpose– Solitamente è considerato essere lento– Forse il prossimo standard de-facto
CSI 3125, History, page 13
• Linguaggi di ScriptingLinguaggi di ScriptingLinguaggi di ScriptingLinguaggi di Scripting
Storia dei linguaggi di programmazioneForTranForTranForTranForTran CobolCobolCobolCobol
LispLispLispLispAlgolAlgolAlgolAlgol
BASICBASICBASICBASICSIMULA 67SIMULA 67SIMULA 67SIMULA 67
PascalPascalPascalPascalCCCCSmalltalkSmalltalkSmalltalkSmalltalk
JavaJavaJavaJavaModulaModulaModulaModula----2222AdaAdaAdaAdaC ++C ++C ++C ++
anni ‘50anni ‘50anni ‘50anni ‘50 anni ‘anni ‘anni ‘anni ‘60606060 anni ‘65anni ‘65anni ‘65anni ‘65 anni ‘70anni ‘70anni ‘70anni ‘70 anni ‘80anni ‘80anni ‘80anni ‘80 anni ‘95anni ‘95anni ‘95anni ‘95
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
– Text processing:• Perl• Python
– Web programming• JavaScript• PHP
CSI 3125, History, page 14
Computer Languages History
• Per maggiori dettagli: http://www.levenez.com/lang/
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
Jump star to OOP
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
Perchè OOP?
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
Perchè OOP?
Portare lo sviluppo software vicino alla vita reale
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
vita reale
Nella vita reale abbiamo a chefare con oggetti.Vogliamo trattare con il softwareallo stesso modo.
Perchè OOP?
Separazione di concetti
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
Nella vita reale non cipreoccupiamo di come un oggettoè fatto o di cosa contiene. Cilimitiamo ad usarlo.
Perchè OOP?
Le componenti sono replicabili
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
Nella vita reale le componenticon funzionalità e specifichesimili sono replicabili.
Perchè OOP?
Sviluppo di componenti in parti distinte
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
parti distinte
Nella vita reale gli sviluppatori di unacomponente non si preoccupano dell’interosistema, o di come le sue componenti sarannousate nell’intero sistema.
Perchè OOP?
Fornire la struttura e realizzare prototipi
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
Nella vita reale pensiamo alla strutturae produciamo modelli software esviluppiamo prototipi prima di ottenereun'istanza effettiva.
Perchè OOP?
Usa e getta
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
Nella vita reale usiamo lecomponenti e una volta cheabbiamo finito con esse lescartiamo.
Perchè OOP?
Riuso di componenti
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
Nella vita reale la stessa componentepuò essere usata (riusata) per unamolteplicità di sistemi.
Perchè OOP?
Sistema facile da capire
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
Nella vita reale possiamo comprendere sistemicomplessi adottando un approccio top-down obotton-up. Questo ci conduce verso piccoli oggetti.
Cosa è OOP?
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
Cosa è OOP?
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
L’ OOP (Object-oriented programming) è un paradigma di programmazione organizzato attorno ad “oggetti” “oggetti” “oggetti” “oggetti” piuttosto che “azioni” “azioni” “azioni” “azioni” e “dati” “dati” “dati” “dati” piuttosto che ““““logica”logica”logica”logica”
• L’OOP prevede di raggruppare in un’unica entità “classeclasseclasseclasse” sia le strutture dati che le procedure che operano su di esse, creando un “oggetto” “oggetto” “oggetto” “oggetto” software dotato di proprietà
Cosa è OOP?
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
“oggetto” “oggetto” “oggetto” “oggetto” software dotato di proprietà (datidatidatidati) e metodi (procedureprocedureprocedureprocedure) che operano sui dati dell’oggetto stesso
Principi base del paradigma OO
• Astrazione
• Incapsulamento & Information Hiding
• Modularità
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
• Gerarchia
• Polimorfismo
Astrazione
“Qualsiasi modello include gli aspetti più importanti o essenziali di qualcosa mentre ignora i dettagli meno importanti, immateriali. Il risultato è di rimuovere le
differenze ed enfatizzare gli aspetti comuni” [Dizionario di Object Technology – Firesmith, Eykholt 1995]
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
[Dizionario di Object Technology – Firesmith, Eykholt 1995]
“Un’astrazione deve denotare le caratteristiche essenziali di un oggetto contraddistinguendolo da tutti gli altri
oggetti e fornendo, in tal modo, dei confini concettuali ben precisi relativamente alla prospettiva dell’osservatore”
[Grady Booch]
Astrazione
• Utilizzata per gestire gestire gestire gestire la complessità la complessità la complessità la complessità di un programma concentrandosi sulle caratteristiche essenziali di un’entità che la distingue dalle altre
• Applicata per decomporre sistemi software complessi in componenti più piccoli e semplici componenti più piccoli e semplici componenti più piccoli e semplici componenti più piccoli e semplici che possono essere gestiti con maggiore facilità ed efficienza
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
gestiti con maggiore facilità ed efficienza
• E’ dipendente dal dominio e dalla prospettiva, cioè quello che è importante in un contesto potrebbe non esserlo in un altro– per esempio, la macchina per un venditore è diversa da quella di
un progettista
• OO modella il sistema utilizzando l’astrazione (es. classi)
Astrazione
• L’approccio orientato agli oggetti mette a disposizione strumenti con i quali il programmatore può rappresentare elementi nello spazio dei problemirappresentare elementi nello spazio dei problemirappresentare elementi nello spazio dei problemirappresentare elementi nello spazio dei problemi
• La rappresentazione è sufficientemente generalizzata da non vincolare il programmatore a occuparsi soltanto di un determinato tipo di problemideterminato tipo di problemideterminato tipo di problemideterminato tipo di problemi
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
da non vincolare il programmatore a occuparsi soltanto di un determinato tipo di problemideterminato tipo di problemideterminato tipo di problemideterminato tipo di problemi
• Gli oggetti sono elementi che si trovano nello spazio spazio spazio spazio dei problemidei problemidei problemidei problemi e le loro rappresentazioni nello spazio spazio spazio spazio delle soluzionidelle soluzionidelle soluzionidelle soluzioni
• L’OOP permette quindi di descrivere il problema nei suoi termini propri, invece che nei termini del computer sul quale verrà computata la soluzione
Cos’è una classe
• Una classe rappresenta una particolare categoria di categoria di categoria di categoria di oggettioggettioggettioggetti e definisce un tipo di dato tipo di dato tipo di dato tipo di dato per un determinato oggetto ad essa appartenente
• Una classe è caratterizzata da proprietàproprietàproprietàproprietà (attributi),
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
• Una classe è caratterizzata da proprietàproprietàproprietàproprietà (attributi), comportamentocomportamentocomportamentocomportamento (operazioni), relazioni relazioni relazioni relazioni e semantica semantica semantica semantica comuni agli oggetti che la classe descrive
• Seguendo il principio OO dell’astrazione:
– Enfatizza caratteristiche rilevanti
– Sopprime le altre caratteristiche
Esempio di classe
• Nome– Corso
• Proprietà– Nome, Luogo, Durata, Crediti, Inizio, Fine
• Comportamento
Course
namelocationdurationstartDate
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
• Comportamento– Aggiunta studente
– Cancellazione studente
– Verifica se è pieno
startDateendDate
addStudent()dropStudent()isFull()
Caratteristiche di un approccio OO
Alan Kay ha riepilogato 5 caratteristiche essenziali di Smalltalk (primo linguaggio OOP di successo)
1. Ogni cosa è un oggetto
2. Un programma è un insieme di oggetti che si dicono l’un l’altro che cosa fare inviandosi messaggiinviandosi messaggiinviandosi messaggiinviandosi messaggi
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
l’un l’altro che cosa fare inviandosi messaggiinviandosi messaggiinviandosi messaggiinviandosi messaggi
3. Ogni oggetto ha la sua memoria formata da altri oggetti
4. Ogni oggetto ha un tipo
5. Tutti gli oggetti di un determinato tipo possono ricevere gli stessi messaggi
Cos’è un oggetto
• Informalmente rappresenta– Entità fisica: trattore
– Entità concettuale: processo chimico
– Oppure entità software: lista, coda...
• Formalmente
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
• Formalmente– Manifestazione concreta di un’astrazione
– Entità con un confine e un’identità ben definite che incapsula stato e comportamento
– IstanzaIstanzaIstanzaIstanza di una classe
• Es.: Ferrari di Schumacher, Ferrari di Barrichello, Mio computer
Un oggetto possiede...
• StatoStatoStatoStato– Possibile condizione nel quale l’oggetto potrebbe esistere e
generalmente cambia nel tempo– Implementato mediante proprietà (attributi) con valori, e
collegamenti ad altri oggetti
• ComportamentoComportamentoComportamentoComportamento
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
• ComportamentoComportamentoComportamentoComportamento– Determina come un oggetto agisce e reagisce alle richieste di un altro
oggetto– Rappresentato dall’insieme di messaggi a cui può rispondere
(operazioni)
• IdentitàIdentitàIdentitàIdentità– Rende possibile la distinzione tra due oggetti anche se hanno lo stesso
stato e lo stesso valore nei suoi attributi
Relazione tra classe e oggetto
• Classe è una definizione astratta di un oggetto
• Definisce la struttura e il comportamento di ogni oggetto nella classe
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
ogni oggetto nella classe
• Serve come template per creare oggetti
• Oggetti sono raggruppati in classi
Oggetto e interfaccia
Nome del Nome del Nome del Nome del tipotipotipotipo
InterfacciaInterfacciaInterfacciaInterfaccia
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
• Le richieste che si possono fare ad un oggetto sono definite dalla sua interfaccia ed è il tipo a determinare l’interfaccia
• Il codice deputato a soddisfare tali richieste, insieme con idati nascosti, costituisce l’implementazione dell’oggetto
Incapsulamento & Information Hiding
“La localizzazione fisica di caratteristiche (es. proprietà, comportamento) in una singola
scatola nera che nasconde l’implementazione (e le relative decisioni di design) dietro una
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
(e le relative decisioni di design) dietro una interfaccia pubblica”
[Dizionario di Object Technology – Firesmith, Eykholt 1995]
Incapsulamento & Information Hiding
• L'information hiding è il principio teorico principio teorico principio teorico principio teorico su cui si basa la tecnicatecnicatecnicatecnica dell'incapsulamento
• Information Information Information Information HidingHidingHidingHiding
– I dettagli implementativi di una classe - o di un costrutto di altro tipo (oggetto, modulo, ecc) - sono nascosti all'utente
– Le scelte interne di design e gli effetti che eventuali cambiamenti di
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
– Le scelte interne di design e gli effetti che eventuali cambiamenti di tali decisioni comportano sono nascoste ai possibili client (utilizzatori)
• IncapsulamentoIncapsulamentoIncapsulamentoIncapsulamento
– Un oggetto contiene ("incapsula") al suo interno gli attributi (dati) e i metodi (procedure) che agiscono su di essi
– L’ incapsulamento è una facilityfacilityfacilityfacility del linguaggio mentre l’information hiding è un principio di designprincipio di designprincipio di designprincipio di design
Incapsulamento & Information Hiding
• L'incapsulamento riduce il costoriduce il costoriduce il costoriduce il costo da pagare per correggere gli errori in fase di sviluppo di un programma
• Un'errata decisione presa nell'implementazione di un singolo modulo non deve ripercuotersi sull'intero
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
singolo modulo non deve ripercuotersi sull'intero progetto, ma deve essere corretta modificando soltanto quel modulo
• Deve essere modificato solo il modulo errato e non i moduli clienti, che interagiranno con il modulo incapsulato soltanto attraverso interfacce
Incapsulamento & Information Hiding
• In generale i programmatori si distinguono in creatori creatori creatori creatori di classedi classedi classedi classe e programmatori clientprogrammatori clientprogrammatori clientprogrammatori client– L’obiettivo del programmatore client programmatore client programmatore client programmatore client è mettere insieme
una serie di classi per sviluppare rapidamente le applicazioni
L’obiettivo del creatore di classicreatore di classicreatore di classicreatore di classi è costruire una classe
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
– L’obiettivo del creatore di classicreatore di classicreatore di classicreatore di classi è costruire una classe che mostra al programmatore client soltanto quello che è necessario, mantenendo nascosto tutto il resto
• Se tutti i membri di una classe fossero disponibili a tutti, un programmatore client potrebbe fare qualsiasi cosa con quella classe e non vi sarebbe così modo di imporre delle regole
Incapsulamento e Information Hiding
• Esempio
– Sistema che identifica un punto sulla superficie terrestre e offre funzionalità per determinare la distanzadistanzadistanzadistanza (distance) e la rottarottarottarotta (heading) tra due
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
distanzadistanzadistanzadistanza (distance) e la rottarottarottarotta (heading) tra due punti
Esempio: prima soluzione
public class Position {
public double latitude;public double longitude;
}
public class PositionUtility {
public static double distance( Position pos1, Position pos2 ) {
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
//Calculate and return the distance between the specifiedpositions
}
public static double heading( Position pos1, Position pos2 ) {
//Calculate and return the heading from pos1 to pos2.
}
}
Esempio: prima soluzione
Position myHouse = new Position();
myHouse.latitude = 36.538611;
myHouse.longitude = -121.797500;
Position coffeeShop = new Position();
coffeeShop.latitude = 36.539722;
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
coffeeShop.latitude = 36.539722;
coffeeShop.longitude = -121.907222;
double distance = PositionUtility.distance( myHouse, coffeeShop );
double heading = PositionUtility.heading( myHouse, coffeeShop );
System.out.println("From my house at (" + myHouse.latitude + ", " + myHouse.longitude + ") to the coffee shop at (" + coffeeShop.latitude + ", " + coffeeShop.longitude + ") is a distance of " + distance + " at a heading of " + heading +
Esempio: prima soluzione
• OUTPUT
From my house at (36.538611, -121.7975) to the
coffee shop at (36.539722, -121.907222) is
distance of 6.0873776351893385 at a heading of
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
distance of 6.0873776351893385 at a heading of
270.7547022304523 degrees.
ConsiderazioniConsiderazioniConsiderazioniConsiderazioni
• Dati (espressi mediante Position) ed operazioni (espresse mediante PositionUtility) sono separati!!!
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
Esempio: seconda soluzione
public class Position {
public double distance( Position position ) {
//Calculate and return the distance from this object to the specific position.
}
public double heading( Position position ) {
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
public double heading( Position position ) {
//Calculate and return the heading from this object to the specified position.
}
public double latitude;
public double longitude;
}
Esempio: seconda soluzione
Position myHouse = new Position();
myHouse.latitude = 36.538611;
myHouse.longitude = -121.797500;
Position coffeeShop = new Position();
coffeeShop.latitude = 36.539722;
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
coffeeShop.latitude = 36.539722;
coffeeShop.longitude = -121.907222;
double distance = myHouse.distance( coffeeShop );
double heading = myHouse.heading( coffeeShop );
System.out.println("From my house at (" + myHouse.latitude + ", " + myHouse.longitude + ") to the coffee shop at (" + coffeeShop.latitude + ", " + coffeeShop.longitude + ") is a distance of " + distance + " at a heading of " + heading + " degrees.");
Modularità
“La decomposizione fisica e logica di cose (es.
responsabilità e software) in gruppi piccoli e
semplici (es. requisiti e classi rispettivamente)
che incrementa il raggiungimento degli
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
che incrementa il raggiungimento degli
obiettivi dell’ingegneria del software”
[Dizionario di Object Technology – Firesmith, Eykholt 1995]
Modularità
• Un modulomodulomodulomodulo può essere definito come un componente di un più vasto sistema, che opera in quel sistema indipendentemente dalle operazioni di altri componenti
– per gestire la complessità, si può suddividere qualcosa che è complesso in pezzi più piccoli e quindi più maneggevoli
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
• La modularità viene utilizzato su diversi livelli di astrazione
– frazionamento di un programma non solo in funzioni, ma a livello superiore in oggetti
• Gli oggetti possono essere raggruppati in packagepackagepackagepackage, componenticomponenticomponenticomponenti e subsystemsubsystemsubsystemsubsystem
– package, componenti e subsystem possono essere usati come blocchi per altri sistemi
Modularità
• O.O. modella la modularità con packagepackagepackagepackage, , , , componentse subsystem
• Un package è un namespacenamespacenamespacenamespace che organizza un insieme di classi ed interfacce corrispondenti
• Concettualmente un package è simile ad una directory
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
• Concettualmente un package è simile ad una directory nel file system. Possiamo quindi memorizzare file HTML in una directory, immagini in un’altra, e script in un’altra ancora
• Tipicamente, sistemi complessi consistono di migliaia di classi, ha quindi senso organizzare le classi e le interfacce in package
Ereditarietà
“Qualsiasi graduatoria (ranking) o ordine di astrazione in una struttura ad albero”
[Dizionario di Object Technology – Firesmith, Eykholt 1995]
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
[Dizionario di Object Technology – Firesmith, Eykholt 1995]
Ereditarietà
• OO utilizza classi per raggruppare dati e funzionalità in concetticoncetticoncetticoncetti e l’ereditarietà per organizzare tali concetti in base ad un certo certo certo certo ordine ordine ordine ordine
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
ordine ordine ordine ordine
– esempi: complessità, responsabilità
• L’ereditarietà permette di descrive differenzedifferenzedifferenzedifferenze o variazionivariazionivariazionivariazioni di un particolare concetto
– la classe originale viene replicata e arricchita con aggiunte e modifiche
Ereditarietà
Mammifero
Felino
Maggiore Astrazione
Cetaceo
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
Gatto Leopardo LeoneMinore Astrazione BalenaDelfino
FratelliFratelliFratelliFratelli hanno stesso livello di astrazionehanno stesso livello di astrazionehanno stesso livello di astrazionehanno stesso livello di astrazione
Ereditarietà
Classe base
Classe derivata
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
• Due tipi possono condividere caratteristiche e comportamenti, ma un tipo può contenere più caratteristiche di un altro, gestire più messaggi o trattarli in modo diverso
• L’ereditarietà esprime questa similarità fra tipi utilizzando i concetti di tipi base tipi base tipi base tipi base e tipi derivatitipi derivatitipi derivatitipi derivati
• Un tipo base contiene tutte le caratteristiche e i comportamenti che sono condivisi dai tipi che da esso derivano
Ereditarietà
Classe base
Classe derivata
superclasse
classe superioreclasse genitore
classe ereditata
sottoclasseclasse figlia
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
• Con l’ereditarietà la classe base viene “clonata” “clonata” “clonata” “clonata” e vengono poi eseguite aggiunte e modifiche sulla replica
• Se la classe base viene modificata, la classe derivata riflette tali cambiamenti
Esempio di ereditarietàShapeShapeShapeShape
draw()erase()mode()getColor()setColor()
CircleCircleCircleCircle SquareSquareSquareSquare TriangleTriangleTriangleTriangle
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
• I tipi derivati (CircleCircleCircleCircle, SquareSquareSquareSquare, TriangleTriangleTriangleTriangle) possono avere ulteriori caratteristiche e comportamenti di quello base (ShapeShapeShapeShape)
• Alcuni comportamenti possono essere diversi– per esempio, se si vuole calcolare l’area di una forma geometrica
• La gerarchia dei tipi incorpora sia le somiglianze che le differenze fra le forme geometriche
CircleCircleCircleCircle SquareSquareSquareSquare TriangleTriangleTriangleTriangle
Ereditarietà
• Quando si eredita da un tipo esistente, il tipo nuovo duplica l’interfaccia della classe base
– tutti i messaggi inviabili a oggetti della classe base possono esserlo anche a oggetti della classe derivata
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
possono esserlo anche a oggetti della classe derivata
• Poiché il tipo di una classe è identificato dai messaggi è possibile inviare, la classe derivata è dello stesso tipo della classe basestesso tipo della classe basestesso tipo della classe basestesso tipo della classe base
– nell’esempio precedente: “un cerchio è una forma geometrica”
Ereditarietà
• Ci sono due modi per differenziare la nuova classe derivata dalla classe base originale
1. Si aggiungono nuovi metodi alla classe derivata (estensioneestensioneestensioneestensione della classe)
ShapeShapeShapeShape
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
ShapeShapeShapeShape
draw()erase()mode()getColor()setColor()
CircleCircleCircleCircle SquareSquareSquareSquare TriangleTriangleTriangleTriangle
flipVertical()flipHorizontal()
Ereditarietà
• Ci sono due modi per differenziare la nuova classe derivata dalla classe base originale
2. Si cambia il comportamento di un metodo della classe base mediante la sovrascrittura del metodo la sovrascrittura del metodo la sovrascrittura del metodo la sovrascrittura del metodo (overriddingoverriddingoverriddingoverridding)
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
(overriddingoverriddingoverriddingoverridding)ShapeShapeShapeShape
draw()erase()mode()getColor()setColor()
CircleCircleCircleCircle SquareSquareSquareSquare TriangleTriangleTriangleTriangle
draw()erase()
draw()erase()
draw()erase()
Polimorfismo
• Linguaggi procedurali (esempio Pascal) basati su idea che procedure e funzioni, e i loro operandi, hanno un unico tipo
• Tali linguaggi sono detti monomorphicmonomorphicmonomorphicmonomorphic, cioè ogni valore e variabile può avere uno ed un solo tipo
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
• Tali linguaggi sono detti monomorphicmonomorphicmonomorphicmonomorphic, cioè ogni valore e variabile può avere uno ed un solo tipo
• Linguaggi O.O. sono detti polymorphicpolymorphicpolymorphicpolymorphic, cioè i valori e le variabili possono avere più di un tipo
• Dal greco polymorphos “avere molte forme”“avere molte forme”“avere molte forme”“avere molte forme”
Polimorfismo
void doStuff(Shape s) {
s.erase();
// ...
s.draw();
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
}
• Questo metodo parla con qualunque Shape, quindi è indipendente dal tipo di oggetto che sta disegnando e cancellando
Polimorfismo
Circle c = new Circle();
Triangle t = new Triangle();
Line l = new Line();
doStuff(c);
doStuff(t);
doStuff(l);
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
• La chiamata a doStuff()funziona automaticamente in modo corretto, indipendentemente dal tipo esatto dell’oggetto
• Questo è reso possibile dal late late late late bindingbindingbindingbinding
– quando si invia un messaggio ad un oggetto, il codice che viene chiamato non è determinato fino al momento dell’esecuzione
Polimorfismo
…
Shape s = null;
if (x <= 3) {
s = new Circle();
} else {
s = new Triangle();
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
s = new Triangle();
}
s.draw();
…
• draw() può essere applicato indifferentemente a un cerchio, quadrato o triagolo...
• In fase di compilazione, il compilatore non può sapere quale parte di codice sarà in esecuzione
Polimorfismo
…
Shape s = null;
if (x <= 3) {
s = new Circle();
} else {
s = new Triangle();
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
s = new Triangle();
}
s.draw();
…Posso invocare il metodo draw()?Compile time
Quale metodo draw() deve essere invocato?Run-time
Punti di forza dell’ OO
• Singolo paradigma
• Facilita il riuso di codice e di architetture
• Modelli riflettono maggiormente la realtà
– Descrizione più accurata dei dati e processi
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
– Descrizione più accurata dei dati e processi
– Decomposizione basata su partizionamento naturale
– Più facile da comprendere e mantenere
• Stabilità
– Piccolo cambiamento nei requisiti non significa massicci cambiamenti nel sistema durante lo sviluppo
Java vs C++
• Sia C++ che Java sono linguaggi ibridiibridiibridiibridi
• Un linguaggio ibrido permette molteplici stili di programmazione
– per esempio, OO/procedurale
La ragione per cui C++ è ibrido è quella di garantire la
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
• La ragione per cui C++ è ibrido è quella di garantire la compatibilità all’indietro con il linguaggio C
– C++ comprende molte delle caratteristiche indesiderabili di C, il che può rendere alcuni aspetti del C++ eccessivamente complicati
• Java presuppone che si voglia fare solosolosolosolo programmazione orientata agli oggetti
Java vs C++
• Java non supporta le strutture (Java non supporta le strutture (Java non supporta le strutture (Java non supporta le strutture (structstructstructstruct), le unioni ), le unioni ), le unioni ), le unioni (union(union(union(union) ) ) ) sono rese inutili dalla presenza delle classi
• Java non supporta più i Java non supporta più i Java non supporta più i Java non supporta più i puntatori puntatori puntatori puntatori
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
• Java non supporta più i Java non supporta più i Java non supporta più i Java non supporta più i puntatori puntatori puntatori puntatori sono stati eliminati poiché sono la maggior causa degli errori in C/C++
• Java Java Java Java non supporta le non supporta le non supporta le non supporta le funzioni funzioni funzioni funzioni essendo un linguaggio orientato agli oggetti, Java forza i programmatori a considerare le funzioni come metodi della classe
Java vs C++
• Java non supporta il preprocessore, il Java non supporta il preprocessore, il Java non supporta il preprocessore, il Java non supporta il preprocessore, il typedeftypedeftypedeftypedef e i e i e i e i filesfilesfilesfiles headerheaderheaderheaderJava fornisce funzionalità simili ma con un maggior controllo
• Java Java Java Java non supporta il non supporta il non supporta il non supporta il coercioncoercioncoercioncoercion automaticoautomaticoautomaticoautomaticosi riferisce alla conversione implicita di tipi di dato che alcune volte si verifica in C e C++
Java non permette l’Java non permette l’overloadingoverloading degli operatoridegli operatori
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
• Java non permette l’Java non permette l’Java non permette l’Java non permette l’overloadingoverloadingoverloadingoverloading degli operatoridegli operatoridegli operatoridegli operatori
– Per esempio, è possibile definire funzioni che ridefiniscono la somma (+) e la moltiplicazione (*) fra due oggetti:operatori in overload : a+b*c chiamata di funzioni specifiche : sommasommasommasomma(a,moltiplicamoltiplicamoltiplicamoltiplica(b,c))
• Java non supporta l’ereditarietà multiplaJava non supporta l’ereditarietà multiplaJava non supporta l’ereditarietà multiplaJava non supporta l’ereditarietà multiplaè una caratteristica del C++ che permette di derivare una classe da più classi base
Java vs C++
• Java ha una classe Java ha una classe Java ha una classe Java ha una classe StringStringStringString come parte del package come parte del package come parte del package come parte del package java.langjava.langjava.langjava.langquesto differisce dall’array di caratteri terminante con null del C e C++
• Java gestisce gli argomenti della linea di comando in modo Java gestisce gli argomenti della linea di comando in modo Java gestisce gli argomenti della linea di comando in modo Java gestisce gli argomenti della linea di comando in modo diverso dal C o C++diverso dal C o C++diverso dal C o C++diverso dal C o C++– In C++
DISIM - Dipartimento di Ingegneria e Scienze dell’Informazione e Matematiche
Romina EramoTecnologie dei Linguaggi di Programmazione
– In C++ void main(int argc, char *argv[]){ . . . }//end main function
– In Javapublic static void main(String[] args){ . . . }//end main method
• Java ha un sistema automatico per allocare e liberare la Java ha un sistema automatico per allocare e liberare la Java ha un sistema automatico per allocare e liberare la Java ha un sistema automatico per allocare e liberare la memoria (memoria (memoria (memoria (garbagegarbagegarbagegarbage collectioncollectioncollectioncollection))))non è necessario utilizzare funzioni di allocazione e deallocazionedella memoria come in C e C++