Esercizio sulla ricorsione: calcolo dei cammini da un punto a un altro. Riassunto dei design pattern. Il pattern Callback. Consigli per il futuro. Conclusione del corso!
Blog e sito Web del corso di Metodologie di Programmazione (Corso di Laurea in Informatica, canale M-Z)
lunedì 4 giugno 2018
mercoledì 30 maggio 2018
Lezione 30/05/2018: esercizi su ricorsione e design pattern
Controllo ricorsivo di una stringa palindroma. Il problema delle regine. Ricerca binaria ricorsiva. Esercizi sui design pattern: Configuration con singoletto e singoletti multipli; publisher/subscriber per eventi di bottoni; strategy per l'ordinamento di sequenze; builder eager e lazy su ListaDiInteri.
martedì 29 maggio 2018
Lezione del 29/05/2018: i moduli (Java 9); decorator pattern; rassegna su input/output; serializzazione
I moduli di Java 9. Motivazioni, parole chiave module, exports, requires, requires transitive. Utilizzo di moduli pre-Java 9 mediante classpath (unnamed module) e come moduli automatici (nel module path).
Il Decorator Pattern: aggiungere responsabilità a una classe senza che essa lo sappia. L'esempio della rappresentazione grafica delle automobili.
Input & output: gli oggetti System.out e System.in. InputStream, PrintStream e la classe Scanner. File di testo e file binari. Gli stream. Gerarchie di classi stream. Leggere e scrivere un file di testo: la classe java.io.File. BufferedReader/FileReader, BufferedWriter/FileWriter. Leggere e scrivere un file di testo formattato: le classi Formatter e Scanner. Il package java.nio: Path, Paths e Files. Serializzare e deserializzare un oggetto. L'interfaccia Serializable. La parola chiave transient.
Il Decorator Pattern: aggiungere responsabilità a una classe senza che essa lo sappia. L'esempio della rappresentazione grafica delle automobili.
Input & output: gli oggetti System.out e System.in. InputStream, PrintStream e la classe Scanner. File di testo e file binari. Gli stream. Gerarchie di classi stream. Leggere e scrivere un file di testo: la classe java.io.File. BufferedReader/FileReader, BufferedWriter/FileWriter. Leggere e scrivere un file di testo formattato: le classi Formatter e Scanner. Il package java.nio: Path, Paths e Files. Serializzare e deserializzare un oggetto. L'interfaccia Serializable. La parola chiave transient.
venerdì 25 maggio 2018
mercoledì 23 maggio 2018
martedì 22 maggio 2018
Lezione del 22/05/2018: design pattern; reactive stream; esercizio su ricorsione
Che cos'è un design pattern. Lo Strategy Pattern: il simulatore di anatre. L'Observer Pattern: un'applicazione di monitoraggio del tempo. La metafora dell'abbonamento. java.util.Observable e java.util.Observer. Reactive stream: Publisher, Subscriber, Subscription e Processor. Esercizio sulla ricorsione: generare tutte le stringhe binarie di lunghezza n.
venerdì 18 maggio 2018
Lezione del 18/05/2018: la ricorsione
La ricorsione. Pensare ricorsivamente. Esempio: il fattoriale. Funzionamento della ricorsione: record di attivazione e stack. Non prevedere un caso base: la ricorsione infinita. Esempi: riconoscimento di una stringa palindroma, concatenazione ricorsiva di stringhe, ricerca binaria ricorsiva. Utilizzo di metodi di comodo mediante l'overloading. Strutture dati Esercizi sulla ricorsione: ricerca binaria.
Esercizi: riconoscimento di una stringa palindroma, concatenazione ricorsiva di stringhe. Utilizzo di metodi di comodo mediante l'overloading. Strutture dati ricorsive. Esercizi sulla ricorsione: generazione di tutte le combinazioni di caratteri; generazione delle permutazioni di una stringa. Labirinto con definizione ricorsiva e mediante matrice labirinto. Mutua ricorsione.
Esercizi: riconoscimento di una stringa palindroma, concatenazione ricorsiva di stringhe. Utilizzo di metodi di comodo mediante l'overloading. Strutture dati ricorsive. Esercizi sulla ricorsione: generazione di tutte le combinazioni di caratteri; generazione delle permutazioni di una stringa. Labirinto con definizione ricorsiva e mediante matrice labirinto. Mutua ricorsione.
giovedì 17 maggio 2018
Lab del 16/05/2018: esercizi sugli stream e homework 3
Esercizi sugli stream: filter, map, IntStream, mapToObj, iterate, collect, Collectors.toList, Collectors.joining. Scrittura del JUnit test dell'homework 3.
martedì 15 maggio 2018
Lezione del 15/05/2018: ancora sugli stream
Differenza tra iterazione interna
ed esterna. Metodi di Stream: map, limit, skip, collect. Collectors: counting, maxBy/minBy,
summingInt, averagingInt, joining, toList, toSet. toCollection, mapping, summingInt,
averagingInt. Operazioni intermedie: limit, skip, flatMap. L'operazione terminale reduce. Operazioni su IntStream, DoubleStream, LongStream e passaggio da uno stream all'altro. Ottenere uno stream infinito. L'operazione intermedia flatMap. Ottenere uno stream infinito e iterare su uno stream: il metodo Stream.iterate.
Copiare gli stream. Importanza dell'ordine delle operazioni.
Ottimizzazione dell'ordine di esecuzione. Stream sequenziali e
paralleli.
giovedì 10 maggio 2018
Lezione dell'11/05/2018: stream e annotazioni
Breve introduzione alla reflection, concetto di classe Class e ottenimento dell'istanza di Class da istanze e da classi. Class.forName. Le annotazioni in Java. La classe Optional. Gli stream: definizione; caratteristiche; operazioni intermedie e terminali. Metodi principali dell'interfaccia java.util.stream.Stream.
Comportamento "pigro" (lazy) degli stream. Operazioni senza stato e con
stato. Stream ottimizzati per i tipi primitivi: IntStream, DoubleStream
e LongStream. Come ottenere uno stream: da elenco di valori, da una
Collection, da un array, da un file. Il pattern Builder, la sua importanza nel paradigma orientato agli oggetti e il suo uso negli stream mediante operazioni intermedie e terminali. Operazioni intermedie e terminali degli stream.
mercoledì 9 maggio 2018
Lab del 09/05/2018: esercizi sui generici; test dell'homework 3
Esercizi sui generici: classe Record; ListaLinkata generica; MultiMappa generica. Definizione della classe JUnit di test dell'homework 3.
lunedì 7 maggio 2018
Lezione del 08/05/2018 (R): i tipi generici
Introduzione ai tipi generici. Generici e collezioni: interfacce generiche prototipiche. Definire un metodo generico. Calcolare il massimo di una collezione di elementi di tipo generico. Sicurezza dei generici a tempo di compilazione: confronto con gli array. Jolly come tipi generici. Esempio: metodo generico di somma. Cancellazione del tipo (type erasure). Esempio: cancellazione del tipo nella classe Coppia e nel metodo getMassimo. Esercizio: cancellazione del tipo nella classe Pila.
venerdì 4 maggio 2018
Lezione del 04/05/2018: riferimenti a metodi; metodi di Comparator; interfacce funzionali standard; pila e coda.
Espressioni lambda per specificare il Comparator. Riferimenti a metodi:
statici, d'istanza con riferimento, d'istanza con classe. Ordinamento
di una collection in Java 8 vs. Java 7. Metodi di default e statici
dell'interfaccia Comparator. Interfacce funzionali standard: Predicate, Function, Supplier, Consumer. Pila e coda in Java.
mercoledì 2 maggio 2018
venerdì 27 aprile 2018
Lezione 27/04/2018: le Collection (1/2)
Le Collection. Gerarchia delle interfacce di tipo Collection: Iterable, Collection, List, Set, SortedSet, Queue. Tre modi per iterare su una collezione. L'interfaccia Iterator. Esempio: il Jukebox. Collezioni fondamentali: ArrayList, LinkedList, HashSet, TreeSet, HashMap, LinkedHashMap, TreeMap. Metodi di ogni collezione. ListIterator e il metodo listIterator. Esempi di uso di HashSet e TreeSet. Funzionamento di un HashSet: il metodo hashCode. HashMap e TreeMap: l'interfaccia Map. L'interfaccia Comparable. Ordinamento con l'interfaccia Comparator. Insiemi e mappe con elementi (o chiavi) senza ordinamento, con ordinamento naturale e con ordinamento di inserimento. I metodi keySet, values e entrySet di Map. Espressioni lambda per specificare il Comparator.
martedì 24 aprile 2018
Lezione del 24/04/2018 (ER): Eccezioni
Eccezioni. Casi tipici nella programmazione Java. Eccezioni notevoli. Perché non restituire un valore d'errore. Vantaggi e svantaggi delle eccezioni. Cosa gestire e cosa non gestire con le eccezioni. Il blocco try-catch-finally. La politica catch-or-declare: gestire o ignorare le eccezioni. Creare eccezioni personalizzate. Le parole chiave throw e throws. La classe Throwable. La gerarchia delle eccezioni in Java. Le classi Exception e Error. Eccezioni checked e unchecked. Esercizi (da svolgere a casa): SequenzaAGradini, FloppyDisk, Dizionario e Mappa, Catena di volontari.
sabato 21 aprile 2018
venerdì 13 aprile 2018
Lezione del 13/04/2018: esercizi di preparazione all'esonero
Lezione importante di preparazione all'esonero. L'esercizio EssereVivente, con eccezioni, classi e metodi astratti, polimorfismo, ecc. Implementazione di interfacce (esercizio Cercabile). Introduzione dell'interfaccia Set e sua implementazione HashSet. Importanza dell'implementazione di equals e hashCode (es. Tupla2) in relazione al funzionamento di List e Set. Metodo Objects.hash per calcolare l'hashCode degli oggetti di una classe. Classi interne e anonime, interfacce funzionali e lambda. Aggiungere la funzionalità di comparabilità durante l'implementazione di una classe (Comparable<T>) e dopo aver chiuso il codice di una classe (l'interfaccia funzionale Comparator<T>). Ordinamento mediante Comparator: Collections.sort(lista, comparator) e List.sort(comparator). Esempi di espressioni lambda. Utilizzare le espressioni lambda per implementare un comparator e per implementare funzioni arbitrarie (es. FunzioniSuInsieme).
mercoledì 11 aprile 2018
Lab dell'11/04/2018: iterabilità (Iterable e Iterator), comparabilità (Comparable vs. Comparator), classi interne, classi annidate, classi anonime, interfacce funzionali, lambda
Esercizi su classi interne: l'esempio della lista linkata di elementi interi implementati mediante classe statica annidata. Iterabilità: iteratore un testo per righe; iterare una lista linkata implementando l'interfaccia java.lang.Iterable e l'interfaccia java.util.Iterator mediante classe interna o classe anonima (sua definizione). Le interfacce Comparable e Comparator. Intefacce funzionali. Espressioni lambda.
martedì 10 aprile 2018
Lezione del 10/04/2018 (8.15-10.30+12.50-14.10): metodi e classi final; interfacce. Iterabilità mediante Iterator e Iterable.
Metodi e classi final. Interfacce in Java: dichiarazione, implementazione. Esempio: Iterabile. Differenza tra interfacce e classi astratte. Ereditarietà multipla: il problema del diamante. Interfacce notevoli. Esercizio: MyString con Iterator e Iterable. Interfacce notevoli. Classi interne e anonime.
venerdì 6 aprile 2018
Lezione del 06/04/2018: polimorfismo e classe Object
Polimorfismo: definizione, esempi e casistiche. Esempi: la classe Impiegato, ImpiegatoStipendiato e ImpiegatoACottimo. La parola chiave super per accedere a metodi e campi della superclasse. L'operatore instanceof. Downcasting e upcasting: differenze ed effetti sull'interfaccia pubblica. La classe universale Object e i suoi metodi principali: clone, equals, getClass, hashCode, toString. Sovrascrivere i metodi toString, equals e clone.
mercoledì 4 aprile 2018
Lab del 04/04/2018: espressioni matematiche, debugger in Eclipse, generazione javadoc, moduli Java 9, ArrayList e suoi metodi, Javafx e Jetris
Laboratorio molto denso: esercizio Espressioni Matematiche per verificare la conoscenza di ereditarietà e polimorfismo, con due soluzioni: mediante sottoclassi di EspressioneBinaria e mediante enumerazioni di EspressioneBinaria. Debugger in Eclipse. enerazione automatica della documentazione javadoc. Brevissima introduzione ai moduli Java 9: module-info.java, parole chiave module, exports, requires, requires transitive. ArrayList e i suoi metodi, javafx e Jetris. Il costrutto "for each".
mercoledì 28 marzo 2018
Lab del 28/03/2018: esercizi sull'ereditarietà
Esercizi (dalle diapositive): BarraDiEnergia, ListaOrdinataDiInteri, Tetris.
Lezione del 27/03/2018: ereditarietà
Una lezione molto molto importante sull'ereditarietà: abbiamo introdotto il concetto di ereditarietà, di classi e metodi astratti, parole chiave this e super nei costruttori. Funzionamento dei costruttori nella gerarchia di ereditarietà. Differenza tra overriding e overloading. Visibilità di campi e metodi: pubblica, privata, protetta e di package. Introduzione a JUnit.
mercoledì 21 marzo 2018
martedì 20 marzo 2018
Lezione del 20/03/2018: metodi e campi statici; enumerazioni; classi wrapper; autoboxing/unboxing
Vantaggi dei metodi e dell'incapsulamento. Metodi e campi statici: modalità di accesso dall'interno e dall'esterno della classe. Perché il main() è static? Importazione statica di campi e metodi.
Autoboxing (vedi immagine sotto :-)), auto-unboxing. Classi wrapper e metodi e costanti delle classi wrapper. Confrontare valori di tipi primitivi vs. oggetti vs. valori di enumerazioni. Esercizi su heap & stack.
Enumerazioni. Esempio: SemeCarta e ValoreCarta. Dichiarazione di una enumerazione. Costruttori, campi e metodi di un'enumerazione. I metodi values e valueOf. Enumerazioni e switch.
venerdì 16 marzo 2018
Lezione del 16/03/2018: gli array; esercizio su heap & stack
Gli array. Definizione, inizializzazione, accesso agli elementi, lunghezza di un array. Matrici mediante array di array. Esercizio su heap & stack.
mercoledì 14 marzo 2018
Lab del 14/03/2018 (S): stringhe, costrutti di controllo e di iterazione
Esercizi su stringhe, flussi di controllo (switch-case), operatori di pre/post incremento e cicli for/while. Dopo aver svolto una serie di semplici esercizi per ognuna
delle tematiche sopra citate, abbiamo affrontato nel dettaglio
l'esercizio Cornice. Siamo partiti dalla definizione di un
metodo statico in grado di stampare una matrice di caratteri NxN,
abbiamo arricchito il metodo aggiungendo la possibilità di inserire una
stringa all'interno della cornice ed infine, chiarendo la differenza tra
metodo statico e metodo di istanza, abbiamo strutturato la classe
CorniceStampabile definendo i campi, due costruttori (overloading) ed il
metodo di classe toString(), focalizzando l'attenzione sulle buone norme
di scrittura del codice.
martedì 13 marzo 2018
Lezione del 13/03/2018 (ER): decisione (if, ?, switch); iterazione (while, for)
Strutture di controllo: if, else, il problema dell'else sospeso, else if, operatore di selezione ?, istruzione switch. Esercizi: estrazione del carattere centrale, saluto casuale. Introduzione ai costrutti iterativi: while, do..while, for. Le istruzioni break e continue. Eleganza del codice e coding horror.
venerdì 9 marzo 2018
mercoledì 7 marzo 2018
Lezione del 06/03/2018: classi e oggetti, campi, metodi e costruttori
Consapevolezza del tipo di dato. Conversione esplicita, cast esplicito, cast implicito. Concetti fondamentali di programmazione orientata agli oggetti: classi vs. oggetti, campi e metodi (inclusi i costruttori) e politiche di accesso. Esercizi: La classe Contatore.
venerdì 2 marzo 2018
Lezione del 02/03/2018: Introduzione al corso (2), concetti fondamentali, JDK, jshell, tipi primitivi, letterali e variabili
Oggi abbiamo completato l'introduzione al corso, fornito una panoramica sugli argomenti principali del corso (oggetti, incapsulamento, ereditarietà, polimorfismo) e parlato di tipi di dato primitivi, variabili, identificatori e letterali. Installazione di JDK ed Eclipse. Introduzione a JShell.
giovedì 1 marzo 2018
Lezione del 28/02/2018
E la prima lezione è andata!!! Abbiamo anche introdotto brevemente i progetti (ne riparleremo più avanti in queste settimane). Non dimenticatevi di iscrivervi al gruppo di discussione.
mercoledì 28 febbraio 2018
AVVISO IMPORTANTE
IMPORTANTE: La lezione di mercoledì 28 del corso di metodologie di programmazione (M-Z), essendo introduttiva del corso, è anticipata alle ore 11 e sarà svolta in aula P1, invece che in laboratorio.
domenica 7 gennaio 2018
Si parte!
Benvenuto/a! Se sei uno studente del corso di Metodologie di
Programmazione (prof. Navigli), segui le istruzioni qui riportate per
iscriverti: gruppo di discussione e materiale. Come ogni anno, il corso sarà aggiornatissimo, coinvolgente ed entusiasmante! Quest'anno scriveremo un videogioco che conoscete molto bene!
Iscriviti a:
Post (Atom)