INTRODUZIONE Java è oggi, per svariati motivi, il linguaggio più adatto per i corsi introduttivi di programmazione. Internet è sempre più diffuso; le applicazioni per il Web stanno diventando il modello di software più comune; Java è il linguaggio di programmazione per Internet. Java offre anche strumenti di sviluppo molto avanzati, numerosi package per la programmazione di applicazioni di ogni tipo, comprese quelle multithread, e quelle con interfacce grafiche avanzate; inoltre, è estremamente portabile, essendo progettato per essere indipendente dalle architetture hardware. L’importanza della sicurezza e della sicurezza ha assunto nuovi significati nel corso degli anni; Java offre un supporto integrato a queste problematiche. Poiché è orientato a oggetti, Java è un ottimo strumento pedagogico per l’ingegneria del software e per illustrare i concetti riguardanti la programmazione. PRESENTAZIONE Lo sviluppo di questo libro e del materiale di supporto è stato rivolto a garantire a chi apprende questo linguaggio di programmazione tutto il supporto di cui ha bisogno. La maggior parte dei concetti più importanti dell’informatica non possono essere ben compresi se non si sa che cos’è un programma e come lo si scrive. Purtroppo, apprendere l’arte di programmare è difficile; come scrivere bene, programmare bene richiede anni di pratica. Insegnare a programmare è un po’ come insegnare a scrivere. Gli studenti possono imparare molto leggendo esempi di buona prosa e ripetendo esercizi di scrittura in cui possono imparare a organizzare le idee, in modo da presentarle nella maniera più efficace. Per sviluppare la propria abilità di scrittura, gli studenti partiranno dallo scrivere pochi paragrafi, arrivando a creare prose più lunghe, come saggi, novelle o racconti. Il sistema utilizzato in questo libro è molto simile. Nel corso del testo, vengono presentati e trattati approfonditamente molti esempi di programmazione, buona e cattiva. Una serie di verifiche e di esercizi danno agli studenti l’opportunità di far pratica nella progettazione, nell’organizzazione e nella scrittura di codice. Oltre a ciò, il libro contiene molti esempi che possono essere modificati, per migliorare costantemente le proprie capacità di programmazione. XVI Introduzione Questo metodo di insegnamento è molto efficace, perché fa sì che gli studenti siano partecipanti attivi: devono leggere e capire il codice. SCOPO DEL LIBRO Il libro è pensato per un corso di programmazione introduttivo ed è particolarmente adatto a persone provenienti da diverse discipline. Non si dà per scontata una precedente esperienza di programmazione, né particolari capacità nel campo informatico. Gli obiettivi primari del testo sono: ■ Presentare agli studenti la programmazione in linguaggio Java. ■ Presentare e incoraggiare l’uso della programmazione orientata agli oggetti. ■ Dimostrare tecniche efficaci per la soluzione di problemi. ■ Stimolare gli studenti con esempi tratti dal mondo reale. ■ Insegnare i concetti di progettazione su cui si basa l’ingegneria del software. ■ Presentare agli studenti le librerie di base e grafiche di Java. ■ Fornire agli studenti gli strumenti pratici per modificare codice esistente. ■ Offrire esempi istruttivi di programmazione buona e cattiva. ■ Spiegare approfonditamente come si eseguono testing e debugging. VANTAGGI DEL LIBRO Il testo tratta approfonditamente tutto il materiale che dev’essere trattato in un corso introduttivo sulla programmazione, oltre che presentare molto del materiale che viene generalmente trattato in corsi successivi. L’ampiezza dei capitoli rende il libro estremamente flessibile per gli insegnanti, che possono scegliere come e quando trattare argomenti specifici. Alcune caratteristiche: ■ Introduzione agli oggetti. Il libro presenta un’introduzione leggera, benché approfondita, agli oggetti e al loro uso. L’insegnamento del paradigma della programmazione a oggetti nei corsi introduttivi si è dimostrato molto efficace nel corso degli anni; Java è il linguaggio più adatto per spiegare questi concetti. Spiegare le classi definite dall’utente al termine di un corso impedisce agli studenti di integrarle nel proprio modo di pensare alla programmazione a oggetti, oltre ad avere l’altro importante svantaggio che si finisce per trattarne molto superficialmente. Il libro presenta perciò molto presto gli oggetti. Gli studenti iniziano a usare gli oggetti dei package standard fin dall’inizio e vengono portati a sviluppare programmi significativi che risolvono problemi interessanti. Sulla base di questa solida introduzione, vengono poi presentati i concetti di base delle classi e della progettazione orientata agli oggetti. Dopo aver esplorato le strutture di controllo, metodi, classi e progettazione orientata agli oggetti saranno trattati più approfonditamente. Introduzione XVII ■ Importanza alla soluzione di problemi. Uno dei più grossi ostacoli che molti studenti incontrano è non conoscere le tecniche di base per la soluzione di problemi. Il testo affronta questo argomento spiegando fin dal Capitolo 1 le basi della soluzione di problemi, applicando quindi i nuovi concetti in ciascun capitolo a diversi tipi di problematiche. Agli studenti vengono presentati esempi che illustrano tecniche efficaci per la soluzione di problemi, dopodiché possono esercitarsi a risolverne di simili. ■ Introduzione ai concetti dell’ingegneria del software. I concetti base dell’ingegneria del software vengono presentati per mezzo dello studio di problemi e di progetti software. Oltre a numerosi piccoli esempi, ciascun capitolo contiene uno o più problemi di ampio respiro, dei quali vengono fornite analisi e progettazione orientata agli oggetti, nonché gli algoritmi necessari per realizzare il programma. ■ Testing e debugging. Un’importante capacità dei programmatore è sapere come si fa a eseguire il testing e il debugging delle applicazioni. Nel Capitolo 13 vengono presentati molti concetti importanti di ingegneria del software che riguardano questi due importanti aspetti della programmazione. I paragrafi riguardanti il debugging cercano di insegnare agli studenti come usare il metodo scientifico per trovare gli errori. Dopo l’introduzione alle strutture di controllo, il materiale di questo capitolo può essere insegnato in qualsiasi momento. ■ Esempi interessanti. Gli studenti possono imparare da situazioni interessanti che potrebbero incontrare nella vita reale. Case study e progetti di programmazione sono presi dai campi più diversi, come l’esercizio fisico, lo spam, la diagnosi medica, l’analisi statistica, la tipizzazione psicologica, la visualizzazione dei dati, i grafici, il divertimento e le animazioni. Con questa varietà di esempi, il testo dimostra come i programmatori possono partecipare e contribuire alla vita di tutti i giorni. ■ Uso esclusivo delle classi standard di Java. Il testo usa solo le classi standard di Java; in particolare, non ci sono classi scritte appositamente per l’acquisizione dell’input. Le classi e le tecniche standard sono presentate in modo adatto ai programmatori principianti. ■ Consigli di programmazione e di stile. Oltre a spiegare Java e la programmazione orientata agli oggetti, il testo fornisce anche diversi consigli su come migliorare le proprie capacità di programmazione. Contiene infatti diversi consigli su argomenti come l’evitare gli errori di programmazione più comuni, scrivere codice leggibile e seguire le prassi comuni di ingegneria del software. ■ Verifiche, esercizi e progetti software. Ciascun capitolo contiene una sezione dedicata alle verifiche personali, che rende in grado gli studenti di valutare le abilità conseguite. Il testo contiene centinaia di esercizi, le cui soluzioni sono disponibili per gli insegnanti attraverso l’editore. Dopo che nel Capitolo 2 sono state presentate le basi di Java, tutti i capitoli presentano un progetto di programmazione che serve a esercitarsi sui concetti appresi. ■ Appendici di riferimento. Le Appendici C, D ed E sono quasi duecento pagine contenenti la descrizione delle API standard di Java. Il testo è quindi anche un manuale di riferimento, utilissimo anche dopo il termine del corso. XVIII Introduzione CONTENUTO DEL VOLUME Di seguito riportiamo le caratteristiche principali di questo volume. INTRODUZIONE Ogni capitolo inizia con una breve introduzione, che focalizza l’attenzione dello studente e lo prepara al materiale che seguirà. Vengono subito messi in luce gli aspetti che saranno trattati nel corso del capitolo. OBIETTIVI Dopo l’introduzione c’è un elenco degli obiettivi del capitolo, che rappresentano ciò che lo studente dovrebbe aver appreso al termine della lettura. L’elenco consente agli studenti di misurare il proprio progresso e il loro livello di comprensione e serve da guida per gli insegnanti, che lo possono utilizzare per preparare test e quiz. ICONE E NOTE Icone e note contengono avvertimenti, suggerimenti stilistici, materiale avanzato e informazioni riguardanti il linguaggio Java. Indica un avvertimento di programmazione. Spesso è un consiglio su come evitare errori comuni di programmazione. Indica che il materiale associato è relativo allo stile di programmazione Indica che il materiale associato è relativo al linguaggio Java. Indica consigli di programmazione o approfondimenti sull’argomento in discussione. Introduzione XIX FORMATTAZIONE DEL CODICE La formattazione dei listati ne rende più facile la lettura. Ogni listato completo ha il proprio numero di riferimento e ogni riga è numerata. DIAGRAMMI UML L’uso di diagrammi UML chiarisce le relazioni fra classi, facendo al contempo sì che gli studenti si abituino a questo diffusissimo sistema di notazione. CASE STUDY Ogni capitolo include diversi case study, pensati per insegnare tecniche efficaci per la soluzione di problemi e per rendere più sicuro l’apprendimento dei concetti di programmazione orientata agli oggetti e di ingegneria del software. All’inizio di ciascun case study viene presentato il suo obiettivo; i vari passaggi sono indicati da apposite icone. I case study sono facoltativi: semplicemente, applicano i concetti espressi nel capitolo, senza introdurne di nuovi. RIEPILOGO A FINE CAPITOLO Al termine di ogni capitolo è presente un riepilogo punto per punto dei concetti trattati. VERIFICHE In ogni capitolo è presente una verifica con risposte alla fine del capitolo stesso. Queste verifiche sono pensate per aiutare gli studenti a valutare se hanno ben compreso gli obiettivi del capitolo e per ribadire i concetti espressi nel testo. PROGETTI DI PROGRAMMAZIONE A parte il Capitolo 1, che fornisce il materiale di base, ogni capitolo contiene almeno un case study presentato in maniera tale che lo renda adatto per un esame. ESERCIZI Un paragrafo di esercizi al termine di ogni capitolo presenta diversi problemi che richiedono diversi livelli di impegno. XX Introduzione RIASSUNTO DEI CAPITOLI ■ Capitolo 1: Presentazione — Organizzazione dei computer; software; principi di ingegneria del software engineering; sviluppo orientato agli oggetti; soluzione di problemi. ■ Capitolo 2: Fondamenti di Java — Organizzazione dei programmi; metodo main(); commenti e spazi bianchi; classi, parole chiave, identificatori e convenzioni di denominazione, metodi; esecuzione dei programmi; SDK; costanti; variabili; operazioni; tipi primitivi; operatori; precedenza; programmi interattivi; assegnazione di variabili primitive. ■ Capitolo 3: Gli oggetti — String; variabili per riferimento; null; inserimento, estrazione e concatenamento di stringhe; assegnazione per riferimento; metodi di String. ■ Capitolo 4: Un linguaggio di classe — Classi definite dall’utente; istanziazione di metodi; ispettori; mutatori; facilitatori; grafica di base. ■ Capitolo 5: Decisioni — Algebra booleana e tabelle della verità; espressioni logiche; tipo boolean; uguaglianza booleana e ordine degli operatori; test di uguaglianza di variabili in virgola mobile; precedenza degli operatori; calcolo short-circuit; istruzione if; istruzione if-else; test di stringhe e caratteri; orginamento; istruzione switch. ■ Capitolo 6: Iterazione — Istruzione while; elaborazione di stringhe e caratteri; istruzione for; area di validità degli indici; istruzione do-while. ■ Interludio grafico: Programmazione di interfacce grafiche — Interfacce grafiche; swing; awt; programmazione a eventi. ■ Capitolo 7: Programmare con metodi e classi — Passaggio di parametri; invocazione e controllo di flusso; variabili di classe; area di validità; area di validità locale; riutilizzo dei nomi; sovraccarico; prevalenza; equals(); toString(); clone(). ■ Capitolo 8: Array e collezioni — Array unidimensionali; definizioni; accesso e manipolazione degli elementi; inizializzazione esplicita; array costanti; elaborazione degli array; metodi; parametri di programmazione; ordinamento; ricerca; array multidimensionali; matrici; schema delle collezioni; ArrayList; algoritmi per le collezioni. ■ Capitolo 9: Ereditarietà e polimorfismo — Progettazione orientata agli oggetti; riutilizzo; classe base; classe derivata; ereditarietà singola; super; relazioni è-un, ha-un e usa-un; controllo dell’ereditarietà; membri predefiniti, protected e privati; polimorfismo; classe base astratta; gerarchie di interface. ■ Interludio grafico: Programmazione di interfacce grafiche — Case study nella progettazione e implementazione di interfacce grafiche per la tipizzazione della personalità e in un gioco grafico. ■ Capitolo 10: Eccezioni — Evento anormale; eccezioni; lancio; try; catch; gestori di eccezioni; finally; specializzazione dei flussi. ■ Capitolo 11: Ricorsione e soluzione di problemi — Funzioni ricorsive, ordinamento, ricerca; visualizzazione. ■ Capitolo 12: Thread — Flussi di controllo multipli indipendenti; processi; thread; thread per esecuzione a tempo e ripetizione; Timer; TimerTask; Thread; Date; Calendar; JOptionPane; pause; animazioni; software di sistema. Introduzione XXI ■ Capitolo 13: Test e debugging — Sviluppo software; rivedere il codice; testing black-box e white-box; ispezioni; banchi di prova; istruzioni; test di unità, di integrazione e di sistema; test di regressione; test delle condizioni di confine; percorsi; debugging. ■ Appendice A: Tabelle e operatori — Set di caratteri Unicode; parole riservate; operatori e precedenza. ■ Appendice B: Rappresentazione dei numeri — Numeri binari; numeri decimali; complemento a due; conversioni. ■ Appendice C: Applet — Programmazione di applet. ■ Appendice D: Pacchetti Java standard — java.io; java.lang; java.math; java.net; java. text; java.util. ■ Appendice E: Pacchetti Java grafici standard — java.applet, java.awt e javax.swing. INTERLUDI GRAFICI Da osservazioni personali e conversazioni con colleghi, siamo arrivati alla conclusione che non tutti i corsi di programmazione introduttivi presentano le interfacce utente. Potrebbe non esserci il tempo per introdurre l’API swing e la programmazione a eventi; per questo, il materiale di riferimento è stato inserito in due interludi grafici; sono capitoli facoltativi. Per gli insegnanti che volessero parlare di questi argomenti, si può presentare il materiale riguardante le GUI dopo il Capitolo 4. Occorre distinguere fra interfacce grafiche e creazione di immagini. Le API standard di Java rendono semplice disegnare rettangoli, linee, cerchi, ovali, triangoli e poligoni. La visualizzazione è semplice quasi come quella del testo. In altri capitoli ci sono esempi indipendenti su come usare queste caratteristiche di Java, anch’essi in parte facoltativi. Nella nostra esperienza, gli studenti si sono dimostrati interessati alle immagini e alle interfacce e i concetti di programmazione a oggetti sono più facili da spiegare se hanno natura visuale. COME USARE QUESTO LIBRO Il testo ha più materiale di quanto non possa essere trattato in un singolo corso. Ciò è stato voluto: gli insegnanti possono infatti scegliere quali argomenti trattare. Il libro è stato progettato per essere flessibile. Per esempio, se un insegnante desidera ritardare la spiegazione riguardante le classi, può prima parlare delle strutture di controllo (Paragrafi da 5.1 a 5.9 e da 6.1 a 6.5); se invece desidera parlare degli array prima delle classi, possono usare il materiale contenuto nei Paragrafi da 8.1 a 8.3 e il Paragrafo 8.7. A parte l’esempio del Paragrafo 9.2, la discussione sull’ereditarietà può precedere quella degli array. Il materiale su testing e debugging del Capitolo 13 può essere trattato in qualsiasi momento dopo aver presentato classi e array. XXII Introduzione MATERIALE DI SUPPORTO Il sito Web di supporto (www.ateneonline.it/cohoon) contiene il codice sorgente e i file di dati per tutti i listati del testo. Vi è inoltre una serie di lucidi in formato PowerPoint. APPROFONDIMENTI Ecco alcuni riferimenti importanti al linguaggio Java. ■ Ken Arnold, James Gosling, and David Holmes, The Java Programming Language, Third Edition, Addison-Wesley Pub Co; ISBN: 0201704331, June 2000. ■ Bill Joy (Editor), Guy Steele, James Gosling, and Gilad Bracha, The Java Language Specification, Second Edition, Addison-Wesley, ISBN: 0201310082, June 2000. Ottime fonti per le librerie standard e argomenti avanzati di programmazione a oggetti e sviluppo di programmi: ■ David M. Geary, Graphic Java 1.2, Mastering the JFC: AWT, Volume 1, Prentice Hall, ISBN: 0130796662; September 1998. ■ David M. Geary, Graphic Java 2, Volume 2, Swing, Prentice Hall, ISBN: 0130796670, March 1999. ■ Joshua Engel, Programming for the Java Virtual Machine, Addison-Wesley, ISBN: 0201309726, June 1999. ■ Cay S. Horstmann and Gary Cornell, Core Java 2, Volume I, Fundamentals, Prentice Hall PTR, ISBN: 0130894680, December 2000. ■ Cay S. Horstmann and Gary Cornell, Core Java 2: Volume II, Advanced Features, Prentice Hall, ISBN: 0130927384, December 2001. ■ Matthew Robinson and Pavel A. Vorobiev, Swing, Manning Publications Company; ISBN: 1884777848, December 1999. ■ Stephen A. Stelting and Olav Maassen, Applied Java Patterns, Prentice Hall; ISBN: 0130935387, December 2001. ■ Sun Microsystems, Java Look and Feel Design Guidelines: Advanced Topics, Addison Wesley Professional; ISBN: 0201775824, December 2001. ■ Al Vermeulen (Editor), Scott W. Ambler, Greg Bumgardner, Eldon Metz, Alan Vermeulen, Trevor Misfeldt, Jim Shur, and Patrick Thompson, The Elements of Java Style, Cambridge University Press; ISBN: 0521777682, January 2000. ■ John Zukowski, Java Collections, APress; ISBN: 1893115925, April 2001.