Programmazione ii
A.A. 2021/2022
Obiettivi formativi
L'insegnamento, che si colloca nel percorso ideale iniziato dall'insegnamento di "Programmazione" e che proseguirà nell'insegnamento di "Ingegneria del software", ha l'obiettivo di presentare alcune astrazioni e concetti utili al progetto, sviluppo e manutenzione di programmi di grandi dimensioni. L'attenzione è focalizzata sul paradigma orientato agli oggetti, con particolare enfasi riguardo al processo di specificazione, modellazione dei tipi di dato e progetto.
Risultati apprendimento attesi
Lo studente deve essere in grado di applicare i concetti, le tecniche e gli strumenti illustrati nell'insegnamento alla costruzione di programmi di medie dimensioni, che coinvolgano un numero non trascurabile di tipi di dato, tra loro opportunamente organizzati. Lo studente dovrà inoltre mostrare di comprendere e saper discutere in modo chiaro e con proprietà di linguaggio le soluzioni adottate in tale processo e le loro eventuali criticità, ponendole a confronto con altre soluzioni possibili.
Periodo: Primo semestre
Modalità di valutazione: Esame
Giudizio di valutazione: voto verbalizzato in trentesimi
Corso singolo
Questo insegnamento non può essere seguito come corso singolo. Puoi trovare gli insegnamenti disponibili consultando il catalogo corsi singoli.
Programma e organizzazione didattica
Edizione unica
Responsabile
Periodo
Primo semestre
Videolezioni sincrone (se l'insegnamento sarà tenuto in modalità remota). Le videolezioni, se effettaute, non saranno comunque registrate.
Programma
L'insegnamento è incentrato attorno alle tematiche del progetto, realizzazione ed analisi di programmi secondo il paradigma object oriented. A tal fine il corso prevede sia una trattazione più astratta e principiata dell'argomento, che una presentazione più pratica e concreta, svolta attraverso esempi basati sul linguaggio di programmazione Java.
Riguardo ai principi, sono introdotti e discussi:
* l'uso di astrazioni di vario livello (come i metodi, i tipi di dato astratti, l'iterazione esterna, l'estensione e delega),
* alcuni strumenti concettuali per ragionare su tali astrazioni (come l'invariante di rappresentazione, la funzione di astrazione, le pre-/post-condizioni, gli effetti collaterali, l'induzione sui tipi di dato ),
* alcuni criteri di valutazione della qualità del progetto di codice object oriented (come l'incapsulamento, il data hiding, la manutenibilità, il riuso e l'estendibilità),
* alcune tecniche di verifica (come i test unitari) e di debugging.
Riguardo al linguaggio Java, sono presentati i seguenti aspetti del lignuaggio:
* costrutti di controllo del flusso (sequenza, iterazione e selezione),
* tipi di dati elementari,
* funzioni (metodi statici),
* classi (concrete, astratte ed interne),
* interfacce (con metodi di default),
* ereditariertà e polimorfismo,
* tipi generici (uso e cenni alla progettazione e realizzazione, vincoli di tipo e wildcard).
Riguardo ai principi, sono introdotti e discussi:
* l'uso di astrazioni di vario livello (come i metodi, i tipi di dato astratti, l'iterazione esterna, l'estensione e delega),
* alcuni strumenti concettuali per ragionare su tali astrazioni (come l'invariante di rappresentazione, la funzione di astrazione, le pre-/post-condizioni, gli effetti collaterali, l'induzione sui tipi di dato ),
* alcuni criteri di valutazione della qualità del progetto di codice object oriented (come l'incapsulamento, il data hiding, la manutenibilità, il riuso e l'estendibilità),
* alcune tecniche di verifica (come i test unitari) e di debugging.
Riguardo al linguaggio Java, sono presentati i seguenti aspetti del lignuaggio:
* costrutti di controllo del flusso (sequenza, iterazione e selezione),
* tipi di dati elementari,
* funzioni (metodi statici),
* classi (concrete, astratte ed interne),
* interfacce (con metodi di default),
* ereditariertà e polimorfismo,
* tipi generici (uso e cenni alla progettazione e realizzazione, vincoli di tipo e wildcard).
Prerequisiti
Di seguito sono elencate alcune conoscenze preliminari che è bene aver acquisito in modo solido prima di apprestarsi a seguire le lezioni:
* programmazione [il corso di "Programmazione" è formalmente propedeutico],
* tecniche di dimostrazione di base [dagli insegnamenti di "Matematica del discreto" e/o "Logica matematica"];
* aspetti elementari dei linguaggi formali [dal corso "Linguaggi formali e automi"].
* programmazione [il corso di "Programmazione" è formalmente propedeutico],
* tecniche di dimostrazione di base [dagli insegnamenti di "Matematica del discreto" e/o "Logica matematica"];
* aspetti elementari dei linguaggi formali [dal corso "Linguaggi formali e automi"].
Metodi didattici
Lezioni frontali ed esercitazioni. Si consiglia la frequenza.
Materiale di riferimento
I libri di testo (ossia il cui uso non è facoltativo) del corso sono:
* Barbara H. Liskov, John Vogel Guttag (2000) Program Development in Java: Abstraction, Specification, and Object-Oriented Design Addison-Wesley Professional,
* Joshua Bloch (2017), Effective Java, Addison-Wesley Professional.
* Barbara H. Liskov, John Vogel Guttag (2000) Program Development in Java: Abstraction, Specification, and Object-Oriented Design Addison-Wesley Professional,
* Joshua Bloch (2017), Effective Java, Addison-Wesley Professional.
Modalità di verifica dell’apprendimento e criteri di valutazione
L'insegnamento non prevede prove in itinere. La prova finale è costituita da una prova pratica (della durata indicativa di tre ore) che verte sulla progettazione e sviluppo di un software secondo delle specifiche assegnate; alla prova scritta (se superata con voto superiore a 23/30) segue un colloquio orale individuale (obbligatorio sopra i 27/30, e a richiesta in altro caso). Attraverso tali prove il candidato deve dimostrare:
* la conoscenza delle definizioni e delle nozioni fondamentali riguardo agli aspetti di orientazione agli oggetti e programmazione,
* la capacità di applicare tale conoscenza a un semplice caso concreto tramite lo sviluppo di frammenti di codice.
* la conoscenza delle definizioni e delle nozioni fondamentali riguardo agli aspetti di orientazione agli oggetti e programmazione,
* la capacità di applicare tale conoscenza a un semplice caso concreto tramite lo sviluppo di frammenti di codice.
INF/01 - INFORMATICA - CFU: 6
Esercitazioni: 24 ore
Lezioni: 32 ore
Lezioni: 32 ore
Docenti:
Boldi Paolo, Santini Massimo
Docente/i
Ricevimento:
https://santini.di.unimi.it/d/ricevimento
stanza 5007, V piano, via Celoria, 18