Nome insegnamento: PROGRAMMAZIONE ORIENTATA AGLI OGGETTI
Articolazione in moduli: : PROGRAMMAZIONE OO – I MODULO (6CFU)+ PROGRAMMAZIONE OO – II
MODULO(6CFU)
Settore Scientifico Disciplinare: ING-INF/05
Docente responsabile
Pupo Francesco
Programmazione oo – Modulo 1
Crediti formativi universitari
Programmazione oo – Modulo 1: 6
Docente responsabile
Nigro Libero
Programmazione oo – Modulo 2:
Crediti formativi universitari
Programmazione oo – Modulo 2: 6
Numero ore lezioni: 36
Numero ore riservate attività didattiche assistite
Numero ore esercitazioni: 21
Programmazione oo – Modulo 1: 57
Numero ore attività di laboratorio:
Numero ore lezioni: 36
Numero ore riservate attività didattiche assistite
Numero ore esercitazioni: 21
Programmazione oo – Modulo 2: 57
Numero ore attività di laboratorio:
Tipologia di attività formativa (TAF): ATTIVITA’ DI BASE
Lingua di insegnamento: Italiano
Anno di corso e Periodo didattico di erogazione: I ANNO, II SEMESTRE
Lingua di insegnamento: Italiano
Insegnamento/i Propedeutico/i: Fondamenti di Informatica
Risultati d’apprendimento previsti e competenze da acquisire:
Il corso approfondisce la programmazione in Java in accordo alla tecnologia degli oggetti. Attraverso lo
sviluppo e la messa a punto di esempi/progetti didattici sperimentali, si studiano i concetti della
programmazione orientata agli oggetti e la realizzazione di classi di libreria estendibili e riutilizzabili. Si
illustrano quindi gli aspetti di sviluppo di software robusto alle eccezioni, dotato di interfaccia utente
grafica e capace di essere elaborato in ambiente Internet (es. applet). Il corso illustra, altresì, la gestione
di strutture dati dinamiche (es. liste ed alberi binari), la programmazione ricorsiva, e introduce i concetti
della programmazione multi-thread e della programmazione funzionale. Altri elementi di studio
riguardano la rappresentazione in bit delle informazioni e la programmazione in assembler utilizzando un
calcolatore didattico di cui si illustra una realizzazione ad oggetti in Java.
Argomenti delle lezioni:
Introduzione alla tecnologia degli oggetti.
Il paradigma degli oggetti. Classi, oggetti e messaggi. Struttura e comportamento: campi, metodi e
parametri. Modificatori di accesso. Regole di visibilità dei nomi. Approfondimento delle classi array e
stringhe di caratteri. Classi e invarianti.
Gerarchie di oggetti e sviluppo di programmi.
Dal generale al particolare. Progetto di classi per specializzazione di classi esistenti. Definizione di
pacchetti di classi riutilizzabili. Operazione di assegnazione tra oggetti e casting sui riferimenti.
Polimorfismo e collegamento dinamico ai metodi. La classe Object e i metodi toString(), equals().
hashCode(), clone(). Linee guida per il progetto generale di una classe riusabile. Classi astratte e
interfacce. Relazioni d’ordine tra gli oggetti di una classe. Risoluzione di problemi mediante il progetto e
la messa a punto di gerarchie di classi. Organizzazione delle fasi di testing. Tipi di dati astratti. Classi
parametriche e meccanismo dei tipi generici.
Gestione delle eccezioni e classi della libreria di Java.
Il meccanismo delle eccezioni di Java. Regole di progetto di classi di eccezioni. Panoramica sulle classi
della libreria di Java. Classi wrapper e tipi primitivi. Classi e interfacce di utilità. Approfondimento del
collection framework di Java. Liste, insiemi e mappe.
Elementi di programmazione dell’interfaccia utente grafica (GUI)
Programmazione pilotata dagli eventi. Il modello di delegazione degli eventi di Java AWT e swing (o
JavaFX). Sorgenti di eventi ed ascoltatori. Contenitori e componenti di una GUI. Ridisegno di oggetti
grafici. Gestione eventi del mouse e della tastiera. Applicazioni ed applet.
Gestione di flussi e file.
Introduzione ai flussi di ingresso/uscita e file. Flussi binari, tipati, testuali e ad oggetti. Principali classi
Java per la gestione di flussi e file. File ad accesso diretto. Serializzazione degli oggetti.
Concetti di complessità degli algoritmi.
Definizioni degli operatori O,  e . Classi di complessità.
Strutture dati dinamiche e programmazione ricorsiva.
Gestione di una lista concatenata. Classi per la gestione di liste lineari: pila, coda, doppia coda etc.
Implementazione sequenziale e concatenata. La lista doppia. Tecniche di programmazione ricorsiva.
Esempi di problemi risolti ricorsivamente. Il problema dell’ordinamento. Gli algoritmi merge sort e heap
sort. Struttura dati heap. Trasformazione ricorsione-iterazione. Alberi binari di ricerca. Sviluppo di classi
per la gestione di strutture ad albero binario. Ricorsione e strutture dati dinamiche. Stack e heap di un
programma Java. Concetti sui grafi.
Programmazione multi-thread.
Introduzione alle problematiche della concorrenza. Classi e oggetti thread. Il problema dell’interferenza
tra thread che accedono a dati condivisi. Il monitor nativo di Java. Sviluppo di applicazioni concorrenti.
Thread e interfaccia utente. Cenni al package java.util.concurrent.
Sviluppo di programmi ad oggetti. Casi di studio.
Rappresentazione in bit delle informazioni.
Sistemi di numerazione posizionali. Rappresentazione delle informazioni numeriche. Numeri naturali.
Numeri interi. Rappresentazioni per segno e modulo, per complementi diminuiti, per complementi a due.
Aritmetica binaria. Rappresentazione dei numeri reali floating point. Il formato IEEE 754.
Richiami di architettura dei calcolatori.
Un esempio di calcolatore didattico (RASP). Linguaggio macchina e notazione assembler. Conversione di
algoritmi Java in assembler RASP.
Elementi di programmazione funzionale in Java 8.
Espressioni lambda ed elaborazione di collezioni mediante stream.
Argomenti delle esercitazioni:
Progetto e realizzazione di classi basate sui concetti presentati a lezione. Sviluppo e verifica di progetti
didattici sperimentali.
Argomenti delle attività di laboratorio: (da svolgere su base individuale da parte degli allievi)
Sviluppo di classi basate sui concetti presentati a lezione.
Sviluppo e verifica di progetti didattici sperimentali.
Modalità di erogazione della didattica:
Lezioni frontali in aula, con dimostrazioni pratiche/esercitazioni mediante computer + proiettore
Metodi di valutazione:
Sviluppo di un progetto, prova scritta e prova orale obbligatoria.
Criteri di valutazione dell’apprendimento:
 comprensione della tecnologia degli oggetti nello sviluppo modulare del software
 abilità ad impostare la risoluzione di problemi mediante gerarchie di classi riusabili
 abilità ad implementare una soluzione ad oggetti e a validarne il funzionamento mediante testing

