====== 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]])