Università degli Studi di Udine Dipartimento di Matematica e Informatica 33100 - UDINE (UD) Via delle Scienze, 206 Tel. 432 558400 CORSO SULLA PROGRAMMAZIONE ORIENTATA AGLI OGGETTI IN JAVA Istituto Tecnico Industriale “V. Volterra” di S. Donà di Piave Obiettivi del corso Il corso si propone di introdurre le principali idee della programmazione orientata agli oggetti attraverso il linguaggio Java, mettendo in rilievo il ruolo centrale dei processi di astrazione e la ricerca di strumenti che consentano di “dare vita” ai modelli astratti nell’ambito dei programmi. La discussione cercherà anche di evidenziare potenzialità e criticità da un punto di vista didattico, che non può trascurare il notevole sforzo richiesto agli allievi per apprendere e assimilare i processi di astrazione. Prerequisiti: Una minima esperienza di programmazione con qualche linguaggio procedurale (per esempio: Pascal, C) può senza dubbio favorire la fruizione del corso. Contenuti del corso Per quanto possibile, le caratteristiche di base del linguaggio Java non verranno esposte secondo uno schema manualistico di tipo sistematico, ma verranno preferibilmente presentate in relazione a (semplici) esempi, nell’intento di fare emergere idee e modelli generali di riferimento. Auspicabilmente, al termine del corso i partecipanti saranno in grado di orientarsi autonomamente nel vastissimo mondo di Java e di scegliere gli argomenti da approfondire in base ai propri interessi e/o ai propri obiettivi didattici. 1. Introduzione (4 ore) Principali approcci all’insegnamento della programmazione: imperative-first, functional-first, object-first, hardware-first, algorithm-first; esempi; possibili vantaggi e svantaggi dal punto di vista didattico. L’astrazione nella programmazione: astrazione su memoria e controllo, astrazione procedurale, astrazione sui dati, astrazione sullo stato, astrazioni relative ai tipi; linguaggi orientati agli oggetti e strumenti linguistici per esprimere le forme dell’astrazione. Ambienti e strumenti didattici per lo sviluppo di programmi in Java: DrJava, BlueJ, JavaPowerTools; motivazioni alla base delle possibili scelte. Ambienti visuali di supporto allo sviluppo di interfacce grafiche (p.es. NetBeans); vantaggi e svantaggi in un contesto didattico. 2. Astrazione procedurale in Java (4 ore) Rappresentazione di funzioni in Java attraverso metodi static; variabili (parametri) ed espressioni; un po’ di terminologia. Classi come collezioni di metodi static. Applicazione di funzioni nell’ambiente di sviluppo DrJava. Assegnazione e strutture di controllo per formalizzare semplici programmi. Metodi funzionali e metodi procedurali. Input/output testuale standard in Java. Approccio funzionale e approccio sequenziale a confronto dal punto di vista didattico. Valori e oggetti in Java; tipi primitivi (tipi numerici, boolean, char); tipi di oggetti usati frequentemente (tipi array, String); assegnazione di valori e oggetti; passaggio dei parametri in Java. 3. Astrazione sui dati e astrazione sullo stato: concetto di incapsulamento (6 ore) Astrazione sui dati e classi di oggetti immutabili; concetto di classe e relativo protocollo; campi, costruttori e metodi; caratterizzazione dei campi per mezzo degli attributi final (valori immutabili) e static final (costanti); definizione dell’ambito di visibilità e incapsulamento: attributi public e private. Esempi relativi alla definizione di strutture dinamiche (liste, alberi). Interazione nello stile funzionale (metodi funzionali + oggetti immutabili) utilizzando l’ambiente DrJava; motivazioni didattiche alla base dell’approccio: semplificazione dell’interazione. Astrazione sullo stato e classi di oggetti che evolvono; variabili di stato e ruolo dei costruttori; metodi per acquisire informazioni sullo stato e metodi per modificare lo stato; metodi di supporto (private). Confronto fra oggetti: interpretazione di == e equals; equals per oggetti immutabili e per oggetti che evolvono. Garbage collection. Creazione e uso di oggetti nell’ambiente DrJava. 4. Astrazioni relative ai tipi: eredità e polimorfismo (6 ore) Principali forme dell’eredità: specializzazione, estensione, eredità per specifica; caratteristiche e utilizzo dell’eredità in Java, relazioni fra tipi (classi) e compatibilità per sostituzione. Eredità e specializzazione: overriding di metodi; funzione dei costruttori in relazione all’eredità; costruttori definiti implicitamente; ruolo della classe Object. Eredità ed estensione: overloading di costruttori e metodi. Eredità e specifica: interfacce; metodi e classi abstract; disciplina dell’eredità multipla in Java. Rappresentazione delle relazioni fra classi nell’ambiente di sviluppo BlueJ; motivazioni didattiche. Creazione e uso di oggetti nell’ambiente BlueJ. Polimorfismo, variabili polimorfe e condivisione del codice ad alto livello; selezione dinamica dei metodi (pubblici) nel modello computazionale di Java; utilizzo della classe Object in relazione al polimorfismo. 5. Modelli di riferimento per lo sviluppo di programmi in Java (6 ore) Modello relativo alla gestione di eccezioni: dichiarazione throws, comando throw e costrutto trycatch; gerarchie Exception e RuntimeException. Modello relativo alla gestione di stream di input/output; stream basati sul trasferimento di byte (InputStream/OutputStream) e di caratteri (Reader/Writer); struttura della gerarchia di classi e componibilità delle istanze; accesso al file-system; trasferimento di oggetti attraverso stream e interfaccia Serializable. Modello relativo alla gestione dei thread: classe Thread, interfaccia Runnable e metodo run(). Sincronizzazione di thread: attributo di metodi (e costrutto) synchronized. Esempi di uso comune nell’ambito delle librerie API di Java e organizzazione in package. 6. Modelli di riferimento per lo sviluppo di interfacce grafiche (6 ore) Realizzazione di interfacce grafiche (GUI) secondo il modello AWT di Java; principali componenti e gestione del layout; componibilità ad albero; utilizzo del metodo paint(Graphics). Modello relativo alla gestione degli eventi in Java; definizione di “ascoltatori di eventi” e ruolo delle interfacce associate (eredità per specifica). Utilizzo di strumenti didattici per semplificare la realizzazione di GUI: JavaPowerTools. Esempi di sviluppo in ambiente visuale (p.es. NetBeans) e considerazioni didattiche. Programmi attraverso il web: il modello delle applet in Java. Cenni all’utilizzo di elementi multimediali (immagini e suoni) nelle interfacce grafiche. 7. Modelli di riferimento per il progetto di soluzioni orientate agli oggetti (4 ore) Progettazione orientata agli oggetti: identificazione di componenti e interazioni, definizione delle responsabilità (schede CRC). Organizzazione del codice in Java: classi nidificate e classi interne; confronto fra eredità e aggregazione fra classi. L’ambiente BlueJ come supporto all’analisi della struttura di un progetto. Cenni ad alcuni esempi notevoli di design pattern, da individuare fra i seguenti schemi: modelview-controller, observer, composite, decorator, prototype, iterator, proxy, strategy. 8. Tecniche di programmazione avanzate (4 ore) Cenni alla programmazione in rete: modalità di comunicazione attraverso soket; classi Socket e ServerSocket; gestione delle sessioni attraverso thread indipendenti. Cenni sull’accesso a basi di dati: protocollo JDBC; connessione e interrogazione di una base di dati. Ruolo degli iteratori e interfaccia Iterator. Commenti I tempi riportati sono solo indicativi (e probabilmente sottostimati); saranno gli interlocutori a determinare il ritmo più adeguato per lo svolgimento delle lezioni e l’eventuale scelta degli argomenti cui dare maggior risalto nel caso si dovesse rinunciare a qualcosa. Gli strumenti che penserei di adoperare per lo svolgimento delle lezioni sono una lavagna tradizionale (possibilmente con un’ampia superficie) e un videoproiettore a cui collegare un portatile personale. Alcune attività potranno essere svolte in un laboratorio informatico (e a tal fine spero di potermi avvalere di un collaboratore che sto cercando di individuare all’interno della mia istituzione); in ogni caso, tutti gli strumenti software indicati nella descrizione dei conentuti del corso sono disponibili gratuitamente attraverso la rete e possono essere installati sostanzialmente su tutte le principali piattaforme. Udine, Giugno 2005 Claudio Mirolo Riferimenti bibliografici D. Arnow, G. Weiss Introduction to Programming Using Java: An Object-Oriented Approach Addison-Wesley, 1998 D.J. Barnes, M. Kölling Programmare in BlueJ – Introduzione alla programmazione a oggetti Addison-Wesley, 2003 (Edizione italiana) T. Budd Understanding Object-Oriented Programming with Java Addison-Wesley, 2000 T. Budd Introduction to Object-Oriented Programming Addison-Wesley, 2002 B. Eckel Thinking in Java Prentice Hall, 2000 J. Graba Introduction to Network Programming with Java Addison-Wesley, 2004 X. Jia Object Oriented Software Development Using Java Addison-Wesley, 2002 P. Kuchana Software Architecture Design Patterns in Java Auerbach Publications, 2004J. Lewis, W. Loftus Java - Fondamenti di progettazione software Addison-Wesley, 2000 (Edizione italiana 2001) B. Liskov, J. Guttag Program Development in Java Addison-Wesley, 2000