Informazioni sul corso

Obiettivi dell'insegnamento

Se informalmente un algoritmo è un insieme di regole che consentono di calcolare in un numero finito di passi ben specificati la soluzione di un problema, la programmazione è in buona sostanza la disciplina che consente di tradurre tale oggetto astratto in una sequenza concreta di istruzioni e di definizioni dei dati (in un assegnato linguaggio di programmazione) che rendano il calcolo suscettibile di esecuzione da parte di un dispositivo automatico (come ad esempio un computer).

L'insegnamento Programmazione del primo anno fornisce le prime competenze relative a tale disciplina, esse verranno accresciute negli anni successivi sia rispetto alla capacità di trattare problemi più complessi (ad esempio negli insegnamenti di Algoritmi e strutture dati, Ricerca operativa, Linguaggi formali e automi o più specifici (in Basi di dati, Sistemi operativi, Reti di calcolatori che di considerare programmi più complessi per dimensione e ciclo di vita (in Ingegneria del software…).

L'insegnamento "Programmazione II" ha l'obiettivo di accrescere le competenze acquisite nel corso del primo anno tramite l'ampliamento della ricchezza espressiva del linguaggio (o paradigma) di programmazione; facendo tesoro della conoscenza del paradigma imperativo appresa tramite l'uso del linguaggio Go, l'insegnamento introduce il paradigma object oriented (assieme alle relative tecniche di specificazione e progetto) attraverso il linguaggio Java (e non solo).

Risultati di apprendimento attesi e argomenti trattati

A seguito del superamento dell'esame, lo studente conosce le principali nozioni riguardanti l'object orientation quali:

  • astrazione (tramite procedure e tipi di dati),

  • incapsulamento (tramite classi concrete/astratte e interfacce),

  • estensibilità (per ereditarietà, composizione e delega),

  • polimorfismo (e tipi generici).

Inoltre lo studente è in grado di:

  • definire e comprendere le specifiche (quanto meno informali) di un programma non banale,

  • progettare una gerarchia di classi Java in accordo a tali specifiche,

  • documentare il codice in modo ragionevole,

  • validare (attraverso semplici test) il comportamento del codice prodotto.

Argomenti trattati

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 linguaggio:

  • 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).

Programma dettagliato

Rispetto alla bibliografia e al materiale didattico, si precisa che costituiscono argomenti del corso:

Materiale di supporto molto utile può essere reperito a partire dagli handout dell'anno accademico 2019/20 con particolare riferimento al codice sorgente e alla relativa documentazione (con i link alle guide: Composition & Inheritance, Equality & Inheritance e Ontology & Inheritance). Tale materiale può costituire il punto di partenza per alcune domande durante l'esame orale, per cui si raccomanda di prenderne visione per tempo.

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"].

Modalità di valutazione "a distanza"

L'insegnamento non prevede prove in itinere.

Per il periodo in cui è impedito lo svolgimento di esami in presenza presso le sedi dell'Ateneo, la prova finale è costituita da una prova pratica "a distanza" (che verte sulla progettazione e sviluppo di un software secondo delle specifiche assegnate) seguita da una discussione orale "a distanza"; la prova pratica non è valutata in trentesimi: il suo superamento consente esclusivamente di accedere all'orale che diventa pertanto obbligatorio per chiunque intenda superare l'esame.

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.

Prima dell'inizio della prova pratica, gli studenti riceveranno al proprio indirizzo @studenti.unimi.it una mail contenente delle istruzioni per il collegamento in videoconferenza ed un link personale e non cedibile per collegarsi (usando il browser Chrome, o Firefox, senza necessità di installare alcun altro software) ad un ambiente di sviluppo remoto basato su Visual Studio Code. L'accesso a tale ambiente prevede una fase di identificazione durante la quale lo studente scatta una foto con la webcam del suo computer al proprio volto ritratto a fianco di un documento di riconoscimento (legalmente valido, con fotografia); tale foto sarà utilizzata esclusivamente per l'identificazione dello studente da parte dei membri della commissione d'esame e sarà cancellata non oltre il termine dell'esame.

Gli studenti interessati ai dettagli tecnici di ∂anake, l'ambiente di sviluppo remoto sopra menzionato, possono prendere visione della documentazione preliminare e del codice sorgente; si osservi che la conoscenza di tali dettagli non è assolutamente necessaria al superamento dell'esame, ma che i riferimenti qui indicati sono offerti solo a scopo di trasparenza.

Criteri di valutazione

Per maggior chiarezza, i criteri di valutazione della prova pratica sono ispirati al contenuto di tutte le lezioni ed il materiali didattici elencati nel diario, con particolare riferimento alle sezioni

  • 5.7 Reasoning about Data Abstractions

  • 5.8 Design Issues

  • 5.9 Locality and Modifiability

  • 9.2 Some Criteria for Specifications

  • 14.1 Evaluating a Design

del libro di testo "Program Development in Java: Abstraction, Specification, and Object-Oriented Design".

Per quanto concerne l'orale, un'ottima traccia ai concetti su cui verterà la discussione è costituita dal contenuto delle Sidebar presenti nelle parti comprese nel programma del libro di testo medesimo.

Bibliografia

I libri di testo (ossia il cui uso non è facoltativo) del corso sono:

Si consulti anche la sezione su Java della pagina sugli strumenti per avere informazioni sulla documentazione specifica del linguaggio.

Le letture consigliate, utili ad approfondire e migliorare la propria competenza generale riguardo alla programmazione, sono: