La struttura del codice lezione Lezione 2 2 La struttura del codice In questa lezione impareremo... • a scrivere un primo programma e a compilarlo ed eseguirlo • a comprendere il ruolo del metodo main • a utilizzare le funzioni di input output • a creare la documentazione con javadoc Prima di poter scrivere un programma mediante il linguaggio Java vogliamo introdurre il concetto di ◀ programma ▶: si tratta di una astrazione del problema che si vuol fare risolvere al computer; in qualsiasi tipologia di programma, dal più semplice al più complesso, l’elaborazione lavora sui dati di ingresso, denominati input, e li trasforma nei dati di uscita, chiamati output. Java è un linguaggio di programmazione ◀ object oriented ▶ in cui l’astrazione del problema avvie◀ Programma È un insieme di ne tramite l’isolamento e la definizione dei singoistruzioni che è necessario eseguili concetti che è necessario considerare al fine di re al fine di risolvere uno specifico raggiungere lo scopo prefissato. problema. ▶ ◀ Object oriented La programmaIn un programma che deve gestire per esempio un zione orientata agli oggetti, definita magazzino di merci secondo la programmazione anche OOP (Object Oriented Proa oggetti i concetti coinvolti potrebbero essere: le gramming), è un tipo di programmerci, gli scaffali e i codici a barre. Le azioni conmazione che permette di definire crete che deve svolgere il programma per risolvere oggetti software in grado di interail problema possiedono una importanza relativa in gire gli uni con gli altri attraverso lo quanto il peso maggiore è dato dalla rappresentascambio di messaggi. ▶ zione dei concetti coinvolti nel problema. ■■ Le classi Nei linguaggi di programmazione orientati agli oggetti, un programma è costituito da un insieme di oggetti che cooperano tra di loro per raggiungere lo scopo per cui è stato scritto il programma. Gli ◀ oggetti ▶ rappresentano i concetti coinvolti nel problema. ◀ Oggetti Un oggetto è una entità dotata di specifici attributi e che è in grado di cooperare con altri oggetti svolgendo specifiche azioni. ▶ 27 UdA 1 La sintassi Java e l’ambiente di sviluppo Un oggetto può rappresentare qualsiasi cosa. Per esempio, l’oggetto Cane può avere come attributi il peso, il colore del pelo, l’età; le sue azioni possono includere il correre, il dormire e il mangiare un osso. L’oggetto Smartphone ha attributi come la risoluzione dello schermo, il peso e il colore, mentre le azioni includono l’invio di email, l’installazione di Apps, la composizione di un numero, l’accensione e lo spegnimento. Una classe è invece lo schema dal quale è possibile creare singoli oggetti. Possiamo paragonare una classe al progetto di una automobile. Per esempio, il progetto della Fiat Bravo, completo di tutti i dettagli che definiscono gli attributi e le azioni che questa macchina può svolgere, viene utilizzato dalla fabbrica per produrre i singoli esemplari. Paragonando queste definizioni alla programmazione, il progetto è la classe, mentre le singole autovetture sono i diversi oggetti presenti nel programma. Si pensi a un’azienda di noleggio macchine Fiat: per poter operare necessita di diversi esemplari di Fiat Bravo, che vengono forniti ai clienti per viaggiare. Allo stesso modo, un programma può aver bisogno di molteplici oggetti di una stessa classe al fine di raggiungere il proprio scopo. ■■ Un programma Java Una volta appresa la struttura generale di un generico programma orientato agli oggetti, è necessario approfondire la struttura di un programma specificatamente scritto nel linguaggio Java. L’unità minima di azione che è possibile definire in Java è detta espressione. Una istruzione è invece ogni espressione che termina con un punto e virgola. Un esempio basilare di istruzione Java è la seguente dichiarazione di variabile: Variabili e tipi verranno approfonditi più avanti, in una lezione dedicata. Un altro esempio di istruzione tipica è quella che consente di eseguire una assegnazione: L’istruzione assegna alla variabile x il valore 20. Le istruzioni vengono raggruppate in unità esecutive chiamate metodi. Per esempio, un metodo il cui scopo è quello di riprodurre un motivo musicale memorizzato come file mp3 potrebbe eseguire le seguenti operazioni: Nel codice presentato, le istruzioni leggiCanzone(), decodifica() e riproduci() si occupano, rispettivamente, di leggere il file mp3, decomprimerne il contenuto e di riprodurlo nell’altoparlante del computer. A loro volta, i metodi sono contenuti all’interno delle classi, per esempio, il metodo play() potrebbe essere contenuto nella classe LettoreMp3: ▶ 28 La struttura del codice Lezione 2 Zoom su... Il metodo che aziona la classe Ciascun programma necessita di un punto di inizio: è necessario indicare la prima istruzione da eseguire. A questo proposito esiste un metodo con un nome particolare, chiamato main() che rappresenta il punto di partenza dell’esecuzione di un programma scritto in Java. Ogni programma Java deve possedere almeno un metodo main per poter fare incominciare l’esecuzione del programma stesso. Il codice che segue mostra il codice del metodo main di una classe ipotetica che esegue una stampa di una stringa a video: Come possiamo notare questo metodo deve essere preceduto da tre parole chiave, assolutamente obbligatorie chiamate public static void che verranno discusse ampiamente più avanti. Inoltre il codice del metodo che viene eseguito deve essere racchiuso all’interno delle parentesi graffe. ■■ La classe System La classe System, presente nel ◀ package ▶ java.lang è il punto di accesso a diverse funzioni strettamente legate alle funzionalità di base di Java, come la Virtual Machine, i meccanismi di sicurezza e le proprietà di sistema. Oltre a queste, la classe System dispone di tre campi, che forniscono l’accesso all’I/O di sistema: ◗◗ in che consente di accedere all’input; ◗◗ out che permette l’accesso all’output; ◗◗ err che rappresenta un canale dedicato agli errori. ◀ Package I package di Java non sono altri che un insieme di classi impacchettate in un unico file di estensione .jar. Sono delle vere e proprie librerie alle quali possiamo dal codice Java. Possono essere create dal programmatore, anche se esamineremo i package già definiti in Java. Il nucleo del linguaggio Java contiene solo le parole chiave per la costruzione delle classi, i commenti, i normali costrutti if, switch, while, do-while, for, etichette, break, continue e return, tutto il resto è implementato nei package del linguaggio, comprese le istruzioni di Input e di Output. ▶ Per usare un package in una classe, prima della definizione della classe dobbiamo inserire l’istruzione import, per esempio volendo usare il package java.awt dobbiamo inserire all’inizio del codice la seguente istruzione, che indica l’intenzione di usare le classi presenti nel package: import java.awt.*; Il package java.lang è il più importante di Java e racchiude le classi fondamentali del linguaggio, infatti anche se non scriviamo l’istruzione import per questo package, fa lo stesso in quanto esso verrà importato automaticamente. 29 UdA 1 La sintassi Java e l’ambiente di sviluppo Attraverso l’asterisco (*) indichiamo al compilatore l’intenzione di utilizzare tutte le classi; qualora intendessimo usarne solo alcune dovremmo specificarlo per esteso. Per esempio l’istruzione: import java.awt.Frame; limita l’accesso alla sola classe Frame del package awt. Il primo di questi campi è di tipo InputStream, mentre gli altri sono di tipo PrintWriter; queste classi appartengono al package java.io e dispongono di funzionalità di lettura e scrittura: in e out consentono di accedere all’input/output di sistema, mentre err viene utilizzato per la gestione degli errori: quando un programma ha la necessità di segnalare un evento critico, lo può inviare a err; quando la comunicazione è un normale output, viene inviata ad out. La visualizzazione dei dati Il linguaggio Java, come tra l’altro tutti i linguaggi di programmazione, consente di comunicare con l’utente tramite due modalità: ◗◗ input; ◗◗ output. L’input (dati in ingresso) consente al programma di ricevere dati e informazioni dall’esterno allo scopo di poterli elaborare, mentre la fase di output (dati in uscita), consiste nella comunicazione all’utente dei dati e delle informazioni così elaborati. Tutti i programmi si basano sul seguente schema: Dati in ingresso (Input) Istruzioni (Elaborazione) Dati in uscita (Output) Tradotto in parole, significa che il risultato (output) è ottenuto mediante le operazioni elementari descritte nell’algoritmo ed è il prodotto della elaborazione (trasformazione) dei dati in ingresso (input). In un computer i tipici dispositivi di input sono la tastiera e il mouse, mentre il monitor è il tipico dispositivo di output. Queste funzionalità sono disponibili in Java attraverso le classi presenti nella libreria di Java. La presentazione dei risultati sul video viene definita standard output, a cui si accede tramite l’oggetto ◀ System.out ▶. Il codice sotto riportato mostra come visualizzare il contenuto di una variabile intera e di una a doppia precisione. L’output è riportato a fianco del codice. ◀ System La classe System raccoglie alcune funzionalità di sistema; uno dei suoi attributi è out, un oggetto che contiene diversi metodi per produrre un output, studiati per operare con i tipi di dati presenti nel linguaggio Java. ▶ 30 La struttura del codice Lezione 2 In questi esempi è stato utilizzato il metodo println() che stampa il parametro passato andando successivamente a capo; per scrivere sempre sulla stessa riga è possibile utilizzare print(). Il codice seguente produce in output la scritta “Prezzo: 100 Euro”: Il programma produce in output quanto segue La lettura dei dati Le gestione dell’input avviene mediante la classe InputStream fornita da System. Tale classe tuttavia dispone solo delle funzionalità basilari di gestione dell’input; il metodo read() in essa definito, infatti, consente di leggere la tastiera solo un carattere per volta. Se vogliamo sviluppare un programma dobbiamo utilizzare funzioni più evolute, come per esempio la lettura di una intera riga di testo, quella che l’utente digita e termina con la pressione del tasto INVIO. Il metodo readLine() della classe BufferedReader, legge buffers (sequenze di caratteri) che restituisce ◀ Lettore di stream L’utilità di un sotto forma di stringhe. La classe BufferedReader, a lettore è quella di trasformare la sequenza di byte letti tramite qualsua volta, deve essere inizializzata fornendo un reader siasi oggetto di tipo InputStream (◀ lettore di stream ▶) di input. Tale lettore è rapprein una sequenza di caratteri. ▶ sentato da un’istanza della classe InputStreamReader. Per leggere una sequenza di byte da un oggetto di tipo InputStream dobbiamo usare un oggetto System.in, di classe InputStream. Un lettore bufferizzato può essere creato istanziando un oggetto della classe BufferedStreamReader nel seguente modo: InputStreamReader leggi= new InputStreamReader(System.in); A questo punto faremo uso del lettore bufferizzato che abbiamo chiamato leggi per istanziare un oggetto di tipo BufferedReader. Quest’ultimo mette a disposizione del programmatore il metodo readLine() che consente la lettura di intere stringhe. Per istanziare un oggetto di classe BufferedReader dobbiamo procedere nel seguente modo: BufferedReader input = new BufferedReader( leggi); Una volta che l’oggetto di lettura è stato costruito correttamente, possiamo utilizzarlo per leggere una linea di testo, operazione che viene eseguita dal metodo readLine(): input.readLine(); L’istruzione di inizializzazione dell’oggetto di tastiera (input) può essere ridotta alla seguente forma compatta: 31 UdA 1 La sintassi Java e l’ambiente di sviluppo Esempio2 Stampa di un numero Il programma acquisisce da tastiera un nome e un numero che rappresenta il saldo di un conto corrente e lo visualizza in output. ▶ È importante sottolineare come sia necessario aggiungere all’inizio del codice la riga: import java.io.*; per poter utilizzare le istruzioni di input e output viste nella lezione. Nel codice è presente il costrutto try/catch: viene utilizzato per gestire eventuali errori che si possono verificare in fase di lettura da un flusso di informazioni. In questo specifico caso è difficile che si verifichino problemi di lettura dalla tastiera: se questa smettesse di funzionare, probabilmente non si vedrebbero più sul video i caratteri digitati. Si pensi però se la lettura delle informazioni avvenisse da un dischetto removibile, evenienza che, dal punto di vista di Java, è equivalente come classi e metodi coinvolti: l’espulsione anticipata del dischetto farebbe mancare le informazioni che si stanno leggendo; in tal caso viene individuato da Java un errore di tipo IOException. La gestione degli errori sarà oggetto di una trattazione più approfondita più avanti nel testo. In questo programma sono state usate due variabili, una per il nome da visualizzare e l’altra per memorizzare l’importo. Il concetto di variabile verrà tuttavia trattato nella prossima lezione. ■■ I commenti Tutti i linguaggi di programmazione mettono a disposizione uno spazio per commentare il codice sorgente. Lo scopo è quello di documentare, descrivere o annotare informazioni importanti per lo sviluppatore. Tali messaggi prendono il nome di ◀ commenti ▶. ◀ Commenti Un commento fa parte del codice di un programma, ma non viene considerato al momento dell’esecuzione. In questo modo il programmatore può descrivere lo scopo di porzioni particolari di codice, in modo che sia più semplice ricordare perché un certo programma è stato scritto in quel modo, soprattutto quando è passato un certo tempo dopo la stesura del programma ed è difficile ricostruire le sue funzionalità. ▶ 32 La struttura del codice Lezione 2 A volte possiamo usare i commenti anche per non far eseguire alcune istruzioni senza doverle necessariamente cancellare dal codice. Il linguaggio Java dispone di tre modalità per inserire i commenti: ◗◗ doppio slash (//) a inizio commento; ◗◗ slash asterisco (/*) all’inizio e viceversa (\*) alla fine del commento; ◗◗ slash e doppio asterisco (/**) all’inizio e viceversa (**/) alla fine del commento. Il primo tipo permette di considerare come commento tutto ciò che è scritto dopo di essa, fino al termine della riga. Quando invece il commento è composto da diverse righe, è più pratico utilizzare il secondo tipo in grado di identificare quanto contenuto tra delimitatore di inizio (/*) e delimitatore di fine (*/) commento. L’esempio che segue mostra i due tipi di commento indicati: Il terzo tipo di commento si chiama commento Javadoc e consente di documentare le classi con un browser Web. All’interno dei commenti Javadoc è possibile inserire alcuni marcatori particolari, che permettono di specificare alcune informazioni utili, quali la versione e l’autore della classe, e che avranno un posto specifico nella documentazione generata. Per esempio, per includere autore e versione nella classe Automobile possiamo scrivere: ▶ A questo punto, dopo aver compilato la classe passiamo alla generazione dei codici di documentazione aprendo l’ambiente JDK. Per fare questo apriamo l’ambiente Prompt dei comandi e posizioniamoci nella cartella del progetto (quella che contiene la classe da documentare): 33 UdA 1 La sintassi Java e l’ambiente di sviluppo Il comando necessario per generare i file della documentazione è javadoc seguito dal nome del file che contiene la classe sorgente, quindi in questo caso Automobile.java: ▶ Vengono generati moltissimi file che concorrono alla creazione della documentazione all’interno della cartella del progetto: Aprendo il file index.html otteniamo la finestra di consultazione della nostra classe Automobile: 34 La struttura del codice Lezione 2 Verifichiamo le conoscenze g Esercizi a scelta multipla 1 Una istruzione Java è una espressione che: a) corrisponde a una qualunque riga del programma, anche vuota b) effettua un ciclo c) contiene almeno una variabile d) termina con il punto e virgola 2 Ogni programma Java deve possedere almeno un metodo main? a) no, non è vero b) no, per poter far finire il programma c) no, per poter far iniziare il programma d) no, per poter salvare le variabili 3 Quale campo della classe System, tra i seguenti, consente di stampare a video una stringa? a)in b)out c)err d)print 4 I package sono: a) un insieme di classi salvate in un file .jre b) un insieme di classi salvate in un file .jar c) un insieme di variabili salvate in un file .jar d) un insieme di metodi salvati in un file .jar 5 Quale istruzione tra le seguenti istanzia un oggetto utile per la lettura da tastiera? a) BufferedReader input = new BufferedReader(System.in); b) BufferedReader input = new BufferedReader(System.out); c) InputStreamReader input = new InputStreamReader(System.in); d) Reader input = new Reader(System.in); 6 Quale tra i seguenti frammenti di codice rappresenta correttamente il metodo main? a) public void main( String[] args ); b) public static void main( String[] argv, int argc ); c) public final void main(); d) public static void main( String[] args ); 7 Un commento su singola riga è specificato dall’identificatore: a)/* b)/** c)// d)*/ e)//** 8 Un blocco di commenti su più righe è delimitato da: a) /* ... */ b) /** ... **/ c) // ... // d) */ ... /* 9 Quali tra i seguenti sono commenti Javadoc standard? (tre risposte) a) /* @version 1.0 */ b) /** Commento @version 1.0 */ c) /* Commento @ejb.bean */ d) /** Commento */ e) /** Commento @ejb.bean */ 10 Un programma è normalmente formato da: a)figure b)istruzioni c)comandi d) lettere e numeri 35 UdA 1 La sintassi Java e l’ambiente di sviluppo g Test vero/falso 1 2 3 4 5 6 7 8 9 10 11 12 Il package fondamentale di Java è java.lang. Tutte le istruzioni sono espressioni. Tutte le espressioni sono istruzioni. Nell’istruzione import l’asterisco (*) indica al compilatore l’intenzione di utilizzare tutte le classi. Un oggetto è composto da più classi. Un metodo definisce le proprietà di un oggetto. I metodi contengono il codice. Il metodo print() e println() sono esattamente identici. Un programma è formato da un insieme di attributi. Un oggetto è dotato di attributi e metodi. Una classe definisce la struttura di un oggetto. Un oggetto è un tipo particolare di classe. VF VF VF VF VF VF VF VF VF VF VF VF g Esercizi di completamento 1 Lo standard output viene utilizzato per produrre una stampa a ...........................................................................................................; a questo oggetto si accede tramite System.......................................................... 2Un ........................................................................................................... fa parte del codice di un programma, ma non viene considerato al momento dell’esecuzione. 3 Il costrutto try/catch viene utilizzato per gestire eventuali ........................................................................................................... che si possono verificare in fase di ............................................................................................................ 4 Ogni programma Java deve possedere almeno un metodo ........................................................................................................... per poter fare incominciare l’esecuzione del programma stesso. 36