PROGRAMMAZIONE AVANZATA
3° Anno - Secondo Semestre
Frequenza Non obbligatoria
- 9 CFU
- 72 ore
- ITALIANO
- Sede di Trieste
- Obbligatoria
- Convenzionale
- Orale
- SSD ING-INF/05
Conoscenza e capacità di comprensione.
- Conoscere cos’è la programmazione orientata agli oggetti: come immagazzinare, processare e accedere ai dati con gli oggetti.
- Conoscere la sintassi e le caratteristiche del linguaggio Java e della piattaforma software Java.
- Conoscere le convenzioni di stile per il linguaggio Java.
- Conoscere i framework e le API principali di Java.
- Conoscere la struttura comune degli strumenti di sviluppo, inclusi quelli per lo unit testing.
- Comprendere come un programma Java viene eseguito dal calcolatore.
Capacità di applicare conoscenza e comprensione.
- Saper progettare, sviluppare, testare e fare il debug di un software complesso usando Java.
- Saper modellare concetti e procedure con Java.
Autonomia di giudizio.
- Decidere se Java è appropriato per un certo compito di programmazione.
- Giudicare la qualità di un software scritto in Java in termini di stile del codice, struttura degli artefatti software, test e documentazione.
Abilità comunicative.
- Descrivere le motivazioni alla base delle scelte di progetto e sviluppo di un software scritto in Java.
- Comprendere, formulare e descrivere le specifiche per un software.
Capacità di apprendimento.
- Imparare ad usare, attraverso la documentazione del software e gli esempi di utilizzo, un qualsiasi software scritto in Java.
- Imparare le basi di altri linguaggi di programmazione orientati agli oggetti.
- Principi di programmazione e strutture dati: algoritmi, tipi di dato, cicli, ricorsione, esecuzione parallela.
- Principi di reti di calcolatori: IP, TCP.
Cos'è Java
Concetti principali della programmazione orientata agli oggetti
Pacchetti e altri concetti
Principi di input/output (I/O); flusso del programma; operazioni di base
Stile del codice Java
Ereditarietà e polimorfismo
Passaggio di parametri; visibilità e ciclo di vita
Memoria della JVM: stack e heap
Stream per I/O; accesso al file system; I/O di bytes e tipi di dato primitivi
Principi di gestione delle eccezioni; le keyword try, catch e finally
Esecuzione concorrente
Impacchettare e documentare il codice
Interfacce e classi astratte
Tipi generici
Il Collections framework: l’interfaccia Collection e i suoi metodi principali
Caratteristiche avanzate/recenti di Java (linguaggio e API)
Slide del docente, disponibili liberamente online (sul sito del docente: https://medvet.inginf.units.it/teaching/), in inglese.
Cos'è Java
Linguaggio di programmazione vs piattaforma software
Compilazione e esecuzione di un programma in Java
Java Virtual Machine (JVM), Java Runtime Environment, Java Development Kit
Javadoc: usare la documentazione
Ambiente di sviluppo integrato (IDE); l’opzione online
Concetti principali della programmazione orientata agli oggetti
Oggetti e riferimenti
Notazione grafica per oggetti e riferimenti durante l’esecuzione
Classe e tipi di dato primitivi; oggetto come istanza di una classe
Metodi e signature; overloading dei metodi; operatore punto; convenzioni sui nomi di classi e metodi
Costruttore
Modularità e incapsulamento dell’informazione
Campi
Identificatori e visibilità; i modificatori di visibilità private e public
L’identificatore this
Pacchetti e altri concetti
Pacchetto; nome del pacchetto; Application Program Interface (API) come insieme di pacchetti; fully qualified name; convenzioni sui nomi dei pacchetti
La keyword import; importazione di pacchetti: dove vengono cercate le classi
Il modificatore static
Array
Il metodo main()
Principi di input/output (I/O); flusso del programma; operazioni di base
Flusso del programma: esecuzione condizionale e ripetizione con if, for, while, ecc.
Parametri a linea di comando; leggere dallo standard input; scrivere sullo standard output
La classe String
Gli operatori di assegnazione; valori letterali e tipi di dato primitivi
Sviluppare con un IDE
Stile del codice Java
Autocompletamento e scrittura codice assistita
Building e debugging
Comprendere i messaggi di errore
Ereditarietà e polimorfismo
Ereditarietà e la keyword extends
Costruttore di classi derivate e l’identificatore super
Polimorfismo; downcasting
toString(), equals(), and ==
Passaggio di parametri; visibilità e ciclo di vita
Passaggio di parametri per tipi primitivi e non primitivi
Visibilità degli identificatori
Ciclo di vita di oggetti e valori
Memoria della JVM: stack e heap
Classi wrapper; autoboxing/unboxing
Garbage collector
Comunicazione
Stream per I/O; accesso al file system; I/O di bytes e tipi di dato primitivi
Principi di gestione delle eccezioni; le keyword try, catch e finally
Buffered I/O streams
Writer e Reader; versioni buffered
I/O di base su rete con Socket e ServerSocket
Esecuzione concorrente
I thread e la classe Thread; gestione della memoria JVM con i thread
I/O multithreaded su rete
Schedulazione dei thread; la keyword synchronized
Gestione delle eccezioni
Convenzione: flusso di esecuzione normale e anomalo
Lanciare le eccezioni; la keyword throws; la RuntimeException
Gestire le eccezioni
Impacchettare e documentare il codice
Caricamento delle classi; controlli di consistenza statica e dinamica
Pacchetti: ubicazione di sorgenti e classi compilate
Documentare con javadoc: sintassi e procedura
Interfacce e classi astratte
Definizione e la keyword implements
Ereditarietà tra interfacce; ereditarietà multipla
Classi astratte e la keyword abstract
Enumerations
Definizione, utilizzo e la keyword enum
Tipi generici
Motivazione per i tipi generici
Sintassi; tipizzazione e ereditarietà tra classi tipizzate (subtyping)
Wildcard; tipizzazione di metodi
Collections
Il Collections framework: l’interfaccia Collection e i suoi metodi principali
Iterare sulle collections
Principali collections; l’interfaccia Map
Tempi di accesso in lettura e scrittura, ordinamento, multithreading, eliminazione degli elementi; collections annidate per strutturare i dati
Caratteristiche avanzate/recenti di Java (linguaggio e API)
Executors, Future
Varargs
I metodi default e statici nelle interfacce
Le annotazioni
La Stream API
Le lambda; interfacce funzionali
try-with-resources e multi catch
switch expressions
I record
Sviluppo avanzato e strumenti
Automazione del build e della gestione delle dipendenze con maven
Per circa il 75% del tempo: lezioni frontali con la lavagna e proiezioni di slide.
Per il restante 25%: esercizi, sotto la supervisione del docente, consistenti nella risoluzione di semplici task di progettazione e sviluppo in Java.
L’esame può essere in una delle seguenti modalità:
1. Due parti: progetto + esame orale. L’esame viene passato solo se il voto è >6/10 in ogni parte. Il voto complessivo è la media dei due voti.
2. Solo orale.
Il voto complessivo degli esami non passati (con l’eccezione del mancato rispetto dei termini per la consegna del progetto) verrà registrato come insufficiente. Lo studente può chiedere di ripetere l’esame anche quando passato: l’accettazione e le parti specifiche da ripetere saranno concordate col docente.
Parti dell’esame e istruzioni specifiche:
- Progetto. Al termine del corso, sarà assegnato un progetto consistente nella progettazione e sviluppo di un software in Java secondo le specifiche richieste. Lo studente dovrà consegnare il software entro il termine prestabilito e corrispondente alla data dell’esame scritto che intende sostenere. La valutazione di ogni esercizio sarà come segue: 0/10 se non consegnato (entro il termine); da 5/10 a 10/10 se consegnato, a seconda della qualità del codice, della struttura del software, e del livello di funzionamento.
- Esame orale. Domande sui concetti chiave presentati durante le lezioni e esercizi di programmazione e modellazione da svolgersi alla lavagna. La durata media di un esame orale è di 25 minuti.
In ogni tipologia di contenuto prodotto dallo studente per essere ammesso o per partecipare ad una prova d’esame (progetti, relazioni, esercizi, test), l’eventuale uso di strumenti Large Language Model (ChatGPT e simili) deve essere dichiarato esplicitamente. Questo requisito deve essere rispettato anche in caso di uso parziale.
A prescindere dalle modalità di verifica dell'apprendimento, il docente si riserva comunque la possibilità di approfondire con un esame orale l’effettivo contributo dello studente in ogni tipologia di contenuto prodotto.
Questo insegnamento approfondisce argomenti strettamente connessi a uno o più obiettivi dell’Agenda 2030 per lo Sviluppo Sostenibile delle Nazioni Unite