abilità ad avvalersi delle classi e metodi della libreria di Java, es. relativamente a liste, insiemi e
tabelle
 abilità a sviluppare classi robuste alle eccezioni, che si interfacciano con il file system e sono dotate di
GUI
 abilità a sviluppare in proprio classi per la gestione di strutture dati dinamiche (es. liste ed alberi)
 abilità a sviluppare software mediante la programmazione ricorsiva
 abilità ad utilizzare la rappresentazione delle informazioni in bit e la programmazione in linguaggio
assembler
 comprensione degli aspetti di novità della piattaforma Java 8 con riferimento alla programmazione
funzionale e all’elaborazione di collezioni mediante stream
 comprensione delle problematiche fondamentali della programmazione multi-thread.
Criteri di misurazione dell’apprendimento:
Voto finale
Criteri di attribuzione del voto finale:
Voto scritto tra 15 e 30, incremento massimo di tre punti per l’orale, incremento massimo di tre punti per
il progetto.
Testo di riferimento:
C. Nigro, L. Nigro, Lezioni di Programmazione Orientata agli Oggetti – Con Elementi di Strutture di Dati e
Architettura dei Calcolatori, Pitagora Editrice BO, 2014.
Testi consigliati per la consultazione:
Cay S. Horstmann, Gary Cornell, Core Java, Vol. 1-Fundamentals, 8th Edition (in inglese), Pearson
Education, 2008.
S. Mazzanti, V. Milanese, Programmazione di applicazioni grafiche in Java. Apogeo, 2006.
Cay S. Horstmann, Java SE 8 for the Really Impatient, Addison Wesley, 2014.
Orario e aule lezioni:
http://www.dimes.unical.it/index.php/didattica
Calendario prove valutazione: