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.