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: