====== Programmazione Avanzata ======
----
===== News =====
* **27 Settembre 2018**: Il corso si terrà nel secondo semestre. Le informazioni per chi ha frequentato nell'a.a. 2017/18 sono quelle disponibili al seguente [[http://didattica.cs.unicam.it/doku.php?id=didattica:triennale:pa:ay_1718:main|link]].
* **4 Marzp 2010**: Inizio delle lezioni!
----
===== Informazioni Generali =====
**Docente**: [[https://docenti.unicam.it/pdett.aspx?ids=N&tv=d&UteId=1103&ru=PA|Michele Loreti]]
**Link ESSE3**
* [[https://didattica.unicam.it/Guide/PaginaADErogata.do?ad_er_id=2018*N0*N0*S2*13500*9113&ANNO_ACCADEMICO=2018&mostra_percorsi=S|Programmazione Avanzata - AA 2018/19]]
**Orario delle Lezioni**:
* Lunedì, dalle 14.00 ale 16.00 (Laboratorio LA1)
* Martedì, dalle 11.00 alle 13.00 (Laboratorio LA1)
* Mercoledì, dalle 11.00 alle 13.00 (Laboratorio LA1)
**Canale Telegram**: https://t.me/UniCamPA
**Esercizi con soluzioni**: https://github.com/michele-loreti/ap_examples
**Ricevimento studenti**:
* Mercoledì, dalle 16.00 alle 17.00
* Giovedì, dalle 10.00 alle 11.00
----
===== Obiettivi del Corso =====
**Conoscenze:**
* concetti basilari della metodologia orientata agli oggetti nella progettazione del software;
* caratteristiche principali dei linguaggi orientati agli oggetti, quali Java, e tecniche di programmazione;
* elementi base della programmazione funzionale;
* schemi di soluzioni avanzate a problemi ricorrenti nel design del software.
**Competenze acquisite (al termine del corso)**
Gli studenti dovranno dimostrare di saper usare la metodologia orientata agli oggetti nella progettazione e implementazione di componenti software, che siano facilmente estendibili e riusabili.
**Capacità acquisite (al termine del corso)**
Capacità di sviluppare software flessibile, utilizzando tecniche avanzate orientate agli oggetti.
----
===== Contenuti del Corso =====
Nel corso verrà introdotta, attraverso l'uso del linguaggio Java, la metodologia orientata agli oggetti per la costruzione del software:
- Paradigmi di programmazione: imperativo, funzionale e orientato agli oggetti.
- Principi di Programmazione funzionale.
- Principi di Programmazione Orientata agli Oggetti: Classe, Interfaccia e implementazione nascosta. Il linguaggio Java.
- UML (Unified Modeling Language): il "diagramma di classi" per l'analisi, la progettazione e la documentazione.
- Ereditarietà. Composizione di oggetti e delega di messaggi. Le classi astratte.
- Classi come Tipi. Polimorfismo per sottotipo e polimorfismo parametrico.
- Programmazione test-driven.
- Design Pattern: Singleton, Factory, Composite, Visitor, Decorator, Observer, Template, Strategy.
- Argomenti avanzati: Le lambda-expressions, La dependency-injection.
- Panoramica di altri linguaggi di programmazione: Python, GO, C#, Swift.
- Applicazioni.
----
===== Materiale =====
**Slide del Corso**
* {{ :didattica:triennale:pa:ay_1819:01slides2019.pdf | Slides 1: Introduzione al corso, Paradigmi di Programmazione, Programmazione Funzionale.}}
* {{ :didattica:triennale:pa:ay_1819:02slides2019.pdf | Slides 2: Esercitazione di programmazione funzionale. }}
* {{ :didattica:triennale:pa:ay_1819:03slides2019.pdf | Slides 3: Programmazione Orientata agli Oggetti. }}
* {{ :didattica:triennale:pa:ay_1819:04slides2019.pdf | Slides 4: Interfacce e lambda expression. }}
* {{ :didattica:triennale:pa:ay_1819:05slides2019.pdf | Slides 5: Ereditarietà. }}
* {{ :didattica:triennale:pa:ay_1819:06slides2019.pdf | Slides 6: Generici. }}
* {{ :didattica:triennale:pa:ay_1819:07slides2019.pdf | Slides 7: Esercitazione Java, BSTree }}
* {{ :didattica:triennale:pa:ay_1819:08slides2019.pdf | Slides 8: Principi di progettazione OO }}
* {{ :didattica:triennale:pa:ay_1819:09sides2019.pdf | Slides 9: Eccezioni }}
* {{ :didattica:triennale:pa:ay_1819:10slides2019.pdf | Slides 10: Collezioni }}
* {{ :didattica:triennale:pa:ay_1819:11slides2019.pdf | Slides 11: Streams (di dati)}}
* {{ :didattica:triennale:pa:ay_1819:12slides2019.pdf | Slides 12: Classi di I/O}}
* {{ :didattica:triennale:pa:ay_1819:13slides2019.pdf | Slides 13: Programmazione Concorrente}}
* {{ :didattica:triennale:pa:ay_1819:14slides2019.pdf | Slides 14: Design Patterns}}
* {{ :didattica:triennale:pa:ay_1819:15slides2019.pdf | Slides 15: Logging }}
* {{ :didattica:triennale:pa:ay_1819:16slides2019.pdf | Slides 16: Building di applicazioni Java }}
* {{ :didattica:triennale:pa:ay_1819:17slides2019.pdf | Slides 17: Testing e JUnit }}
* {{ :didattica:triennale:pa:ay_1819:18slides2019.pdf | Slides 18: Introduzione a Gradle }}
* {{ :didattica:triennale:pa:ay_1819:19slides2019.pdf | Slides 19: JavaFX (Parte 1)}}
**Calendario Lezioni**
* Lezione 4/3/2019, 14-16 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/d421d7d482704259b115527afd790029|Registrazione]])
* Lezione 5/3/2019, 11-13 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/797f6ac94f374f9785501710874f0abc|Registrazione]])
* Lezione 6/3/2019, 11-13 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/c1bba0f59a4047bd90f0caa003f8c753|Registrazione]])
* Lezione 11/3/2019, 14-16 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/ec944c1e6ac5430ab46dae77a14afc7e|Registrazione]])
* Lezione 12/3/2019, 11-13 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/802509cc59a34049a7adb52512d1d090|Registrazione]])
* Lezione 13/2/2019, 11-13 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/515752cd2a3b48a8883aea4957796960|Registrazione]])
* Lezione 19/3/2019, 11-13 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/fdd25949973b42adbe9a34f1d9ec3629|Registrazione]])
* Lezione 20/3/2019, 11-13 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/7b5e9c3c885143c09189959d22cc3d41|Registrazione]])
* Lezione 25/3/2019, 14-16 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/c8f6856c306143539afd336fe27f9d4b|Registrazione]])
* Lezione 26/3/2019, 11-13 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/8c5bb02185e247a6ac180585fd54520e|Registrazione]])
* Lezione 27/3/2019, 11-13 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/6ebffecd4cb44cf986ed3855d2fda696|Registrazione]]) ({{ :didattica:triennale:pa:ay_1819:bstree.zip |Codice}})
* Lezione 1/4/2019, 14-16 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/d9addd6e2fbe44c3b90bb2bfe35aeb58|Registrazione]])
* Lezione 2/4/2019, 11-13 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/d1b79c14ec85418a81596b3b2797c03a|Registrazione]])
* Lezione 3/4/2019, 11-13 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/bf846d093ee34e0d8cdec91da8c3a439|Registrazione]])
* Lezione 9/4/2019, 11-13 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/7068616ffbc64644a0f39ba93c80c684|Registrazione]])
* Lezione 15/4/2019, 14-16 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/26e172f17a1845b7a98ed5f4fa775304|Registrazione]])
* Lezione 29/4/2019, 14-16 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/92594c252e1a4632a62aa506bd9f46e6|Registrazione]]) ({{ :didattica:triennale:pa:ay_1819:battleship2019.zip |Codice esempio Progetto}}) ({{ :didattica:triennale:pa:ay_1819:battleship2019_v2.zip |Codice esempio Progetto V2}})
* Lezione 30/4/2019, 11-13 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/b13286816ece4f40a29f2c8a4a2aed7f|Registrazione]])
* Lezione 6/5/2019, 14-16 (Registrazione non disponibile)
* Lezione 7/5/2019, 11-13 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/84ef389f45cd499690419887b6427d72|Registrazione]])
* Lezione 8/5/2019, 11-13 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/c7177c974e3248018f034753539328a9|Registrazione]])
* Lezione 13/5/2019, 14-17 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/4c1ef86c7c514c118d590ea81f2bac43|Registrazione]])
* Lezione 14/5/2019, 11-13 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/788a5624267942e292459d3bc62624eb|Registrazione]])
* Lezione 15/5/2019, 11-13 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/d997c464ca9e4084a2407c58ccd44399|Registrazione]])
* Lezione 20/5/2019, 14-16 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/4b1bf8caff874d0f98db5682899dbe91|Registrazione]])
* Lezione 21/5/2019, 11-13 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/ba87cda3ad8842fcb66c0389ee8d1706|Registrazione]])
* Lezione 22/5/2019, 11-13 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/1f661b81463440e2bf2a2f11100ecb17|Registrazione]])
* Lezione 27/5/2019, 14-16 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/b32cb7c41cdc43ec95c272e6384862e0|Registrazione]])
* Lezione 28/5/2019, 11-13 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/692320488c484ed3b9e8b6fbeebeffae|Registrazione]])
* Lezione 29/5/2019, 11-13 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/346b1a88c643406e91523dd60ccccdee|Registrazione]])
* Lezione 05/6/2019, 11-13 ([[https://unicam.webex.com/recordingservice/sites/unicam/recording/playback/5fa6840f117f4432b8149d28dc8f7e36|Registrazione]])
**Esercizi**
* [[didattica:triennale:pa:ay_1819:esercizifunzionale|Programmazione Funzionale]]
**Riferimenti**
* [[http://fsharp.org|Il linguaggio F#.]]
**Testi di Riferimento**
* Core Java SE 9 for the Impatient, Cay Horstmann, Second Edition, Addison-Wesley 2017
----
===== Modalità d'esame =====
L'esame consiste in:
- Una prova scritta per verificare le conoscenze base introdotte nel corso;
- Un progetto (che può essere svolto in gruppo) per valutare la capacità di applicare le metodologie presentate nel corso;
- Un colloquio orale per discutere il progetto e per valutare le competenze acquisite.
Per poter consegnare il progetto tutti i membri del gruppo devono aver superato con successo la prova scritta nella stessa sessione della consegna. Tutti i membri di un gruppo devono svolgere il colloquio orale nella stessa data.
----
==== Progetti ====
- Il progetto dovrà essere consegnato (**solo dopo aver passato lo scritto**) in un archivio ''.tgz'' contenente, oltre al codice, una relazione descrittiva del lavoro svolto;
- Il progetto può essere svolto in gruppo composto da al più tre persone, i membri del gruppo devono essere comunicati al docente almeno 15 giorni prima della consegna utilizzando il seguente [[https://forms.gle/12GzToLiUayUvJ9d6|link]];
- La valutazione del progetto terrà conto di (griglia di valutazione disponibile al seguente [[didattica:triennale:pa:ay_1819:grigliavalutazioneprogetti|link]]) :
* Corretto funzionamento;
* Organizzazione e progettazione del codice;
* Conoscenza da parte di tutti i membri del gruppo.
**Specifica**
L'obiettivo del progetto è quello di sviluppare un semplice gioco in Java. Ogni gruppo può liberamente scegliere tra i seguenti progetti:
* [[https://it.wikipedia.org/wiki/Formula_1_(gioco)|Formula 1]]
* [[https://it.wikipedia.org/wiki/Forza_quattro|Forza quattro]]
* [[https://en.wikipedia.org/wiki/Sprouts_(game)|Sprouts]]
* [[https://en.wikipedia.org/wiki/Dots_and_Boxes|Punti e Quadrati]]
* [[https://en.wikipedia.org/wiki/Paper_soccer|Paper Soccer]]
* [[https://it.wikipedia.org/wiki/Mastermind|Mastermind]] (**Progetto non più disponibile**)
Altri tipologie di giochi possono essere proposti al docente che potrà valutarne l'opportunità ed aggiungerli eventualmente alla lista.
All'interno del progetto dovranno essere sviluppate le classi/interfacce che consentano:
- La gestione della partita;
- La definizione di giocatori personalizzati (per definire avversari "automatici");
- La gestione dell'interazione dell'utente.
La relazione dovrà descrivere:
- L'architettura delle classi sviluppate;
- Per ogni classe dovranno essere descritte le //responsabilità//;
- Come il codice presentato può essere //esteso// per integrare nuove funzionalità.
**Modealità di Consegna**
Almeno 15 giorni prima della consegna ogni gruppo si deve registrare al seguente [[https://forms.gle/12GzToLiUayUvJ9d6|link]]. Il progetto dovrà essere caricato entro le 23.59 del giorno della scadenza attraverso il sito [[https://classroom.google.com/u/0/c/MTU4NDAxNDAxOTZa|classroom]], codice di iscrizione **jm6d7s2**.
----
===== Esami =====
**Date Prove Scritte A.A. 2018/2019** ({{ :didattica:triennale:pa:ay_1819:esempiocompito.pdf |Esempio Compito}})
*11/06/2019, Ore 15.00, Aula AB2 Polo Lodovici: {{ :didattica:triennale:pa:ay_1819:20190611.pdf |Compito}}, {{ :didattica:triennale:pa:ay_1819:risultati190611.pdf |Risultati}} (hanno superato la prova gli studenti con votazione >= 5).
*27/06/2019, Ore 15.00, Aula AB2 Polo Lodovici: {{ :didattica:triennale:pa:ay_1819:20190627.pdf |Compito}}, {{ :didattica:triennale:pa:ay_1819:risultati190627.pdf |Risultati}} (hanno superato la prova gli studenti con votazione >= 5).
*16/07/2019, Ore 15.00, Aula AB1 Polo Lodovici: {{ :didattica:triennale:pa:ay_1819:20190716.pdf |Compito}}, {{ :didattica:triennale:pa:ay_1819:risultati190716.pdf |Risultati}} (hanno superato la prova gli studenti con votazione >= 5).
*05/09/2019, Ore 10:00, Aula AB1 Polo Lodovici: {{ :didattica:triennale:pa:ay_1819:20190905.pdf |Compito}}, {{ :didattica:triennale:pa:ay_1819:risultati190905.pdf |Risultati}} (hanno superato la prova gli studenti con votazione >= 5).
*24/09/2019, Ore 10:00, Aula AB1 Polo Lodovici {{ :didattica:triennale:pa:ay_1819:20190924.pdf |Compito}}, {{ :didattica:triennale:pa:ay_1819:risultati190924.pdf |Risultati}} (hanno superato la prova gli studenti con votazione >= 5).
*04/02/2020, Ore 15:00, Aula AB1 Polo Lodovici {{ :didattica:triennale:pa:ay_1819:20200204.pdf |Compito}}, {{ :didattica:triennale:pa:ay_1819:risultati200204.pdf |Risultati}} (hanno superato la prova gli studenti con votazione >= 5).
*21/02/2020, Ore 10:00, Aula AB1 Polo Lodovici {{ :didattica:triennale:pa:ay_1819:20200221.pdf |Compito}}, {{ :didattica:triennale:pa:ay_1819:risultati200221.pdf |Risulati}} (hanno superato la prova gli studenti con votazione >= 5)..
**Date Consegna Progetti A.A. 2018/2019** (Possono consegnare solo gli studenti che hanno superato la prova scritta)
*19/06/2019, discussioni a partire dal 24/06/2019 ([[didattica:triennale:pa:ay_1819:calendarioprimoappello|Calendario Discussioni]])
*05/07/2019, discussioni a partire dal 09/07/2019 ([[didattica:triennale:pa:ay_1819:calendariosecondoappello|Calendario Discussioni]])
*22/07/2019, discussioni a partire dal 25/07/2019 ([[didattica:triennale:pa:ay_1819:calendarioterzoappello|Calendario Discussioni]])
*12/09/2019, discussioni a partire dal 16/09/2019 (**Nessun progetto Consegnato**)
*27/09/2019 4/10/2019, discussioni a partire dal 8/10/2019 ([[didattica:triennale:pa:ay_1819:calendarioquartoappello|Calendario Discussioni]])
*14/02/2020, discussioni a partire dal 17/02/2020 ([[didattica:triennale:pa:ay_1819:calendariofebbraio1|Calendario Discussioni]])
*24/02/2020 28/02/2020 , discussioni a partire dal 3/3/2020 ([[didattica:triennale:pa:ay_1819:calendariofebbraio2|Calendario Discussioni]])