SCUOLA INTERATENEO DI SPECIALIZZAZIONE PER LA FORMAZIONE DEGLI INSEGNANTI DELLA SCUOLA SECONDARIA SIS Via Carlo Alberto 10 – 10123 TORINO – tel. 011.6702887 Fax 011.6702888 e-mail: [email protected] Un approccio didattico per la programmazione orientata agli oggetti in linguaggio Java in una Va I.T.I.S. Relazione finale per l’abilitazione all’insegnamento secondario Anno Accademico 2005-2006 Indirizzo Tecnologico Classe di Abilitazione A042 – Informatica Candidato CANDIDO Abramo Supervisore prof. BELOTTI Pierangelo Quando insegni, insegna allo stesso tempo a dubitare di ciò che insegni. Ortega y Gasset 2 CONTENUTI 1. 2. 2.1. 2.2. 2.3. 2.4. 2.5. 3. 3.1. 3.2. 3.3. 3.3.1. 4. 4.1. 4.1.1. 4.2. 4.3. 4.4. 4.5. 5. Introduzione ................................................................................................... 4 Il Riferimento didattico metodologico ......................................................... 5 Le scelte didattiche ........................................................................................................................ 5 Verso la competenza informatica................................................................................................ 7 Insegnare Informatica................................................................................................................... 8 Didattica dell’informatica............................................................................................................. 9 Scelta degli strumenti e delle metodologie................................................................................. 11 Il progetto ..................................................................................................... 12 Il contesto dell’intervento didattico ........................................................................................... 12 Scelta dei contenuti in relazione alla disciplina e alle sue caratteristiche .............................. 12 Descrizione sintetica del progetto............................................................................................... 13 Programmazione didattica ......................................................................................................... 14 Analisi del processo ..................................................................................... 16 Lo svolgimento dell’intervento didattico................................................................................... 16 Didattica e software libero.......................................................................................................... 17 Gli aspetti emotivi e relazionali .................................................................................................. 18 Riflessioni ..................................................................................................................................... 20 Progettazione della verifica ........................................................................................................ 22 Valutazione del lavoro fatto dagli studenti ............................................................................... 24 Conclusioni ................................................................................................... 28 Bibliografia................................................................................................................. 31 Supporti Didattici: Supporto Didattico A ........................................................ Trasparenze usate nell’I.D. all’Itis Avogadro Supporto Didattico B .............................................Dispense didattiche usate nell’I.D. all’Itis Avogadro Supporto Didattico C .....................................................Verifica sommativa per l’I.D. all’Itis Avogadro Allegati: Allegato A ............................................................................................ P.O.F Itis Avogadro A.A. 2005-06 3 1. Introduzione I corsi frequentati alla SSIS, con la bibliografia suggerita dalla stessa istituzione, e le esperienze di tirocinio hanno rappresentato una ghiotta opportunità e un osservatorio privilegiato per utilizzare le chiavi di lettura fornite per indagare e comprendere i processi cognitivi degli allievi, le strategie da loro messe in atto nella risoluzione di problemi, le convinzioni e le emozioni con le quali affrontano e si rapportano allo studio dell’informatica. L’ingresso in aula come insegnante, con al seguito le nozioni pedagogico-psicologiche e i vari modelli didattici, si è rivelata una tappa fondamentale del percorso di costruzione della ricetta del “buon insegnante”, e ha permesso di confutare o constatare come trovano realizzazione pratica le teorie e i modelli didattici di riferimento che non possono prescindere dal considerare gli aspetti emotivi e relazionali. Questo lavoro nasce da un approccio didattico adottato durante l’esperienza di tirocinio attivo svoltasi nell’anno scolastico 2005-06 presso l’Istituto Tecnico Industriale “A. Avogadro”. Lo scopo dell’intervento didattico, stabilito con i docenti accoglienti e unitamente al supervisore, ha riguardato l’introduzione alla programmazione ad oggetti tramite il linguaggio Java. Si è cercato di porre gli allievi in una situazione non solo “di fare”, e quindi di “acquisire facendo”, ma anche di collaborare all’interno del gruppo e di comprendere le dinamiche e le fasi di progettazione di artefatti software. Attraverso la modellazione si sono aiutati i ragazzi a fare proprie le teorie presentate, e si è facilitata la comprensione dei processi che sono alla base della nascita di una applicazione informatica. La formazione a cui mira la mia proposta tende a spostare l’attenzione dall’impostazione teorica e disciplinare ad una didattica e pratica che implica una particolare attenzione ai bisogni degli allievi, bisogni che ho “imparato ad imparare” e che proprio per questi motivi, sarò certamente in grado di apprezzare. Non mi sono accontentato di un’osservazione dei fenomeni nella loro individualità e peculiarità ma ho cercato di cogliere l’aspetto globale e dinamico delle situazioni, evidenziando correlazioni (aspetti fondamentali nell’ambito dell’osservazione di situazioni educative); né mi sono limitato a rilevare i dati cercando di dare una lettura di ciò che vedevo avendo la necessità di cogliere caratteristiche e/o dinamiche interne, senza pregiudizi, al fine di comprendere in modo oggettivo. Il presente lavoro è organizzato per sezioni, ho cercato di collocarlo in un quadro unitario analizzando la grande quantità di elementi raccolti e riprendendo le piste e spunti di riflessione che sono germogliate copiose durante questo cammino formativo del biennio alla SSIS. In questo lavoro di “scomposizione” degli eventi sono stati estremamente preziosi gli strumenti di preparazione all’intervento didattico, materiale didattico, presentazioni, griglie di valutazione e liste di controllo degli aspetti da monitorare, perché mi hanno aiutato ad individuare le singole variabili atomiche del processo di apprendimento-insegnamento. La presenza in classe è stata un piacevole ritorno tra una dimensione scolastica innovata in cui il ruolo degli attori si è evoluto assumendo caratteristiche nuove. 4 2. Il Riferimento didattico metodologico L’intervento in classe e la sua conduzione diretta ha rappresentato, grazie alle esperienze di tirocinio, il momento per applicare, sperimentare, valutare e far sorgere una riflessione critica in itinere degli insegnamenti appresi durante la frequenza dei corsi disciplinari e trasversali della SIS. La consapevolezza dell’esistenza di diversi approcci didattici per presentare agli allievi un dato argomento è necessaria e funzionale per operare delle scelte di impostazione della didattica, e per delineare una strategia di apprendimento. A tal proposito sono state fonti di ispirazione per come presentare la materia agli studenti i corsi del macroesame di Didattica dell’informatica e Storia ed epistemologia della scienza dai quali ho apprezzato l’importanza di contestualizzare il sapere scientifico e di bandire l’approccio epistemologico empirista-positivista che tende a trasmettere la concezione della scienza come un prodotto confezionato e sinonimo di verità, commettendo un delitto intellettuale e occultando il processo della scienza, il turbinio e l’affanno che si cova dietro alla corrente e momentaneamente adottata teoria, e i tratti propri del sapere scientifico (ipotetico, contingente, storicamente determinato, non oggettivo, non riflessivo della realtà). Le conseguenze della concezione positivista sull’insegnamento vanno a sancire il primato dell’osservazione e l’evidenza come fonte di conoscenza, e si ripercuotono sul modello didattico d’apprendimento che è quello trasmissivo con i lati negativi (natura innaturale della scienza, neutralità concettuale dell’allievo, rappresentazioni concettuali difformi degli allievi, rottura epistemologica). 2.1. Le scelte didattiche Oggi, invece, non si può fare a meno di pensare a un ruolo attivo degli studenti nella costruzione del loro sapere; non solo, quindi “educare”, ma anche “educere” [dal latino educere = trarre fuori]. Alla luce di questo significato ambivalente che assume il termine educazione, si delinea un nuovo ruolo per l’insegnante che, come sostiene Gordon, “non è più colui che trasferisce il suo sapere agli studenti ma colui che sa essere con gli studenti in modo funzionale al loro processo di apprendimento o ,meglio ancora, al processo attraverso il quale gli studenti educano sè stessi” 1 . Alla base del metodo trasmissivo vi è l’idea di uno studente paragonabile ad un “bicchiere vuoto”, che l’insegnante ha il compito di riempire di contenuti: le conoscenze vengono semplicemente trasmesse dall’insegnante all’allievo tramite le classiche lezioni frontali in cui il docente spiega e gli allievi ascoltano; gli studenti hanno poi il dovere di studiare e rielaborare da soli sul libro di testo gli argomenti illustrati in classe. Il metodo socio-costruttivista parte invece da un presupposto profondamente diverso, cioè dall’idea di studente come soggetto pensante. Le conoscenze non possono essere trasmesse, ma devono essere costruite da colui che apprende a partire dalle concezioni che ha, con l’aiuto dell’insegnante e la collaborazione del gruppo classe: gli studenti, pertanto, diventano protagonisti del processo di apprendimento. Il modello costruttivista 2 sostiene, infatti, che un apprendimento efficace presupponga un cambiamento metodologico nella costruzione del sapere e che, dunque, non si possa fare a meno di tenere in considerazione le concezioni iniziali degli studenti, spesso costituite da conoscenze accettate senza alcun spirito critico. In particolare, nell’ambito delle discipline scientifiche, questo tipo di approccio comporta l’avvicinarsi degli allievi alla metodologia scientifica nei suoi aspetti essenziali: formalizzare un problema, proporre delle ipotesi, verificare le ipotesi, ecc. Per poter mettere in atto un insegnamento basato su questo approccio, è molto utile proporre situazioni problematiche che possono suscitare interesse negli studenti coinvolgendoli 1 T. Gordon, “Insegnanti efficaci. Il metodo Gordon: pratiche educative per insegnanti, genitori e studenti”, ed. Giunti Lisciani, pag.7 2 D.W. Johnson, R. T. Johnson, E.J. Holubec, Apprendimento cooperativo in classe, Trento, Erickson, 1996, pp. 17-35. 5 emotivamente ed è altrettanto utile dare spazio a lavori di gruppo in cui gli allievi, guidati dall’insegnante, possano confrontarsi tra loro. Ma dopo aver trovato un modello di riferimento, quale metodologia didattica mettere in atto? Forte delle esperienze di tirocinio del biennio S.I.S. non ci sono stati dubbi: non esiste una metodologia perfetta e un insegnante non può mettere in atto solo ed esclusivamente un tipo di didattica. In ogni insegnante coesistono diverse metodologie (che in parte ne rispecchiano la personalità) e l’abilità sta proprio nell’adattare la metodologia di lavoro al contesto e alle caratteristiche della classe in cui si va ad operare. In relazione a questo aspetto, nello svolgimento del presente intervento didattico, si è adoperata una metodologia, difficilmente ascrivibile ad una determinata categoria, che raccoglie spunti principalmente da tre tipologie di didattica: • Didattica per concetti • Didattica per problemi • Didattica per obiettivi Il tutto coordinato dall’approccio costruttivista: i ragazzi devono costruire il loro sapere e non si può pensare di trasmettere conoscenza. Per fare un breve cenno sulle caratteristiche principali di questi tipi di didattica, si può cominciare con il mettere in evidenza che le tre metodologie in questione concentrano la loro attenzione su aspetti diversi: la didattica per problemi dà rilievo soprattutto ai processi dell’apprendimento, la didattica per obiettivi ai risultati, mentre la didattica per concetti considera entrambi gli aspetti. Quello che mi prefiggevo, progettando il mio intervento didattico, era di tenere in considerazione tutti questi aspetti, pertanto, nell’analisi del lavoro condotto si potranno identificare aspetti relativi a tutte e tre le metodologie didattiche. L’integrazione di diverse metodologie didattiche ha permesso di impostare il lavoro in modo più flessibile, adeguandolo di volta in volta alle necessità del momento. Pertanto, non si è esclusa a priori alcuna metodologia, ma si è cercato di utilizzare il bagaglio accumulato durante la frequenza S.I.S. e durante la breve esperienza di insegnamento per adattare l’intervento al contesto di lavoro. Nel delineare un modello di riferimento, non si può fare a meno di considerare gli aspetti relazionali, che certamente non sono di secondaria importanza. Purtroppo, la scuola trascura la dimensione emotiva 3 che entra in gioco nel processo di insegnamento-apprendimento; come ha evidenziato Winnicott nell’ambito di un ampio discorso sulla società in generale, la scuola spesso paga a caro prezzo, dal punto di vista dell’insuccesso e dell’inefficienza, la sua disattenzione nei confronti dei fattori emotivo-affettivi. Ripensando ai vecchi programmi ministeriali, si rende conto di come la scuola, fino a poco tempo fa, considerasse separatamente la dimensione cognitiva da quella emotiva, dando spesso per scontata la buona situazione emotiva degli allievi. Gli insegnanti si trovano di fronte a vissuti di ansia, di aggressività e di insuccesso che riguardano non allievi con problemi di handicap, ma studenti normodotati o addirittura dotati di una creatività fuori dal comune. Di fronte a ciò non esiste la “ricetta del buon insegnante” ma è già un passo avanti se il docente tiene conto del fatto che con il proprio atteggiamento nei confronti degli studenti può influenzare il modo in cui i ragazzi si rapporteranno alla disciplina. Non è sufficiente, quindi, che un insegnante sia molto preparato, né tanto meno, che sia innamorato della propria materia, per stimolare gli allievi e far nascere in loro il desiderio di apprendere è necessario impostare un buon rapporto prima di tutto dal punto di vista umano e una relazione positiva tra menti che favorisca la crescita mentale e promuova la “pensabilità” 4 . In definitiva un insegnamento può diventare interessante se impartito da un insegnante che abbia appreso il modo corretto di rapportarsi con gli studenti, instaurando una relazione di reciproco rispetto. Alla luce di queste considerazioni, è nata una consapevolezza: l’ ”arma” principale di ogni 3 G. Blandino, B. Granieri , Le risorse emotive nella scuola, 2004, Cortina, Milano A.R.Colasanti, Star bene a scuola: la promozione di comportamenti sociali positivi , in “Orientamenti pedagogici”, vol. n. 49, n.4 (292), luglio-agosto, 2002, pp. 595-610. 4 6 insegnante è la riflessione, che porta a considerare la molteplicità di aspetti che entrano in gioco nel processo di apprendimento e a tenerne conto nell’organizzazione del lavoro. L’insegnante diviene un mediatore ed è evidente che la condivisione di obiettivi e finalità sia un elemento imprescindibile per realizzare un buon intervento in classe 5 , gli allievi hanno il diritto di conoscere quale sarà il percorso didattico che affronteranno, avere la possibilità di modificarlo in base ai loro bisogni e esigenze. Grazie al tirocinio ho utilizzato le chiavi di lettura fornite nel corso di Didattica dell’Informatica 6 : la necessità di indagare e comprendere i processi cognitivi degli allievi, le strategie da loro messe in atto nella risoluzione di problemi, le convinzioni ed emozioni con le quali affrontano lo studio dei sistemi informatici; ma è un’opportunità che naturalmente nasce solo se si tiene conto delle esigenze di chi, docente e studenti, mette a disposizione il proprio tempo, il proprio lavoro e nel caso degli studenti…se stessi. 2.2. Verso la competenza informatica Se la competenza diventa nell’ambito teorico un senso possibile, é importante chiarire il significato di alcuni termini propri del linguaggio cognitivo utilizzato in didattica della informatica, termini utilizzati in riferimento sia agli oggetti di insegnamento (contenuti) che all’apprendimento degli studenti (conoscenze, competenze): Contenuto: una porzione limitata di sapere; Conoscenza: è, allo stesso tempo, la rielaborazione di contenuti in modo autonomo per raggiungere una meta, e il risultato di tale elaborazione; una conoscenza può coinvolgere uno o più contenuti; Competenza: è un concetto complesso e dinamico. Complesso poiché si tratta dell’insieme di due componenti, uso (esogeno) e padronanza (endogena), di conoscenze che collegano contenuti diversi; concetto dinamico, in quanto la competenza non si esprime solo attraverso l’uso e la padronanza, la competenza racchiude in sé anche fattori metacognitivi, affettivi, il desiderio di completare conoscenze e quindi di aumentare competenze. Come insegnante ho cercato di orientarmi e di considerare lo studente come colui che deve raggiungere competenza e non “semplice” conoscenza. La competenza implica necessariamente il “voler fare”, dunque chiama immediatamente in causa fatti affettivi come volizione e atteggiamento. I mezzi che ci permettono di passare dalle capacità alle competenze sono le conoscenze che maturiamo e le abilità di cui ci impadroniamo e che usiamo nelle diverse situazioni. Nessuno può dichiarare di essere più o meno competente fino a quando non è posto nelle condizioni di poterlo dimostrare, fino a quando, cioè, non fa esercizio delle proprie capacità. Le capacità se non esercitate si atrofizzano, non si sviluppano e non diventano mai competenze; è un bene se queste capacità atrofizzate riguardano la parte meno nobile del nostro essere, è un male se riguardano ciò che ci rende migliori. La competenza in informatica è al centro della disciplina, riconosciuta come scienza costituita, come oggetto proprio, specifico, di conoscenza. L’allievo entra in contatto con saperi specifici, saperi che la società ha inglobato nelle conoscenze riconosciute come base per un dignitoso ingresso nel suo interno; si appropria di una parte di tali saperi, tanto formalmente quanto informalmente. La competenza informatica si riconosce quando un individuo vede, interpreta e si comporta nel mondo in un senso informatico. Ci sono buoni risolutori di problemi che possono riconoscere, delimitare e risolvere situazioni problematiche; il che, viceversa, a volte, non è facile da evidenziare in persone che trattano bene algoritmi. Poiché la competenza informatica comporta la capacità e disponibilità a guardare il mondo in modo informatico e dato che ciò non si apprende spontaneamente in modo implicito, si rende necessario pensare che deve far parte del curricolo, 5 6 A. Calvani, Elementi di didattica, Roma, Carocci, 2000. Corso di Didattica dell’Informatica e Laboratorio di Informatica, A.A. 2004-05, prof. B. Montrucchio 7 proprio questo processo di insegnamento–apprendimento specificamente rivolto a “saper vedere informaticamente” il mondo. In virtù della complessità racchiusa nel termine competenza, la valutazione di competenze non può ridursi ad un test tradizionale (tipicamente compito in classe o interrogazione), per verificare la padronanza in qualche cosa di specifico. La valutazione, in vista di una didattica volta a far raggiungere competenze si presenta come un processo di analisi dell’aula, ovvero delle sue varie componenti: il curricolo, l’efficacia dell’insegnante e l’allievo. 2.3. Insegnare Informatica L’informatica come disciplina ha una duplice valenza: quella di essere considerata come una scienza che studia le regole generali della trasmissione, della rappresentazione e della conservazione di informazioni, con una propria epistemologia, e può essere inserita tra le nuove tecnologie che stanno cambiando radicalmente il nostro modo di vivere. Anche se risulta riduttivo confinarla solo all’uso del calcolatore o di applicazioni per calcolatori, in essa confluiscono la matematica, la logica, la fisica, la teoria dell’informazione, l’elettronica. Le tecnologie informatiche si occupano della elaborazione delle informazioni in segnali elettrici in grado di essere trattati dai calcolatori e quindi produce i “linguaggi” e le istruzioni che i calcolatori capiscono. Credo che sia utile conoscere quali siano gli obiettivi dell’insegnamento di Informatica e di Sistemi di elaborazione e trasmissione dell’informazione (classe di abilitazione A042). Il corso di informatica ha come fine principale quello di mettere l’allievo in condizioni di affrontare la soluzione di un problema, posto dalla richiesta di un ipotetico committente, scegliendo le metodologie e gli strumenti software più idonei, offrendo all’allievo la formazione necessaria per seguire con una certa autonomia l’evoluzione delle tecnologie informatiche senza assumere un carattere nozionistico-sintattico e ridursi ad una collezione di parata sistematica sui vari tecnicismi riguardanti la nicchia dei linguaggi di programmazione o dei sistemi di gestione delle base dati. L’allievo deve sviluppare le capacità di analizzare e risolvere problemi di varia natura, deve interpretare il problema e costruirne la soluzione, acquisire la capacità di lavorare in gruppo sviluppando capacità relazionali, superando la competizione ed imparando a criticare e ad essere criticati. L’insegnante ha il compito di aiutare l’allievo per portarlo all’acquisizione della mentalità informatica coadiuvandolo nel potenziamento delle capacità richieste (astrazione, generalizzazione, associazione, dipendenze, correlazioni, modellazione coerente con la realtà per descrivere le entità e le relazioni che costituiranno la base dati, applicazione degli algoritmi e delle strutture in maniera ottimale) senza trascurare gli aspetti organizzativi e motivazionali Il corso di sistemi di elaborazione e trasmissione dell’informazione si pone la finalità di contribuire alla formazione di un adeguato bagaglio di precise conoscenze tecniche e di capacità operative riguardanti i calcolatori e le reti di trasmissione dell’informazione. L’allievo deve acquisire capacità di analisi dei sistemi informatici, e strategie specifiche di risoluzione dei problemi. Bisogna evitare di ridurre la trattazione della disciplina a puro nozionismo descrittivo, per privilegiare, invece, le semplici realizzazioni alla portata degli allievi, in laboratorio; ciò consente di preparare gli alunni alla risoluzione pratica di piccoli problemi di dimensionamento di sistemi informatici. E’ infatti attraverso la sperimentazione sulla macchina che lo studente è in grado in comprendere e interiorizzare i costrutti del linguaggio o gli schemi sistemistici presentati a lezione. Dopo ogni modulo deve essere possibile pensare ad una attività di laboratorio, dove da un lato si presenti l’ambiente di sviluppo (sistema operativo, editor, compilatore, ecc.) e dall’altro si consenta allo studente la compilazione di programmi già scritti, l’identificazione di errori sintattici in programmi già scritti e la scrittura di semplici programmi nuovi dal nulla o partendo da schemi da completare. 8 2.4. Didattica dell’informatica Si potrebbe pensare che – essendo l’informatica una disciplina fondata sulla matematica discreta – molte delle proposte formulate in didattica della matematica si trasferiscano allo studio dell’informatica. Questo è vero solo parzialmente, e per varie ragioni. La ragione principale sta nel fatto che insegnare informatica vuol dire non solo insegnare concetti e metodologie, ma anche tecnologia. La necessità di mettere gli studenti in grado di risolvere problemi concreti, e cioè di analizzarli, di progettare soluzioni e di implementarle utilizzando il calcolatore, pone in molti casi problemi didattici non trascurabili. Questi sono riassumibili a mio avviso come segue: • il primo problema è quello di stabilire il rapporto corretto tra i diversi ambiti di insegnamento – per l’appunto concetti, metodologie e tecnologie – per evitare sbilanciamenti pericolosi, e in un senso – corsi eccessivamente teorici, dai quali gli studenti apprendono molti concetti ma senza essere in grado di metterli concretamente in pratica – e nell’altro – corsi eccessivamente tecnologici, dai quali gli studenti apprendono solo competenze prettamente operative, senza la dovuta ampiezza metodologica; • il secondo problema, una volta stabilito il giusto equilibrio tra teoria e pratica, è rappresentato dal modo in cui le nozioni dei diversi ambiti devono essere insegnate; è difficile immaginare che i principi di una disciplina e le sue metodologie possano essere insegnate allo stesso modo in cui si insegnano le regole della sintassi di un linguaggio o i comandi per l’amministrazione dei sistemi informatici, ovvero nozioni di minore rilevanza dal punto di vista concettuale e metodologico e prevalentemente di carattere mnemonico. Fino a qualche anno fa per gli insegnanti di informatica non era previsto alcun percorso di preparazione specifico; conseguita la laurea gli insegnanti affrontavano senza filtri l’esperienza di insegnamento, contando su sé stessi, sulle proprie capacità, e sulla propria volontà e applicando l’unico modo di insegnare conosciuto, ovvero quello che avevano vissuto dalla parte di studenti durante il periodo pre-universitario. Questo modo di concepire l’insegnamento è proprio della didattica della informatica di tipo tradizionale in cui “lo sforzo del didatta è tutto teso a trasformare un discorso specialistico (e dunque complesso in quanto si fa uso di un linguaggio tecnico non naturale) in uno più comprensibile e più consono alla natura dell’allievo”. La didattica tradizionale tende a dare per scontato che un allievo, una volta appreso un concetto in un determinato ambiente, o per mezzo di un dato strumento, sarà in grado di trasferire la conoscenza acquisita in situazioni simili ma in ambienti diversi in maniera del tutto spontanea: questo non sempre accade, anzi sovente le capacità cognitive e procedurali restano ancorate all’ambito in cui sono state imparate. Il problema principale di questo tipo di didattica, intesa come divulgazione di idee è proprio questo: operando esclusivamente sull’insegnamento non possiamo essere certi che avvenga (effettivamente e completamente) il cosiddetto “transfer cognitivo”. L’attenzione deve quindi spostarsi dal processo di insegnamento a quello di apprendimento, effettuando prove empiriche, con opportuni e ben studiati dispositivi sperimentali, sui risultati cognitivi ottenuti, passando così alla ricerca considerata sperimentale, entrando nel campo dell’epistemologia dell’apprendimento. In tale ottica è l’apprendimento il fine ultimo della didattica, la meta sulla quale si concentrano e si riassumono gli sforzi, le riflessioni, le ricerche. Per quel che concerne la didattica dell’informatica, esistono in ogni modo riflessioni comuni alle varie correnti di pensiero che la pervadono, a cui corrispondono inevitabilmente le parole chiave della disciplina: trasposizione, contratto, ostacolo, immagine, modello. Innanzi tutto è necessaria una breve riflessione sul rapporto tra insegnamento ed apprendimento. In questi due processi sono coinvolti insegnante, allievo e l’oggetto dell’insegnamento, come schematizzato dal celebre triangolo della didattica di Chevallard. Occorre porre particolare attenzione al termine “sapere” che si trova ben al di fuori del rapporto diretto insegnante-allievo. Un sapere dunque esterno al fenomeno di insegnamento apprendimento e perciò (se inteso come sapere accademico, il cosiddetto savoir savant, quello formale, quello dei programmi ministeriali) un 9 sapere momentaneamente inutilizzabile per una didattica efficace. Ovviamente si deve tentare di portare questo sapere all’interno della didattica, si tratta quindi di agire sul sapere accademico per trasformarlo in sapere da insegnare, facendo passare l’insegnamento dal vertice del triangolo in cui è individuato il sapere e contemporaneamente richiedere un analogo adattamento agli allievi, cosa tutt’altro che facile da ottenere. Per tentare di ottenere questo si deve agire sulle caratteristiche del nostro insegnamento e, soprattutto, sul sapere stesso: non è pensabile che un allievo possa apprendere contenuti informatici direttamente espressi in forma accademica, senza che essi siano adeguatamente plasmati, resi accessibili. La trasposizione didattica è proprio questa indispensabile operazione di preventivo adattamento del sapere alle caratteristiche del dialogo educativo che avviene tra l’insegnante e l’allievo. Ovviamente l’insegnante deve anche tener conto del sistema didattico e dell’ambiente sociale e culturale in cui si trova ad agire. L’ambiente in cui è “immerso” il triangolo della didattica è chiamato noosfera, che può essere definita come il luogo dei dibattiti di idee significative sull’insegnamento, le finalità della scuola, gli scopi della formazione, le attese della società, i programmi ministeriali; la noosfera è l’intermediario tra il sistema scolastico e l’ambiente sociale più esteso ed esterno alla scuola. Il complesso di interazioni e di comportamenti che si instaura tra allievo ed insegnante, che deve avere quale prodotto finale l’apprendimento, è formato da una serie di fasi e di momenti che caratterizzano l’attività d’aula quotidiana. Il rapporto allievo-insegnante è basato su regole non scritte, su convenzioni sottintese, accettate implicitamente tanto dal discente quanto dal docente. Queste regole, seppure mai dichiarate, sono ben conosciute da entrambe le parti in causa, come se costituissero una sorta di contratto mai firmato la cui validità è però indiscutibilmente nota e chiara a tutti: questo “contratto didattico” influenza in termini decisivi il processo di insegnamento-apprendimento. Esistono vari approcci ed accezioni del contratto didattico ma la definizione di riferimento rimane quella di Brousseau che lo definisce come “l’insieme dei comportamenti dell’insegnante che sono attesi dall’allievo e l’insieme dei comportamenti dell’allievo che sono attesi dall’insegnante”. 10 2.5. Scelta degli strumenti e delle metodologie Alla luce di quanto detto finora, si sono utilizzati per tutta la durata dell’intervento didattico strumenti che permettano di essere coerenti con il modello di riferimento. Ovviamente, nella scelta degli strumenti, non si può fare a meno di tenere in considerazione, oltre alle caratteristiche della disciplina, anche la tipologia di allievi con cui ci si rapporta. Strumenti e metodologie Continua discussione in classe Proiezione di presentazioni (videoproiettore) Attività pratiche di gruppo Mappe riassuntive Motivazioni La continua interazione con i ragazzi permette di guidarli nella costruzione di nuovi concetti richiamando quelli già emersi ed è utile inoltre per mantenere viva l’attenzione La proiezione di presentazioni appositamente preparate per ogni lezione permette di fare continuo uso del linguaggio visivo, indispensabile per spiegare con più semplicità i fenomeni di cui si parla, convinti che il linguaggio visivo sia di fondamentale importanza nello studio delle scienze e che questo sia particolarmente vero per ragazzi per cui l’esclusivo uso del linguaggio scientifico corretto potrebbe risultare difficoltoso. L’utilizzo dei lucidi risulta poi utile anche per guidare i ragazzi nel prendere appunti: si ritiene infatti, che uno dei compiti dell’insegnante sia quello di aiutare gli allievi nello sviluppo di capacità di sintesi. Le attività pratiche permettono ai ragazzi di riprodurre i fenomeni di cui si è parlato a lezione e quindi di comprenderli meglio. Inoltre il confronto con i compagni durante lo svolgimento del lavoro è fonte continua di stimoli. L’utilizzo di mappe riassuntive al termine di un percorso didattico può facilitare lo studio individuale degli allievi, perché permettono di riepilogare i principali concetti emersi durante le lezioni. 11 3. Il progetto 3.1. Il contesto dell’intervento didattico Il contesto dell’intervento didattico è quello dei moduli di tirocinio attivo svolti all’ITIS “A. Avogadro 7 ” di Torino, che nell’anno successivo alla ricorrenza del bicentenario della sua fondazione, è considerato per serietà degli studi un piccolo Politecnico. La riconosciuta considerazione di cui gode l’istituto nasce dal continuo aggiornamento tecnologico e didattico sia sul piano dei contenuti formativi, che sul piano delle strutture ambientali e delle attrezzature tecnico scientifiche. Lo stile educativo e le iniziative che tendono a rendere comunitaria e condivisa la presenza e permanenza nell'Istituto, sono in assonanza con un coinvolgente rapporto con l’ambiente studentesco, perché solo una scuola che va oltre la scuola diventa una vera scuola, nella sua missione civile e nella sua valenza sociale. Gli indirizzi di studio attivi per la sezione diurna sono Elettrotecnica ed Automazione, Informatica, Meccanica, Liceo Scientifico Tecnologico mentre per la sezione serale (Progetto Sirio) sono Elettrotecnica ed Automazione, Informatica, Meccanica; per l’indirizzo informatico si adotta la programmazione “Abacus 8 ”. L’intervento didattico si è svolto nella classe VA dell’indirizzo informatico, composta da ventidue alunni, il contesto è stimolante; nella fase osservativa si è potuto notare come la classe sia abituata a discutere, il docente accogliente, infatti, incentiva al confronto, stimola al ragionamento, e lascia spazio a interventi e domande e nel corso dell’attuazione del progetto si è continuato a dare rilevanza a questi aspetti e la risposta ottenuta dagli allievi è stata confortante. La disciplina di insegnamento è stata Sistemi di elaborazione e trasmissione delle informazioni. Il corso di Sistemi, disciplina ponte fra l’Informatica e l’Elettronica, si occupa dello studio delle architetture dei computer, delle situazioni che si possono rappresentare e utilizzare attraverso la programmazione in linguaggi di programmazione dal basso livello (Assembler e C) all’alto livello (Java, C++), nonché della progettazione e gestione delle reti locali e geografiche, attraverso lo conoscenza dei protocolli di comunicazione e dello sviluppo di applicazioni internet. 3.2. Scelta dei contenuti in relazione alla disciplina e alle sue caratteristiche Il corso di informatica ha come fine principale quello di mettere il perito informatico in grado di affrontare (dall’analisi fino alla documentazione) la soluzione di un problema, posto dalla richiesta di un ipotetico committente, scegliendo le metodologie e gli strumenti software più idonei, ed inoltre fornirgli la formazione di base che gli consenta di seguire con una certa autonomia l’evoluzione delle tecnologie informatiche. La disciplina fornisce all’alunno le conoscenze e le abilità necessarie per l’uso di un sistema di elaborazione ai più alti livelli della gerarchia che lo modella (linguaggi ad alto o altissimo livello, linguaggi applicativi). Essa deve essere intesa soprattutto come l’ambiente in cui si sviluppano le capacità di analizzare e risolvere problemi (anche di una certa complessità) di varia natura, e dove di volta in volta vengono proposti i paradigmi e gli strumenti linguistici più idonei alla natura del problema. Si ricorre ripetutamente al concetto di paradigma che, in questo contesto, si intende come chiave di interpretazione dei problemi e come modello di costruzione delle soluzioni (imperativo, logico, funzionale, rivolto agli oggetti, agli eventi, alle basi di dati). Lo studente, allo scopo di raggiungere una certa flessibilità e la capacità di affrontare nuove prospettive, deve acquisire alcune di queste chiavi e la capacità di impiegarle nei contesti appropriati. Si cerca quindi di privilegiare gli aspetti concettuali ed applicativi della materia riducendo al minimo quelli nozionistico sintattici. 7 Vedi POF Avogadro pp. 1-4 Il Progetto ABACUS è un corso sperimentale che il Ministero della P.I. ha varato nell'anno 92/93 per adeguare le competenze richieste al Perito informatico alle "innovazioni" avvenute nel settore negli ultimi anni. 8 12 Il fascino nello studio dell’Informatica è rappresentato dalla possibilità di comprendere le complessità tecnologica di un mondo che diventa sempre più digitale e passibile di elaborazione e dall’attualità con cui i nuovi mezzi di comunicazioni cambiano i modi abituali di vita. A dispetto di ciò, uno dei rischi che si corrono più frequentemente nell’insegnamento delle materie scientifiche è quello di lasciarsi trascinare dalle necessità didattiche e suddividere le discipline in “capitoli di libro” trascurando le importanti relazioni tra fenomeni studiati. L’argomento scelto per l’intervento didattico riguarda la programmazione orientata agli oggetti e il linguaggio Java, rappresenta un argomenti di notevole interesse per illustrare come i linguaggi di programmazione intervengono nella realizzazione di applicazioni. Con questo tema si toccano importanti concetti portanti delle discipline informatiche: L’esigenza di modellazione della realtà per trattare un problema Il ciclo di vita del software Il paradigma di programmazione orientata agli oggetti La capacità di razionalizzare e di tradurre i concetti astratti in implementazioni fisiche In relazione a ciò, uno degli obiettivi più importanti dell’intervento in esame è stato quello di favorire negli allievi la consapevolezza che prima di implementare meccanicamente legandosi vi è un'attività di modellazione che coinvolge le tre fasi (concettuale, logica, fisica), allo stesso modo in cui esulando dalla tecnologia corrente dei linguaggi di programmazione ad oggetti è importante carpire le dinamiche e i ragionamenti per l’individuazione di un diagramma astratto di classi che soddisfano le specifiche. Per poter tenere considerazione questi aspetti e affinché l’intervento didattico puntasse in tale direzione, in accordo con il docente accogliente, ho tracciato il percorso per l’introduzione alla programmazione ad oggetti che potesse confluire ed essere raccordato in un’applicazione dando un taglio squisitamente pratico e realizzativo, anche per dare una visione completa agli allievi dalla progettazione alla realizzazione fisica con l’apporto di modifiche o di revisioni in initere, finalizzate al continuo miglioramento seguendo i canoni del ciclo di vita del software. Nella scelta di questi contenuti ho cercato di dosare il livello di difficoltà in maniera opportuna a seconda dei casi, e contemporaneamente, motivare gli studenti rendendo interessante la materia, adeguandola ai tempi, proponendo ed evidenziando situazioni problematiche direttamente connesse alla vita reale. Il linguaggio di programmazione Java si presta in maniera eccellente a tali scopi e rappresenta uno stimolo decisamente intenso per gli allievi per una serie di motivi tra cui: • può essere insegnato a diversi livelli di approfondimento • oltre ad essere un linguaggio è una tecnologia condivisa dalla comunità scientifica • è estremamente diffuso e utilizzato in ambiti lavorativi • la sua conoscenza è direttamente spendibile nell’immediato 3.3. Descrizione sintetica del progetto La progettazione dell’intervento didattico è finalizzata ad introdurre i concetti di base della programmazione orientata agli oggetti, illustrando come un linguaggio evoluto come Java implementa il paradigma orientato agli oggetti. Nella preparazione del progetto, avvenuta ovviamente dopo le ore di osservazione della classe, la preoccupazione principale è stata quella di organizzare il lavoro in modo da renderlo il più possibile adatto e ‘accattivante’ per i ragazzi. Ho deciso, consigliandomi anche col docente accogliente di ridurre all’osso le lezioni frontali nel senso più tradizionale del termine, a favore di lezioni più interattive e partecipate. 13 3.3.1. Programmazione didattica Le tappe proposte a livello di progettazione e poi effettivamente seguite in tutta l’organizzazione e lo svolgimento del lavoro rientrano in un percorso di lungo periodo, ho tenuto conto di quali fossero gli obiettivi da raggiungere nel breve periodo suddividendoli in obiettivi cognitivi e obiettivi trasversali (da conseguire prevalentemente tramite attività di gruppo) come si evince dallo schema riportato di seguito. 1. Descrizione degli obiettivi che si vogliono conseguire A breve termine Comprendere i concetti di classe, oggetto, ereditarietà, polimorfismo, overriding e overloading, interfaccia Comprendere il paradigma orientato agli oggetti A medio termine Capacità di rielaborare i contenuti trasmessi dall’insegnante Capacità di analisi e valutazione delle problematiche nel progetto di applicazioni Acquisire la sintassi e semantica delle Capacità di modellare con strutture primitive del linguaggio Java le classi gli spaccati del mondo reale Implementare le classi e usare gli Capacità di esposizione oggetti in Java Capacità di allestire installare e Acquisizione di un configurare l’ambiente di sviluppo linguaggio appropriato Realizzare i diagrammi delle classi per Stimolare interesse un dato problema Saper implementare e documentare la realizzazione di applicativi Java che usano le classi A lungo termine Progettazione e realizzazione di architetture di classi per il problema da risolvere Acquisizione del metodo di studio che rifletta il metodo scientifico Autonomia e senso di responsabilità Acquisizione di un linguaggio appropriato Capacità di confrontare le proprie opinioni con quelle degli altri Capacità di collaborare con i compagni Capacità di collaborare con l’insegnante 2. Descrizione dei prerequisiti che gli allievi devono possedere • Dimestichezza nell’utilizzo dei semplici operatori (aritmetici, logici, relazionali), comprendendone la priorità nel loro utilizzo associativo • Concetti base di programmazione (variabile, costante) e dei tipi di dato • Conoscenza delle strutture logiche di controllo (condizionali e iterative) utilizzate nella programmazione procedurale 3. Predisposizione di materiale da adottare Per la preparazione dei lucidi da proiettare durante la lezione ho scelto e organizzato i contenuti attentamente affinché ogni concetto nuovo introdotto fosse accompagnato da illustrazioni e esempi tratti dal mondo reale, con un linguaggio minimale semplice e diretto. Ho fornito delle dispense come sussidio didattico ad integrazione del libro di testo utilizzato. 4. Predisposizione di un’attività di gruppo volta a collaudare e a rinforzare l’apprendimento teorico favorendo lo scambio di informazioni e il dialogo tra studenti L’attività è stata pensata per aiutare i ragazzi a far propri i concetti presentati, stimolandoli a sviluppare o potenziare l’apprendimento tra pari e le capacità espositive. Il lavoro condotto in gruppi di due o tre persone consiste nel creare su un cartellone il diagrammi delle classi 14 stabilendone le gerarchie e le dipendenze, e riconoscendo i metodi e le proprietà partendo da un problema di modellazione preso dalla realtà. In seguito si è cercato di promuovere una discussione in cui gli allievi potessero riflettere e scambiare opinioni circa il diagramma realizzato valutando quale soluzione fosse la migliore, e quindi procedere all’implementazione su calcolatore. Si è cercato di responsabilizzare il gruppo affidando delle consegne ben delimitate e delle regole circa la produzione di documentazione relativa alla realizzazione del progetto, l’organizzazione delle classi e dei sorgenti e il formalismo UML da utilizzare. 5. Allestimento di una prova di verifica sommativa per verificare il raggiungimento degli obiettivi prefissati La verifica deve essere costituita da un fatto problematico che deve essere realizzato e implementato su elaboratore in linguaggio Java in modo da permettere la valutazione del raggiungimento degli obiettivi indicati (con particolare attenzione agli obiettivi a breve-medio termine). Alcuni quesiti sono mirati a valutare la conoscenza, altri le competenze acquisite e le capacità di applicazione dei concetti costruiti durante il percorso. Per la modalità di correzione della verifica si attribuisce un punteggio a ciascun quesito in funzione della difficoltà; il punteggio attribuito ai quesiti che valutano l’applicazione dei concetti deve essere superiore a quello degli items che valutano la semplice conoscenza dei contenuti. 6. Prospetto dell’intervento didattico Attività Osservazione della classe Lezione introduttiva • Illustrazione obiettivi • Analisi dei pre-requisiti • Introduzione al linguaggio Java La programmazione orientata agli oggetti • Introduzione alla programmazione orientata agli oggetti • Il concetto di classe e oggetto • Attività in laboratorio (Installazione e configurazione dell’ambiente di sviluppo integrato) La programmazione orientata agli oggetti • L’incapsulamento e interazioni tra oggetti • Ereditarietà (Classi e Sottoclassi) • Attività in laboratorio (Implementazione di una classe) La programmazione orientata agli oggetti • Ridefinizione dei metodi e polimorfismo • L’ ereditarietà multipla (Interfacce) • Attività in laboratorio (Realizzazione di un diagramma di classi) Il linguaggio Java • Caratteristiche lessicali, tipi, strutture di controllo • Classi, ereditarietà, interfacce, packages, gestione delle eccezioni • Attività in laboratorio (Implementazione di un diagramma di classi) Verifica in classe Tempo previsto 2h 3h 20 min 40 min 2h 3h 40 min 2h 20 min 3h 1h 1h 1h 3h 1h 1h 1h 3h 1h 1h 1h 3h 15 4. Analisi del processo L’intervento didattico si è svolto in quindici ore di lezione, di cui un quarto in laboratorio, più la prova di verifica sommativa. I cambiamenti apportati al progetto iniziale sono stati di piccola entità, di seguito si riportano schematicamente i tratti salienti che sono emersi nelle diverse lezioni, per i contenuti delle trasparenze utilizzate nell’intervento didattico e per il materiale didattico fornito agli allievi come compendio didattico integrativo si rimanda rispettivamente agli allegati B e C 4.1. Lo svolgimento dell’intervento didattico Il giorno iniziale dell’intervento didattico, ho dedicato un’ora ad una lezione introduttiva durante la quale sono stati presentati oralmente agli allievi gli argomenti che avremmo trattato e gli obiettivi da raggiungere nel percorso; mi sono ritagliato altresì pochi minuti per contestualizzare la programmazione orientata agli oggetti e la genesi del linguaggio Java recuperandone l’epistemologia. Nel procedimento di accertamento dei prerequisiti mi sono sincerato che gli allievi possedessero: • la conoscenza delle nozioni elementari dell’architettura del calcolatore (architettura del computer, tipologie di memorie, registri) • la familiarità dei tipi nativi e fondamentali messi a disposizione dal linguaggio • la conoscenza di base della struttura minima di un programma scritto in Java, e saperlo scrivere su un foglio di testo o nell’ambiente di programmazione • il concetto di variabile e costante, come dichiararle e definirle • la dimestichezza nell’utilizzo dei semplici operatori (aritmetici, logici, relazionali), comprendendone la priorità nel loro utilizzo associativo • conoscenza dell’ambiente di sviluppo integrato (IDE) 9 Tutte le lezioni sono state condotte in modo partecipato, sono stati invitati gli allievo sin dall’inizio ad esprimersi liberamente interrompendo (chiedendo la parola per alzata di mano) ogni qual volta avessero avuto dubbi o difficoltà. Questo aspetto è stato particolarmente interessante per l’instaurazione di un buon clima di cooperazione tra insegnante e allievi basata sulla franchezza e sulla reciproca stima e considerazione. Dopo questa introduzione, sono state poste loro alcune domande in modo da suscitare una discussione che permettesse di valutare i prerequisiti. Il tutto è stato svolto in modo assolutamente informale, per evitare che i ragazzi pensassero di essere sottoposti a valutazione; lo scopo era quello di capire come portare avanti il lavoro in modo da creare un collegamento con le loro conoscenze pregresse, facilitandone l’apprendimento. Con l’ausilio delle trasparenze, ho ripercorso le strutture di controllo e i diagrammi di flusso che le governano, tale operazione di recupero dei prerequisiti è stata condotta in maniera agevole e senza sostanziali intoppi, grazie anche al fatto che gli allievi avevano studiato l’anno precedente come linguaggio di programmazione imperativo il linguaggio C la cui sintassi e semantica è analoga al linguaggio Java. Nella seconda lezione, tramite l’ausilio di trasparenze videoproiettate, si sono introdotte le caratteristiche del linguaggio orientato agli oggetti, dopo aver illustrato la necessità dell’industria del software di avere componenti riusabili (“senza dover ogni volta reinventare la ruota”), si è giunti ad affrontare il concetto di classe e oggetto la cui assimilazione rappresentava l’obiettivo finale. Grazie ad esempi tratti dalla vita reale, vedendo la classe come l’idea o la forma e presentando l’oggetto come la realizzazione dell’idea e il prendere forma si è potuto arrivare alla conclusione che un oggetto è una istanza (“esemplare”) di una classe, che viene creato (“instanziato”) dinamicamente. 9 In laboratorio per l’implementazione dei programmi sull’elaboratore si è utilizzato l’ambiente di sviluppo JBuilder X della Borland. 16 Le attività in laboratorio hanno riguardato problematiche squisitamente tecniche (installazione e configurazione dell’ambiente di sviluppo e implementazione del codice realizzato per provarlo e collaudarlo), ma anche momenti di cooperazione in lavoro di gruppo. Quello che si voleva far emergere da queste attività è che la progettazione e realizzazione del software parte dal problema di modellazione della realtà mantenendo un errore di modello contenuto in limiti che risultino accettabili per l’utenza. Dallo scambio di opinioni effettuato con qualche studente al di fuori dell’orario scolastico è emerso che questa fase di tirocinio è stata percepita da più di un allievo come qualcosa di parimenti importante, essendo composta da lezioni poco faticose, divertenti e in sostanza “utili all’ informatica”. Questo giudizio è ovviamente dettato dal modo in cui la disciplina è percepita: gli studenti di questa classe, come notato anche nel periodo di osservazione, sono fortemente condizionati dal contratto didattico per cui la lezione di informatica è poco standardizzata e non consiste nell’introduzione di un nuovo argomento, che permette di risolvere una serie di esercizi sempre più complicati col passare delle lezioni, fino al compito in classe che sancisce la chiusura di un ciclo ed il seguente passaggio a nuovo argomento. 4.1.1. Didattica e software libero Il software utilizzato nell'insegnamento delle (o con le) nuove tecnologie corrisponda ad un "libro di testo". Nel settore se ne sono affermati due: quello che si rifà alla cultura del confronto, rappresentato dai valori del software libero, e quello che possiamo ricollegare alla cultura del "monopolio privato", rappresentato dal software proprietario monopolistico che, per sua natura non ama il confronto e, appena può, lo soffoca al fine di impedire all'utente (consumatore) qualsiasi scelta. Il software libero, come "libro di testo", ha molteplici ragioni per essere adottato nella didattica perché principalmente: non discrimina i soggetti su base economica ma seleziona su base meritocratica; la gratuità delle licenze d'uso tra l'altro è conforme ai criteri stabiliti dalle varie circolari sull'adozione dei libri di testo che si preoccupano di stabilire un tetto di spesa, a seconda del tipo di scuola; permette, sia all'insegnante che all'allievo, l'assoluta libertà di copia, fondamento dello scambio della conoscenza; in questo modo si educa alla legalità non dovendo, nella scuola, ricorrere alla pirateria informatica per svolgere la normale attività educativa; è rispettoso della libertà d'insegnamento, perché permette all'insegnante di scegliere la soluzione e il fornitore che più si adatta alle sue esigenze conoscitive e didattiche; è rispettoso della libertà di parola, perché permette anche all'insegnante, e alla scuola più in generale, di "entrare in gioco" ed essere "soggetto di cultura"; educa alla consapevolezza informatica attraverso la trasparenza, la verifica e la sperimentazione; incentiva l'economia locale valorizzando le risorse umane locali. Ma la ragione avanzata dal software proprietario monopolistico che, a scuola, si debba usare il software secondo il criterio del "più diffuso", ad oggi, ha avuto la meglio, e ha messo all'angolo i valori del software libero sottraendo ai docenti la libertà di scelta nel settore informatico. Per un insegnante usare il software libero significa avere la possibilità di scegliere il proprio libro di testo ed esercitare il diritto della libertà d'insegnamento, ma per scegliere bisogna essere informati (preparati) e consapevoli; in alcuni casi bisogna anche dissentire da ciò che viene "calato dall'alto". Non stupisce perciò se oggi chi per la propria didattica sceglie di lavorare con il software libero, trovandosi isolato nell' "indifferenza generale", trasforma il proprio insegnamento in un insegnamento di libertà. Il Ministro per la Innovazione e le Tecnologie a più riprese ha indicato nell'uso del software libero (chiamandolo "software a codice sorgente aperto") una valida opportunità per la P.A. e al riguardo ha suggerito ai "decisori" di estendere i "buoni esempi". Per riappropriarci della libertà di scelta nelle nuove tecnologie ed essere al servizio della collettività e non degli interessi privati di aziende monopolistiche dobbiamo puntare: sull'autonomia scolastica (delle amministrazioni periferiche); sull'esercizio della libertà d'insegnamento (dei singoli docenti). Dobbiamo fare in modo che gli insegnanti esercitino il loro diritto della libertà di scelta nelle nuove tecnologie, togliendosi di dosso qualsiasi timore reverenziale. Al riguardo dobbiamo procedere in 17 due direzioni: dare impulso ad incontri di informazione e formazione sul software libero per creare informazione e consapevolezza e battere "l'indifferenza generale" prodotta dalle varie alfabetizzazioni del MIUR; creare esempi di didattica con il software libero, creare modelli da diffondere, creare documentazione sul software libero, in maniera da agevolarne la diffusione. Il software libero è rispettoso della libertà d'insegnamento; il software libero è rispettoso della libertà di parola, nel settore informatico; il software libero non discrimina economicamente le persone. Ma solo quando i docenti si saranno riappropriati della libertà di scelta e della libertà d'insegnamento nelle nuove tecnologie potremmo dire di avere una formazione informatica in una scuola aperta e pluralista. 4.2. Gli aspetti emotivi e relazionali L'insegnamento non consiste nella semplice trasmissione di contenuti e teorie ma ha a che fare con le relazioni che sono concomitanti all'apprendimento, quindi ne consegue che il lavoro educativo è sempre un lavoro di gestione: mentre insegna, il docente non deve occuparsi solo delle relazioni interpersonali, ma anche di relazioni di gruppo con l'intera classe, garantendo una qualità educativa che accompagni la crescita sociale e culturale dei singoli e del gruppo (dinamiche sottolineate dal progetto Brocca). La gestione educativa della classe pone il problema di integrare nel lavoro del docente una responsabilità culturale di tipo intellettuale e disciplinare e una responsabilità culturale emotiva affinché possano essere espressi entrambi i versanti dell'apprendimento: quello intellettuale e quello dinamico-emotivo, sostenendo l’allievo verso assetti mentali più adeguati al compito di apprendere. In classe si hanno gli indicatori che definiscono un insegnate capace: competenze tecniche e capacità verbali possono fallire nel lavoro con gli allievi. Occorrono capacità gestionali di contatto, di incoraggiamento e coinvolgimento rispetto agli allievi impegnati a crescere "nell'intimità" (anche scomoda) del gruppo dei pari. L’insegnante deve mantenere sempre reciprocamente attivo l'ascolto e l'empatia con gli allievi a senza scissione tra sentimenti e comportamenti professionali che possono essere percepiti dagli allievi come frapposizione di barriere comunicative. Gestire la responsabilità di un processo educativo è difficile perchè si tratta di un processo di cambiamento e di crescita. Assumersi una responsabilità educativa coinvolge una dimensione relazionale di ascolto e risposta alle domande e ai bisogni delle persone che ci sono affidate e una dimensione giuridica ed etica, dal momento che questa non può essere superficiale perchè coinvolge delle persone. La risorsa professionale più preziosa del docente è la disponibilità emotiva e profonda a incontrare e gestire, dentro e fuori di sé, le emozioni e le ansie evolutive. Gli insegnanti che hanno difficoltà a confrontarsi in modo autentico con la dinamica emotiva della classe e con i diversi stili di apprendimento degli allievi, scindono questa dimensione gestionale. Lo spazio scolastico può essere anti-educativo e anti-evolutivo, se manca la vita di relazione. Nel corso dell’intervento didattico gli allievi si sono dimostrati attenti alle lezioni, partecipativi e motivati, il clima delle lezioni era simile a quello che si instaura in un gruppo di lavoro; E’ stato possibile guidare la classe verso il raggiungimento di un obiettivo di apprendimento prefissato. Vi sono stati momenti in cui, a causa del basso livello della soglia di attenzione e concentrazione che scemava lentamente dopo la seconda ora, gli allievi instauravano un atteggiamento mentale antieducativo, infatti essi si distraevano facilmente e coglievano ogni occasione per cercare di attirare l’attenzione in modo da perdere tempo e ridurre il carico didattico; tale atteggiamento l’ho riscontrato anche quando ho dovuto affrontare la spiegazione di alcuni nozionismi (sintassi e semantica del linguaggio di programmazione Java) rifacendomi ad una didattica tradizionale. Durante le lezioni ho cercato di procedere in modo chiaro per dare la possibilità agli allievi di prendere appunti correttamente, mi sono sembrati volitivi e motivati e alcuni sono intervenuti più volte per avere chiarimenti e per approfondire gli argomenti trattati. 18 Ho potuto constatare che i ragazzi tendono a distrarsi molto facilmente, in alcuni casi intervengono nel corso della lezione in maniera infelice per il solo motivo di perdere tempo. A tal proposito è necessario non lasciarsi fuorviare dai loro interventi, mostrando autorevolezza nel condurli lungo il percorso didattico prefissato. Ho cercato di agevolare e incitare alla partecipazione i ragazzi alle lezioni, coinvolgendoli nella discussione e guidandoli nella risoluzione dei problemi proposti. In laboratorio ho avuto minore difficoltà a gestire la classe e nel contempo ho notato un maggiore impegno da parte dei ragazzi. In tale contesto è stato, infatti, possibile costituire dei gruppi di lavoro di tre soggetti al più. In questo modo è stato possibile responsabilizzare i ragazzi assegnando al gruppo un obiettivo preciso, la loro risposta è stata confortante e si sono dimostrati entusiasti dell’esperienza. Nell’ambito del gruppo è favorita la cosiddetta peer education 10 . L’ultima ora di ogni intervento è stata destinata alle attività nel laboratorio di informatica, sia per mantenere la soglia di attenzione su livelli decisamente accettabili sia per incentivare la collaborazione e la discussione tra gli allievi. In effetti, la lezione in laboratorio si è rivelata un momento privilegiato nel coinvolgimento degli studenti: il cambio di ambiente anche fisico, in una situazione totalmente sconosciuta, ha portato ad una percezione di una lezione inconsueta e sgravata dal peso della valutazione; si è quindi notata la maggiore disponibilità al dialogo ed al confronto (e quindi all’implicazione personale) anche di alcuni tra gli studenti solitamente più insicuri e titubanti. L’utilizzo del software ha inoltre consentito di concentrare maggiormente l’attenzione sugli aspetti qualitativi dei programmi effettuati e favorito la conversione tra registro logico e pragmatico. In questo clima estremamente positivo, disteso ed estremamente aperto al confronto, le semplici situazioni a-didattiche presentate hanno portato a lezioni dinamiche, dialogate ed estremamente costruttive. 10 J.P. Pourtois, “La ricerca-azione in pedagogia”, in E. Becchi, B. Vertecchi, Manuale critico della sperimentazione e della ricerca educativa, Milano, Angeli, 1988, pp. 134-155 19 4.3. Riflessioni L’esperienza didattica è stata articolata secondo tre momenti o fasi di cui schematicamente si riportano le attività correlate. 1. Fase Preattiva • Presentazione ai docenti accoglienti e ai tirocinanti del modello di tirocinio da parte del supervisore • Presentazione scuola, classe, piano di lavoro da parte dei docenti accoglienti al tirocinante • Accordo generale sull’intervento • Osservazione della classe sede di tirocinio • Progettazione dell’intervento didattico (I.D.) e presentazione al supervisore • Confronto con i docenti accoglienti sull’I.D. • Discussione con i docenti SSIS e confronto con gli altri specializzandi • Collegamento tra laboratori e tirocinio per favorire una progettazione didattica funzionale al processo di insegnamento/apprendimento • Messa a punto dell’I.D. 2. Fase Attiva • Svolgimento dell’I.D. • Confronto con i docenti accoglienti e il supervisore sull’andamento dell’I.D. • Preparazione degli strumenti di valutazione • Valutazione in itinere del processo di insegnamento/apprendimento • Raccolta del feedback 3. Fase PostAttiva • Confronto finale con i docenti accoglienti • Discussione conclusiva con il supervisore • Confronto con gli altri specializzandi • Riflessione e relazione conclusiva • Valutazione del processo di formazione La didattica è un sapere complesso che non si può semplificare, ed è complessa perché ha a che fare con l'insegnante e gli allievi, che hanno una loro personalità, un loro modo di essere e di agire. Apprendere non vuol dire sola conoscenza (sapere), ma anche competenza (saper fare), inoltre l'insegnante deve suscitare il valore formativo delle discipline (perché studiare informatica,….), per fare questo l'insegnante deve aggiornarsi sulla propria disciplina, deve capire come potenzia la capacità di pensiero così da poter motivare i ragazzi sulla epistemologia della materia. L’insegnante deve fare mediazione tra la ricerca e la disciplina in classe. L’informatica come disciplina risente ancora della profonda dicotomia tra disciplina scientifica e sapere tecnologico, è vero sia che possiede una propria epistemologia con tutto il fermento e l’affanno della ricerca scientifica condotta con rigore scientifico, ma è anche collocabile al servizio di altre discipline fornendo un modo di comunicazione alternativo. In virtù di tale considerazione, lo studio dell’informatica, se non correlato a qualcosa di tangibile, di pratico risulta essere poco efficace. Per questa ragione un approccio che proponga come punto di partenza un’ampia varietà di esempi, esercizi e progetti che prendono spunto da molte situazioni e che offrono agli studenti la possibilità di risolvere problemi reali costituisca decisamente un’ottima strategia per l’apprendimento dell’informatica. 20 Ho cercato di proporre la sintassi e l’apprendimento di tali costrutti tramite l’apprendimento per scoperta 11 ponendo l’accento sull’itinerario di apprendimento e più precisamente sul suo carattere di processo indipendente e sul fatto che la conquista della verità di una proposizione avviene per conquista autonoma. La scoperta va intesa in senso relativo e cioè come se si fosse i primi a farlo. Una autentica scoperta, anche in senso relativo, richiede non solo l’enunciazione di un’ipotesi attendibile ma anche l’effettiva verifica. Il linguaggio utilizzato nelle spiegazioni non usa volutamente una terminologia accademica e complessa per rendere più accessibili i contenuti ai discenti. Gli argomenti sono corredati da esempi e piccoli progetti, a cui segue l’implementazione al personal computer del laboratorio dopo che è stato realizzata l’analisi logica del problema, la scelta dell’algoritmo, la formalizzazione secondo la terminologia dei diagrammi di flusso e la decodifica in linguaggio Java. Il tutto seguendo gli aspetti caratterizzanti la ricerca-azione, orientata verso l’azione sul campo, conferendo alla didattica un sapere in azione progettuale che si confronta con la realtà. A tal fine di grande aiuto è l’utilizzo di un approccio storico che permette di raggiungere due obiettivi importanti: in primo luogo si tratta di un’impostazione che permette di proporre gli argomenti sotto forma di situazioni problematiche, portando gli studenti nelle stesse condizioni dei ricercatori, in secondo luogo stimola negli studenti la riflessione sul ruolo delle osservazioni e sulla dinamicità e non contingenza del sapere scientifico. Questo approccio è ritenuto opportuno e percorribile in tale senso, si tiene a freno così l’esuberanza e la voglia che gli studenti manifestano di poter mettersi subito a programmare perdendosi nei tecnicismi e uscendo dall’iter teorico e di progettualità che devono adottare e fare proprio come paradigma. Durante tutto l’intervento didattico, le teorie proposte sono state presentate come interpretazioni dei fenomeni osservati, cercando di non confondere mai il livello empirico con il modello interpretativo. E’ un aspetto molto importante, perché contribuisce a smantellare la concezione di scienza come prodotto preconfezionato, che a volte viene trasmessa ai ragazzi durante i livelli inferiori di scuola secondo cui scienza e verità sono sinonimi. Troppo spesso la scuola contribuisce al perpetuarsi del pensiero empirico-realista, secondo cui il sapere scientifico è un insieme di conoscenze provate e oggettive ed è quindi sempre corrispondente al vero. Un buon insegnante di scienze debba trasmettere ai suoi studenti l’idea che le teorie scientifiche non rispecchiano la realtà, ma sono delle interpretazioni coerenti e logiche della realtà, e per far questo, il docente dovrà presentare i modelli interpretativi dei fenomeni trattati come il frutto di un lungo cammino compiuto dagli scienziati. Come materiale di supporto didattico mi sono avvalso di una presentazione in formato elettronico che ho utilizzato come preambolo di ogni lezione, per riprendere velocemente gli argomenti trattati e per introdurre i nuovi, per i contenuti delle trasparenze utilizzate si rimanda all’Allegato B. Inoltre, a compendio del libro di testo adottato dall’insegnante, ho fornito una dispensa sia in formato cartaceo che in formato elettronico con i contenuti teorici essenziali e con i testi degli esercizi con cui gli allievi si sono cimentati, per il contenuto delle lezioni si rimanda all’Allegato C. Come si evince dalla struttura di tale dispensa, il messaggio che traspare e che ho ribadito durante gli incontri, è che la programmazione, qualunque sia il linguaggio adoperato e la tecnologia scelta, consta di fasi in cui un posto di rilievo va sicuramente delegato alla riflessione sulle specifiche e sul testo del problema al fine di ricavare l’intuizione e il “modus operandi” logico che permetta in maniera efficace ed efficiente di giungere alla risoluzione voluta. In questa fase di riflessione, l’allievo deve essere in grado di capire il problema che gli è stato sottoposto dal puro punto di vista dell’intelligibilità, poi deve articolare la metodologia di riconoscimento delle strutture dati e del loro tipo da utilizzare per contenere le variabili necessarie, quindi abbozzare il diagramma di flusso contenente l’algoritmo risolutivo. 11 21 Se il collaudo su carta del diagramma porta a buon fine allora si può iniziare con la fase di transcodifica usando la sintassi e la semantica del linguaggio implementativo. E’ buona norma scrivere il codice su carta per familiarizzare con le strutture cardine del linguaggio e assimilare i tecnicismi e con le parole chiavi del linguaggio, poi l’ultimo passo è la stesura del listato in formato elettronico utilizzando l’ambiente di sviluppo e usufruendo dell’ambiente di debug integrato per il collaudo della realizzazione. La scelta di fornire agli studenti tale impostazione è stata condivisa anche dal docente accogliente, che la pensava già nel modo suddetto, in effetti quando si entra in laboratorio i computer, notevole fonte di distrazione, sono spenti e solo quando bisogna collaudare il listato è possibile l’accesso. Nonostante le difficoltà riscontrate, nel complesso ritengo comunque abbastanza soddisfacente l’esperienza di tirocinio. Gli strumenti di didattica dell’informatica si sono rivelati efficaci per un’analisi critica della natura e dei limiti dei processi di apprendimento, ma anche delle strutture e dei metodi utilizzati. E’ essenziale possedere strumenti adeguati di analisi che consentano di prenderne piena coscienza, per poi sperimentare percorsi alternativi ed effettuare ulteriori valutazioni nel continuo tentativo di migliorarsi. L’insegnante in questo senso è anche ricercatore: deve preparare materiale didattico, valutare e sperimentare approcci alternativi, tenersi informato sugli sviluppi della didattica, confrontarsi con i colleghi e con gli stessi studenti nel tentativo continuo di migliorare se stesso, la sua professionalità e competenza 12 . Ovviamente tutto questo avverrà, in futuro, in tempi assai più compressi rispetto a quelli riservati a questa esperienza di tirocinio ed in ambienti sicuramente meno rassicuranti e collaborativi. Tengo a sottolineare che dal punto di vista strettamente personale, ritengo l’esperienza descritta in questa trattazione estremamente formativa e coinvolgente. L’accoglienza riservatami dall’ambiente classe è stata positiva oltre ogni previsione, i ragazzi hanno accettato la mia presenza con disponibilità e sincero entusiasmo, creando un clima in classe di collaborazione e confidenza inaspettato. A questo clima ha contribuito anche il docente accogliente, entusiasta in particolare delle lezioni in laboratorio e del relativo trasporto e partecipazione con cui queste sono state accolte dagli studenti. 4.4. Progettazione della verifica La progettazione della verifica sommativa non può essere scissa dalla forma di valutazione; mi sono ispirato alla valutazione autentica 13 che nasce da un’esigenza di coerenza con le caratteristiche di un “apprendimento significativo” 14 , tale istanza discende dal costruttivismo (Piaget): “io apprendo in quanto costruisco il mio sapere”. Le istanze di rendicontazione per la valutazione autentica impongono che bisogna valutare non solo ciò che un ragazzo “sa” (sapere riproduttivo), ma anche la costruzione e lo sviluppo delle conoscenze, la capacità di applicazione al reale di quanto si è appreso, ponendo attenzione al processo dell’apprendimento e alla capacità di applicare le conoscenze acquisite in contesti reali. Gli aspetti presi in considerazione dalla valutazione autentica 15 sono: • capacità di pensiero critico, esprimere un giudizio sulla base di criteri giustificabili; 12 M. Pellerey, Progettazione didattica, Torino, SEI, 1983. 13 Corso di Docimologia di Castoldi, Definizione di valutazione autentica secondo Wiggins (1993; 1998): “valutare ciò che lo studente sa fare con ciò che sa”. 14 Apprendimento che modifica la “struttura cognitiva” di chi apprende 15 M. Comoglio, “La valutazione autentica”, Orientamenti pedagogici, vol. 49, n. 1, gennaio-febbraio 2002. 22 • metacognizione, fa riferimento alla consapevolezza delle strategie mentali che il soggetto mette in atto e alla sua capacità di migliorarle; • capacità di Problem Solving; • ragionamento inteso come capacità di partire da premesse e portare avanti un ragionamento deduttivo; • capacità di lavorare in gruppo in situazione concreta di vita. In una parola possiamo dire che la valutazione autentica serve per valutare le competenze. I test tipici richiedono solo una risposta corretta, il compito autentico invece richiede un prodotto di qualità è una giustificazione della realizzazione o processo (prodotto = frutto, processo = elaborazione). Le prove tradizionali fanno riferimento a situazioni fittizie, quelle della valutazione autentica invece si riferiscono a quelle che si creano nella realtà. La prova somministrata all’ITIS Avogadro è riportata in allegato C. Per le verifiche formative e per le prove di laboratorio in itinere ho pensato di assegnare degli items che richiedessero agli allievi capacità di comprensione dei concetti OOP: ( "cosa stampa il seguente codice OOP ... ? ", "completare le parti mancanti affinché il comportamento sia il seguente ..." ) e che capacità di progettazione o sintesi di codice OOP ("implementare una data interfaccia di classe", "proporre un'interfaccia di classe per oggetti aventi un certo comportamento",-"individuare le classi degli oggetti e le loro relazioni (is, has, uses) da una realtà descritta a parole"). Segue un esempio frutto di un’esercitazione di laboratorio. Esempio: Progettare la classe LISTINO_PREZZI così come viene normalmente inteso nel senso comune (sapere se c'è una certa merce e quanto costa, cambiare il prezzo, ecc. ). a) proporre una coerente e completa interfaccia di classe, scegliendo con cura i nomi e giustificando le scelte fatte qualora ciò si renda necessario; b) implementare l'interfaccia in un linguaggio OOP c) proporre un esempio d'uso (ad. es. un programma principale di prova). 23 4.5. Valutazione del lavoro fatto dagli studenti La valutazione 16 è l’espressione da parte del docente di un giudizio su ogni singolo allievo in riferimento ad almeno due componenti dell’educazione: l’insieme delle capacità raggiunte; il grado di implicazione personale. Il processo valutativo riguarda quindi solo in parte le competenze raggiunte dallo studente, non esclusivamente a livello dell’assegnazione di un “voto” basato sul risultato e sull’impegno, ma studiandone il lavoro di costruzione della conoscenza con l’occhio critico e gli strumenti acquisiti dagli studi in didattica dell’informatica. Strumenti che servono anche per la valutazione del proprio lavoro compiuto in aula, in conformità con i risultati ottenuti dagli studenti, analizzando il proprio operato e ripensando in maniera critica alle proprie strategie metodologiche ed alle scelte effettuate, segmento curricolare compreso. La valutazione è dunque complessa e multidimensionale, così come lo è l’intricato processo sistemico di insegnamento-apprendimento, per cui per valutazione non deve intendersi solamente il bilancio dell’attività svolta, essa è infatti stata attuata lungo tutto l’arco di lezioni del progetto di tirocinio, è parte integrante del processo di insegnamento-apprendimento ed ha influenzato continuamente contenuti e metodologia del lavoro in aula. Si valuta anche per effettuare scelte a livello di contenuto e circa la metodologia del lavoro in aula; per prendere decisioni circa l’ambiente classe e non ultimo per comunicare agli allievi, spesso implicitamente, quel che è importante . Per quel che riguarda la valutazione dell’ambiente classe devo dire che non è facile per un tirocinante influire in maniera decisiva in ambiente forgiato da mesi e mesi di collaborazione con l’insegnante titolare che, peraltro, è presente durante le lezioni. Cambiare le abitudini degli studenti, infondendo il gusto per l’esplorazione e la sperimentazione, dando la giusta importanza alla risoluzione dei problemi e alla scoperta, spostando l’attenzione dai risultati ai processi, è una trasformazione radicale che nella prima metà di tirocinio è tuttavia parsa possibile. Nel perseguire questo cambio di prospettive, verso un’implicazione personale dello studente, obiettivo primario in un’ottica costruttivista, è fondamentale l’ambiente d’aula; infatti il superamento della semplice conoscenza verso la competenza si esplicita anche attraverso atteggiamento, volizione, gusto e stabilendo una relazione positiva tra menti, comprendendo e valorizzando le risorse emotive a disposizione 17 . 16 L.S. Beccegato-B.M. Varisco, Docimologia. Per una cultura della valutazione, Milano, Guerini, 2000. Pombeni, M.L., “L’adolescente e la scuola”. In A. Palmonari (a cura di), Psicologia dell’adolescenza, Bologna, Il Mulino, 1997, pp. 271-291 17 24 E’ evidente che non si valutano gli studenti, o meglio il loro lavoro, esclusivamente allo scopo di assegnare loro un voto, e questo dovrebbe essere ben chiaro anche agli stessi allievi, ma per scardinare l’associazione del termine valutazione con “voto sul registro” occorrerebbe un lavoro a lungo termine, possibilmente in collaborazione con gli altri docenti ma anche con le famiglie e l’ambiente esterno in generale 18 . Durante tutto il periodo del tirocinio si è prestata particolare attenzione al comportamento tenuto in aula dagli studenti, il modo in cui lavorano, ascoltandoli esporre le loro idee, prendendo gli errori come spunto di partenza di discussioni anziché semplicemente correggerli, nel tentativo di valutare per ogni allievo il grado di implicazione personale raggiunto nel processo di apprendimento. Mediamente considero soddisfacente l’esperienza da questo punto di vista, la disponibilità ed il coinvolgimento sincero, in generale, mi sono parsi notevoli, nettamente al di sopra delle mie aspettative. Per esempio è accaduto più volte che alcuni allievi abbiano risolto a casa esercizi non assegnati e ne abbiano poi richiesta la correzione in classe. A volte le stesse domande spontanee degli studenti hanno portato ad approfondimenti in maniera naturale, guidata dal gusto del sapere e della scoperta. Ovviamente il grado di coinvolgimento all’interno della classe ha assunto sfumature diverse, ci sono anche studenti che si sono estraniati dalle lezioni, intervenendo solo quando direttamente chiamati in causa (chi per disinteresse, chi per carattere, chi perché in quel momento aveva altro per la testa) o quando si accorgevano che l’insegnante li stava osservando. Nel complesso processo di valutazione rimane ad ogni modo inclusa anche l’assegnazione del voto, perseguendo non tanto la chimera dell’oggettività quanto la coerenza e l’equità. Affinché dunque un voto sia giudicato equo occorre anche in questo caso l’implicazione personale dello studente, una responsabilizzazione molto forte difficile da ottenere sul breve periodo. Ho pertanto potuto assicurare professionalità, chiarezza e trasparenza, godendo di una ampia fiducia da parte degli studenti derivata probabilmente anche in questo caso dal ruolo di professore “a tempo determinato”, e in quanto tale giudicato libero da pregiudizi che condizionano un insegnante di lunga data. Nella verifica sommativa, sia in momenti di valutazione non istituzionalizzati, i criteri che hanno guidato, per il processo di valutazione degli studenti ho applicato i seguenti criteri: • il criterio di realizzazione: la messa in atto di strategie adeguate a fronte di situazioni problematiche. Ad esempio l’impostazione di una risoluzione adeguata, la schematizzazione della situazione, l’utilizzo di grafici, ma anche la giustificazione del comportamento seguito per giungere alla soluzione, essere in grado argomentarne e giustificarne i passaggi. • il criterio di risultato: saper condurre il processo risolutivo secondo un comportamento logico, giungendo alla risposta giusta. Ma anche saper giustificare che la via scelta è la più idonea, la più economica. • Il criterio di comprensione: saper esporre il risultato ottenuto, metterlo in relazioni con altri in situazioni diverse. Si è inoltre cercato di rendere palese, ogni volta fosse possibile, l’importanza del processo rispetto al risultato, ma sradicare convinzioni costruite in anni di scolarizzazione non è affatto banale. Per la correzione delle prove ho utilizzato la griglia di valutazione di seguito riportata, in cui ho distinto dei livelli associandone il giudizio di valore secondo i criteri riportati, il voto attribuito espresso in decimi può essere il risultato della combinazione di livelli diversi di conoscenze, competenze, capacità e comportamenti 19 . Dall’analisi dei risultati si evince che i gli allievi sono riusciti ad individuare le classi e gli oggetti necessari per la risoluzione del tema, qualcuno ha avuto problemi nello strutturarne il diagramma, le principali difficoltà sono incontrate nell’implementazione nel linguaggio Java e nella scrittura delle procedure. 18 19 G. Domenici, Manuale della valutazione scolastica, Bari, Laterza, 2001. B.M. Varisco- L. Santelli, Docimologia. Per una cultura della valutazione, Milano, Guerini e associati, 2000. 25 Griglia di Valutazione Conoscenze Competenze Capacità Comunica in modo proprio, efficace ed articolato; è autonomo ed organizzato; Affronta autonomamente anche collega conoscenze attinte da Complete, con compiti complessi, applicando ambiti pluridisciplinari; approfondimenti le conoscenze in modo corretto analizza in modo critico, con autonomi e creativo un certo rigore; documenta il proprio lavoro; cerca soluzioni adeguate per situazioni nuove Comunica in maniera chiara ed appropriata ; ha una propria autonomia di lavoro; Sostanzialmente analizza in modo Affronta compiti anche complete complessivamente corretto e complessi in modo accettabile compie alcuni collegamenti, arrivando a rielaborare in modo abbastanza autonomo Comunica in modo adeguato, anche se semplice; non ha piena autonomia, ma Conosce gli elementi Esegue correttamente compiti è un diligente ed affidabile essenziali, esecutore; semplici; fondamentali affronta compiti più complessi coglie gli aspetti pur con alcune incertezze fondamentali, ma incontra difficoltà nei collegamenti interdisciplinari. Complessivamente Comunica in modo semplice, Esegue semplici compiti senza accettabili; ma non del tutto adeguato; errori sostanziali; ha ancora lacune, ma coglie gli aspetti affronta compiti più complessi non estese e /o fondamentali, ma le sue con incertezza profonde analisi sono lacunose Comunica in modo non sempre coerente e proprio; ha Applica le conoscenze minime, difficoltà a cogliere i nessi Incerte ed senza commettere gravi errori, incomplete logici e quindi ha difficoltà ma talvolta con imprecisione ad analizzare temi, questioni e problemi Comunica in modo decisamente stentato e Solo se guidato arriva ad improprio; Frammentarie e applicare le conoscenze minime; ha difficoltà a cogliere i gravemente lacunose commette gravi errori anche concetti e le relazioni nell’eseguire semplici esercizi essenziali che legano tra loro i fatti anche più elementari Nessuna Nessuna Nessuna Livelli Voto in decimi A 9 -10 B 8 C 7 D 6 E 5 Partecipazione: opportunistica Impegno: debole Metodo: ripetitivo F 3-4 Partecipazione: di disturbo Impegno: nullo Metodo: disorganizzato G 1–2 Comportamenti Partecipazione : costruttiva Impegno: notevole Metodo : elaborativo Partecipazione: attiva Impegno: notevole Metodo: organizzato Partecipazione: recettiva Impegno: soddisfacente Metodo: organizzato Partecipazione: da sollecitare Impegno : accettabile Metodo : non sempre organizzato Partecipazione: dispersiva Impegno : discontinuo Metodo : mnemonico 26 Gli elaborati hanno ottenuto i risultati riportati nel grafico sottostante: La media complessiva dei voti è stata 6,9 e sono state assegnate cinque insufficienze. Anche a giudizio del docente accogliente il compito ha ottenuto risultati complessivamente soddisfacenti, addirittura migliori rispetto a quelli delle precedenti verifiche. Le difficoltà che si incontrano nell'insegnamento della OOP non consistono tanto nel far apprendere i meccanismi di base (creazione di oggetti e di classi) quanto nel cambio di atteggiamento che occorre far assumere gli allievi nell'affrontare i problemi, cioè nel far loro adottare una corretta metodologia di progettazione OOP. Tipicamente gli allievi tendono a non riconoscere le classi nella descrizione a parole di una certa realtà. Anche quando le riconoscono non scelgono in modo appropriato i metodi, tralasciandone alcuni di essenziali, dimenticando di applicare il principio di information hiding, ecc. In altre parole quella che viene spesso a mancare è la capacità di astrazione, ancora forse non troppo sviluppata a questa età. Un'altra fonte di errori frequenti, causata da questa tipica limitazione, è costituita dall'ereditarietà: non costruiscono adeguatamente le gerarchie di classi, specie quelle in cui occorrerebbe introdurre delle classi astratte. La confusione tra relazioni is e has è un'altra delle cause di strutturazioni non appropriate. Un consistente miglioramento per l'apprendimento della adeguata metodologia di programmazione anche per i problemi comuni è stata apportato, almeno in parte, con un'adeguata scelta di alcuni item significativi che insistevano sulle lacune palesate dagli allievi durante i loro interventi, per ciascuno di essi ho proposto la soluzione ottimale mettendola a confronto con quelle proposte dagli studenti stessi. 27 5. Conclusioni All’interno del percorso biennale previsto dalla Scuola di Specializzazione per l’Insegnamento Secondario, struttura didattica interateneo che ha come obiettivo la formazione degli insegnanti della scuola secondaria, il tirocinio riveste un ruolo di primaria importanza perché in esso confluiscono tutte le conoscenze e le riflessioni metodologiche, didattiche, epistemologiche e sociologiche acquisite nei vari corsi frequentati e perché mi ha permesso, per me che non avevo mai avuto esperienze lavorative nell’ambito della scuola, di confrontarmi con tutti gli aspetti propri dell’attività lavorativa scolastica (pratici, didattici, collegiali, gestionali, educativi e relazionali). In questo quadro, il tirocinio non può essere pensato come momento isolato nel processo di formazione del futuro docente. Questa attività permette agli specializzandi di entrare a diretto contatto con le scuole, prima nella fase osservativa e poi in quella attiva, in cui si effettua una vera e propria esperienza d’insegnamento. Il carattere formativo del tirocinio è favorito dalla pluralità dei soggetti coinvolti (docente accogliente, supervisore, relatore…) assieme a cui lo specializzando elabora il suo progetto didattico, ne gestisce la realizzazione e ne valuta l’efficacia, permettendo un proficuo confronto tra le diverse esperienze e competenze. Con le esperienze di tirocinio attivo ho portato spesso, all’interno delle classi, innovazioni didattiche e metodologiche apprese nei corsi e nei Laboratori SSIS che consentono anche ai docenti accoglienti di fare tesoro dell’esperienza acquisita attraverso gli specializzandi, divenendo un momento importante di crescita per il sistema d’istruzione nel suo complesso. La Scuola di Specializzazione può quindi essere pensata come il luogo di mediazione tra l’attività di formazione, svolta assieme ai Supervisori per il tirocinio ed in collaborazione coi docenti accoglienti, e la ricerca nell’insegnamento e nella didattica, che va ben al di là della trasmissione di conoscenze e che permette un proficuo collegamento tra il mondo della scuola e quello dell’università. La frequenza del biennio SSIS si pone come obiettivo la formazione di docenti capaci di individuare opportunamente i problemi teorici e operativi in campo educativo e formativo e di applicarli tenuto conto delle caratteristiche cognitive dell’alunno. L’insegnante consapevole delle modalità con cui i diversi apporti delle scienze umane diventino condizioni per l’impostazione unitaria del progetto educativo, dovrebbe essere in grado di progettare interventi didattici per obiettivi, per ricerca didattica e problem solving, individuando le strategie più efficaci in relazione alla situazione di contorno in cui è chiamato ad operare. Allora chi è e come dovrebbe essere l’insegnante perfetto? Le competenze professionali derivano dall’insieme delle attitudini personali, dalla motivazione, dal bagaglio culturale e dell’esperienza, pertanto, se è vero che ognuno ha una propria personalità che influenza il modo di rapportarsi col mondo esterno, è anche vero che non ci si deve adagiare e che ogni insegnante deve impegnarsi a fondo per crescere dal punto di vista professionale. Il percorso della S.I.S. penso sia tarato con i vari corsi per chiarire a noi specializzandi per fornire gli spunti e le piste da seguire per ricercare una professionalità del docente. Ritengo che per essere un buon insegnante non sia sufficiente essere preparati nella propria disciplina, anche se questa è una condizione da cui non è possibile prescindere. Nell’insegnamento non esistono soluzioni standard adatte ad ogni situazione, ma l’insegnante competente è un professionista che, basandosi sul proprio bagaglio di conoscenze, sa trovare il modo migliore di gestire le situazioni più disparate. Concordo con quanto l’affermazione che “si è competenti quando si decidono le azioni mentre le si compiono, le si valuta e le si corregge seduta stante, si esplorano gli elementi impliciti nelle relazioni stesse per tenerne conto di quelle immediatamente successive, si ristrutturano significati e fini contemporaneamente all’impiego di determinati mezzi, si scopre, si genera e si condivide un senso che si adatta e segue ogni modificazione dei dati del sistema e delle dinamiche relazionali che le accompagnano” 20 . 20 Dispense del corso di Didattica generale, prof.ssa Pavone, S.I.S. Piemonte, A.A. 2004-2005 28 I problemi vanno affrontati tempestivamente prendendo in considerazione approcci alternativi, scegliendo opportunamente tra questi, elaborando e realizzando adeguati piani d’azione. Bisogna saper riconoscere i segnali d’allarme prima che la situazione degeneri e ciò consente di prendere tempo per adottare soluzioni risolutive o sospensive a seconda dei casi. Non si rischia di perdere il controllo perché non si ha bisogno di controllare nulla, la situazione viene gestita apparentemente senza sforzo perché è l’intero contesto che è stato organizzato funzionalmente agli obiettivi. Dovrebbero essere proposti modelli che riducano tutto l’impegno professionale nella trasmissione dei contenuti disciplinari o che assorbano tutto l’impegno del docente nella cura clinica degli aspetti psicologici e sociali della personalità è assurdo quanto pensare che sia possibile trasmettere alcunché senza la predisposizione del soggetto all’apprendimento o che sia possibile risolvere i problemi della persona senza la mediazione culturale. Il valore del modello è quello d’idea guida per la costruzione non del comportamento dell’insegnante, ma dello stile d’insegnamento come atteggiamento. La conoscenza d’alcuni modelli estremi può essere utile ai fini della formazione iniziale dell’insegnante per mostrare alcuni elementi primari di una funzione altrimenti non approcciabile che per intuizione ed immedesimazione. E’ solo la comprensione che viene dall’esperienza professionale che consente di utilizzare i modelli per una riflessione critica sullo sviluppo della propria professionalità. Per muoversi nella complessità della scuola, l’insegnante dovrebbe costruirsi dei punti di attenzione che gli permettano di sorvegliare l’intera situazione, un cruscotto denso di sofisticati sensori da monitorare durante la conduzione del proprio intervento didattico. Per l’insegnante, l’opera di predisposizione di strumenti e soprattutto d’attivazione degli indicatori è onore ed onere personale. Il momento della conoscenza e della decisione in educazione non possono essere delegati a nessun altro, fatte salve le ovvie e debite risorse d’apporti specialistici, che però devono sempre essere adatti al contesto ed alla situazione. In educazione non è sempre semplice o privo di conseguenze il recupero dell’errore e della distrazione. Per i comportamenti automatici, manca totalmente spazio nel concetto di insegnante, basato sulla consapevolezza e responsabilità più che sull’accensione di luci che stimolino per condizionamento risposte automatiche. Il nostro allievo deve poter essere messo in grado di sviluppare le capacità di analizzare e risolvere problemi di varia natura, deve interpretare il problema e costruirne la soluzione, inoltre deve essere in grado di inserirsi in un lavoro di gruppo. L’insegnante dovrà aiutare l’allievo per portarlo all’acquisizione della mentalità informatica coadiuvandolo nel potenziamento delle capacità richieste (astrazione, generalizzazione, associazione, dipendenze, correlazioni), modellazione coerentemente la realtà per descrivere le entità e le relazioni che costituiranno la base dati, applicazione degli algoritmi e delle strutture in maniera ottimale senza trascurare gli aspetti organizzativi e motivazionali. Ho potuto constatare che nell’insegnamento dell’informatica bisogna saper modulare gli approcci didattici utilizzandoli a seconda della circostanza, per creare la situazione ottimale nel processo di insegnamento-apprendimento che consenta all’allievo di ampliare la propria mappa concettuale, riorganizzando i concetti e facendo sorgere un vivo interesse e un atteggiamento positivo per lo studio delle discipline tecniche. L’insegnante non ha il compito di trasmettere conoscenze, ma deve possedere una serie di competenze che gli permettano di guidare i suoi allievi in un cammino di vita volto a formare la loro personalità. Oggi la scuola ha assunto una nuova centralità: se un tempo poteva essere considerata l’unica agenzia di socializzazione secondaria (la primaria è rappresentata dalla famiglia), oggi ci sono nuove agenzie (i mezzi di comunicazione di massa, il gruppo dei pari) con cui la scuola non può fare a meno di rapportarsi. Anzi proprio alla scuola spetta il compito di fornire ai ragazzi gli strumenti di criticità per rapportarsi con le nuove agenzie di socializzazione. Ed è proprio questo il contesto in cui si delinea la figura del docente moderno al quale si chiede di possedere competenze che vanno al di là della preparazione in ambito disciplinare. 29 Ma quali sono queste competenze? Senza volendo racchiuderle in un canovaccio deterministico e fuori da compartimenti stagni, un insegnante deve compendiare in sé almeno quattro livelli di competenze: disciplinari, relazionali, metodologiche-didattiche ed organizzative. Il tendere verso il modello del perfetto insegnante deve procedere senza disilludersi o provare frustrazione per i propri errori, anzi, l’abilità consiste proprio nel trasformare gli errori in occasione di crescita ricordando sempre che un buon motto per un insegnante può essere “mettiamoci in discussione e cresciamo insieme con i nostri allievi”. L’insegnante perfetto è un modello, rimane una chimera, anzi un’idea che anche la mano di un consumato demiurgo platoniano farebbe fatica a plasmare. 30 Bibliografia 1. Roletto E., Apprendimento delle Scienze e Didattiche disciplinari, IRiDiS, Torino, 2003 2. Blandino G., Granieri B., La disponibilità ad apprendere. Dimensioni emotive nella scuola e formazione degli insegnanti, Ed. Raffaello Cortina, Milano 1995 3. Blandino G., Granieri B., Le risorse emotive nella scuola, Ed. Raffaello Cortina, Milano 2002 4. Fischer L., Sociologia della scuola, Il Mulino, Bologna, 2003 5. Damiano E., L’azione didattica, Armando, Roma, 1993 6. Damiano E., Insegnare con i concetti. Un modello didattico fra scienza e insegnamento, Ed. SEI, Torino, 1994 7. Calvani A., Elementi di didattica, Carocci, Roma, 2000 8. Mariani A. M., Dispense del corso di Pedagogia Generale, S.I.S., Torino, A.A. 2004-2005 9. Pavone M., Dispense del corso di Didattica Generale, S.I.S., Torino, A.A. 2004-2005 10. Borca G., Dispense del corso di Psicologia dello Sviluppo, S.I.S., Torino, A.A. 2004-2005 11. Coggi C, Notti A. M., Docimologia, Pensa Multimedia, Lecce, 2002 12. Domenici G., Manuale della valutazione scolastica, Laterza, Bari, 2001 13. Meyer B, Object Oriented Software Construction, Prentice Hall, 1997. 14. Coad P., Jill N., OOP. Programmazione dei sistemi orientati agli oggetti, Jackson Libri, 1999 15. Cox B. J., Programmazione orientata agli oggetti, Addison Wesley Longman Italia, 2000 16. Wu C. T., Introduzione alla programmazione a oggetti in Java, McGraw-Hill Libri Italia, 2000 31 INTRODUZIONE AL LINGUAGGIO JAVA Introduzione al linguaggio Java 1 Introduzione al linguaggio Java 2 INDICE PARTE 1 Parte 1 Introduzione al sistema di programmazione Java Parte 2 Programmazione a oggetti Parte 3 Il linguaggio Java INTRODUZIONE AL SISTEMA DI PROGRAMMAZIONE JAVA Introduzione al linguaggio Java 3 Introduzione al linguaggio Java 4 CHE COS’È JAVA CARATTERISTICHE • È un linguaggio (e relativo ambiente di programmazione) definito dalla Sun Microsystems … • … per permettere lo sviluppo di applicazioni sicure, performanti e robuste su piattaforme multiple, in reti eterogenee e distribuite (Internet) Introduzione al linguaggio Java 5 Introduzione al linguaggio Java 6 Introduzione al linguaggio Java 1 1 IL LINGUAGGIO JAVA: CARATTERISTICHE • • • • • • • • • SEMPLICE E OO Semplice e orientato agli oggetti Interpretato Architetturalmente neutro e portabile Robusto Distribuito Sicuro Dinamico Ad elevate prestazioni Concorrente (multithread) • Sintassi simile a C e C++ (facile da imparare) • Elimina i costrutti più "pericolosi" di C e C++ – – – – – • Aggiunge garbage collection automatica • Conserva la tecnologia OO di base di C++ • Rivisita C++ in alcuni aspetti (C++--==) Introduzione al linguaggio Java 7 Introduzione al linguaggio Java 8 INTERPRETATO BYTECODE: ESEMPIO • Il compilatore produce un codice di tipo intermedio per una “Java Virtual Machine” (“bytecode”) ... • … che viene interpretato codice codice sorgente sorgente aritmetica dei puntatori (de)allocazione esplicita della memoria strutture (struct) definizione di tipi (typedef) preprocessore (#define) compilatore compilatore byte bytecode code void spin ( ) { int i; for (i = 0; i < 100; i++) { ; } 0 iconst_0 } 1 2 5 8 9 11 14 interprete interprete // push int constant 0 // store into local 1 (i=0) // first time, don’t increment // increment local i by 1 (i++) // push local 1 (i) // push int constant (100) // compare, loop if < (I<100) // return void when done istore_1 goto 8 iinc 1 1 iload_1 bipush 100 if_icmplt 5 return Introduzione al linguaggio Java 9 Introduzione al linguaggio Java 10 ARCHITETTURALMENTE NEUTRO ESEMPIO Sistema tradizionale eseguibile eseguibile macchina macchinaAA compilatore compilatore macchina macchinaAA • Il byte-code è indipendente dall’architettura hardware codice codice sorgente sorgente compilatore compilatore macchina macchinaBB (ANDF: Architecture Neutral Distribution Format) eseguibile eseguibile macchina macchinaBB ……. • Pertanto, un programma bytecode può essere eseguito su qualsiasi sistema su cui giri un ambiente run-time Java Sistema ANDF compilatore compilatore macchina macchinaAA codice codice sorgente sorgente compilatore compilatore macchina macchinaBB interprete interprete macchina macchinaAA byte bytecode code ……. ……. Introduzione al linguaggio Java 11 interprete interprete macchina macchinaBB Introduzione al linguaggio Java 12 Introduzione al linguaggio Java 2 2 ESEMPIO PORTABILE • Il formato dei dati è specificato esattamente, e non “di minima”, come nel C: – – – – – – – byte short int long float double char 8 bit complemento a 2 16 bit “ 32 bit “ 64 bit “ 32 bit IEEE 754 floating 64 bit “ 16 bit Unicode • Il sistema Java (compilatore + interprete + librerie run-time) è facilmente portabile su piattaforme diverse codice codice sorgente sorgente compilatore compilatore byte bytecode code interprete interprete libreria libreria S.O. – il compilatore Java è scritto in Java – l’ambiente run-time è scritto in ANSI C con interfacce standard (POSIX) verso il sistema operativo – nessuna “implementation dependency” Introduzione al linguaggio Java 13 Introduzione al linguaggio Java 14 ROBUSTO DISTRIBUITO • Controlli estensivi a compile-time e a run-time, per rilevare gli errori quanto prima possibile (es.: type checking) • Per questo, le caratteristiche insicure di C e C++ sono rimosse: • Pensato per essere eseguito in rete • L’ambiente run-time incorpora funzioni di rete (sia di basso livello: TCP/IP, che di alto livello: HTTP, …) • La rete è facilmente accessibile (come i file locali) – Nessuna gestione esplicita dei puntatori (no aritmetica dei puntatori, no malloc e free esplicite, …) – Gestione della memoria con garbage collection – Array e stringhe “veri” • Verifica del byte-code a load-time Introduzione al linguaggio Java 15 Introduzione al linguaggio Java 16 SICURO COMPILE-LOAD-RUN • L’ambiente di esecuzione si protegge da bytecode potenzialmente “ostile” Loader Loader delle delleclassi classi Sorgente Sorgente Java Java Verifica Verificadel del byte-code byte-code Interprete Interprete • Esempi: – il bytecode viene verificato prima dell’interpretazione (“theorem prover”), in modo da essere certi di alcune sue caratteristiche – gli indirizzamenti alla memoria nel bytecode sono risolti sotto il controllo dell’interprete Rete Compilatore Compilatore Ambiente Ambiente run-time run-time Byte-code Byte-code Java Java hardware hardware Introduzione al linguaggio Java 17 Introduzione al linguaggio Java 18 Introduzione al linguaggio Java 3 3 ELEVATE PRESTAZIONI COMPILAZIONE ON-THE-FLY • La verifica del bytecode permette di saltare molti controlli a run-time: l’interprete è pertanto efficiente Loader Loader delle delleclassi classi Sorgente Sorgente Java Java Verifica Verificadel del byte-code byte-code Interprete Interprete • Per maggiore efficienza, possibilità compilazione on-the-fly del bytecode in codice macchina Rete Generatore Generatore di dicodice codice Compilatore Compilatore Ambiente Ambiente run-time run-time Byte-code Byte-code Java Java hardware hardware Introduzione al linguaggio Java 19 Introduzione al linguaggio Java 20 DINAMICO CONCORRENTE • Il codice è eseguibile anche in assenza di alcuni moduli: • … le classi necessarie per la esecuzione di un programma Java possono essere caricate e collegate dinamicamente quando servono • Multithreading parte integrante del linguaggio: – Applicazioni interattive più facili a scriversi – Migliore "reattività" (anche se non real-time) Esempio: caricamento asincrono di immagini nei browser di rete riduce i tempi di attesa Esempio: nuove release di moduli caricabili automaticamente dalla rete quando servono Introduzione al linguaggio Java 21 Introduzione al linguaggio Java 22 RICCO La Standard Library Java contiene una ricca collezione di classi e di metodi preconfezionati: – – – – – Language support Utilities Input/output Networking Abstract Window Toolkit (AWT) JAVA E INTERNET Introduzione al linguaggio Java 23 Introduzione al linguaggio Java 24 Introduzione al linguaggio Java 4 4 WEB BROWSER E SERVER Server abc.com URL: Uniform Resource Locator Server xyz.com Client <protocollo> :// <nome del server> <nome del file> Hyperlink Browser program to xyz.com Esempio: http://www.dsi.unimi.it/DSI/corsi/programmi/F28005/index.html Disk HTTP used over this TCP connection Disk HTTP Server HTTP Server deve essere risolto in un indirizzo internet (IP) con l’aiuto di un Domain Name Server (DNS) Internet Introduzione al linguaggio Java 25 Introduzione al linguaggio Java 26 HTML: ESEMPIO APPLET JAVA <HTML> <HEAD> <TITLE> Esempio </TITLE> </HEAD> <BODY> <P> Testo <A HREF=“http://www.dsi.unimi.it”> DSI </A> </BODY> </HTML> • Sono programmi Java riferiti da link in pagine HTML • Vengono caricati e interpretati dal browser (se questo supporta Java) • Permettono di “animare” le pagine web Esempio Testo DSI Introduzione al linguaggio Java 27 Introduzione al linguaggio Java 28 HTML con APPLET: ESEMPIO JAVA BROWSER rete <HTML> <HEAD> <TITLE> Esempio </TITLE> Esempio </HEAD> Testo <BODY> Hallo! <P> Testo <APPLET CODE=“HelloWorld.class WIDTH=300 HEIGHT=80> Qui c’è un applet che ti saluta </APPLET> testo che esce se il browser </BODY> non supporta gli applet </HTML> Introduzione al linguaggio Java 29 TCP / IP http client interprete HTML ftp ftp client client java loader interprete JAVA I/O library local disk UI library Introduzione al linguaggio Java 30 Introduzione al linguaggio Java 5 5 UN NUOVO PARADIGMA: NETWORK COMPUTING PARTE 2 Approccio tradizionale DATI PROGRAMMI PROGRAMMAZIONE A OGGETTI RETE PC Network computing PROGRAMMI E DATI load and run RETE NC Introduzione al linguaggio Java 31 Introduzione al linguaggio Java 32 RIFLESSIONI SULLA PROGRAMMAZIONE PARADIGMI DI PROGRAMMAZIONE Programmare è un mestiere strano: costruire cose immateriali sempre piene di difetti, che costano un sacco di soldi e sono fatte di migliaia di frasi scritte da gente particolare per macchine molto stupide che richiedono precisione assoluta e che cambiano di continuo ... Introduzione al linguaggio Java 33 Introduzione al linguaggio Java 34 I DUE PARADIGMI DELLA PROGRAMMAZIONE ESEMPIO: UNA MACCHINA PER SPREMERE LE ARANCE Ci sono essenzialmente due modi diversi di descrivere il mondo: • come un sistema di processi (“modello procedurale”) • come un sistema di cose (“modello a oggetti”) Rube Goldberg, Inventions of Professor Lucifer Butts, 1932 Introduzione al linguaggio Java 35 Introduzione al linguaggio Java 36 Introduzione al linguaggio Java 6 6 IL MODELLO PROCEDURALE: ALCUNI TEMI TIPICI • • • • • • • • • • • • Processi, sequenze di esecuzione Concetto di “controllo” Trasformazioni, funzioni Flow-charts Tracciatori, program profilers Copertura topologica Complessità strutturale Il problema dei goto Linguaggi strutturati Programmazione top-down Astrazione procedurale …. LA MACCHINA DI VON NEUMANN “… nel progettare una sequenza codificata, quello che bisogna avere innanzitutto in mente non è l’apparenza originale della sequenza, ma piuttosto il suo funzionamento e il suo continuo cambiamento mentre il processo che essa controlla procede nel suo corso. … È dunque consigliabile incominciare la progettazione dalla fine, e cioè progettare per prima cosa il corso del processo e la relazione delle sue fasi successive con il codice che cambia, e quindi estrarre la sequenza codificata come operazione successiva.” Goldstine & Von Neumann, 1947 Introduzione al linguaggio Java 37 Introduzione al linguaggio Java 38 SPAGHETTI E STRUTTURA RIUSABILITÀ NEI LINGUAGGI PROCEDURALI Dalle librerie di “subroutines” alle librerie di procedure/funzioni Esempio: C int fun (int i, float r) { int j; …. } “ASTRAZIONE FUNZIONALE” Introduzione al linguaggio Java 39 Introduzione al linguaggio Java 40 IL MODELLO PROCEDURALE: LINGUAGGI UN BLOCCO INTELLETTUALE? Fortran Cobol Basic Pascal C 1956-1957 1960 1963-1964 1972 1972 “… Questi “linguaggi di Von-Neumann” creano dei blocchi stradali mentali enormi e non necessari nel pensare i programmi e nel creare le combinazioni di alto livello richieste da una metodologia di programmazione veramente potente. …” John Backus, 1978 Introduzione al linguaggio Java 41 Introduzione al linguaggio Java 42 Introduzione al linguaggio Java 7 7 IL MODELLO A OGGETTI: ALCUNI TEMI TIPICI IL MODELLO A OGGETTI: LINGUAGGI • • • • • Dall’astrazione funzionale alla “data abstraction” Costruire “cose”, non processi Società di entità attive, cooperanti, riusabili Dalla computazione alla comunicazione e alla delega Classificare il mondo: classi, sottoclassi, istanze (“esemplari”) • Bottom-up, non top-down Simula Smalltalk Eiffel C++ Java Introduzione al linguaggio Java 43 Introduzione al linguaggio Java 44 OGGETTI: CHE SONO MAI? • Versione informatica degli oggetti "reali" • Dotati di una loro propria "individualità" IL PARADIGMA A OGGETTI • Capaci di interagire per scambio di messaggi • Caratterizzati da proprietà – dati: ne descrivono lo “stato” – funzioni: ne descrivono il “comportamento” • Un msg modifica stato e attiva comportamenti Un oggetto è una coppia [stato,funzioni] Introduzione al linguaggio Java 45 Introduzione al linguaggio Java 46 ESEMPIO: UN’AUTOMOBILE CLASSI • una classe ha un nome, e contiene due tipi di membri: campi e metodi metodo metodo campi Funzioni - Avviati - Fermati - Accelera -… Dati: - Targa - Colore - Velocità - Livello benzina - ... metodo metodo “Tipo di dati astratti” (ADT) Introduzione al linguaggio Java 47 Introduzione al linguaggio Java 48 Introduzione al linguaggio Java 8 8 OGGETTI CLASSI: ESEMPIO (JAVA) • Un oggetto è una istanza (“esemplare”) di una classe, che viene creato (“instanziato”) dinamicamente valori MIV5678 variabili a BO8956 Automobile MIK1178 b c Due esemplari della stessa classe sono distinguibili soltanto per il loro stato (il valore dei loro campi), mentre il comportamento è sempre identico class Automobile { string targa; int velocità; color colore; … public void Avviati () { ….. } public void Fermati () { } } nome classe campi metodi Introduzione al linguaggio Java 49 Introduzione al linguaggio Java 50 OGGETTI: ESEMPIO (JAVA) INCAPSULAMENTO • Alcuni attributi (dati e metodi) sono pubblici (cioè visibili "all'esterno") • Altri attributi sono privati dell'oggetto, e quindi “nascosti” all’esterno (“information hiding”) class Automobile { …. } …. Automobile a, b, c; a = new Automobile(); b = new Automobile(); c = new Automobile(); …. a.Avviati(); …. dichiara, non crea crea • Le parti private sono modificabili senza effetti per gli interlocutori dell'oggetto • Propagazione delle modifiche assai contenuta • Stimolo al riutilizzo di oggetti ("black-box") Introduzione al linguaggio Java 51 Introduzione al linguaggio Java 52 ESEMPIO: AUTOMOBILE INCAPSULAMENTO: APPROCCI • Parti "visibili" (interfaccia pubblica): accesso a "ciò che l'auto può fare" – volante, combinazione volante-freno (ev. a mano) – blocchetto di accensione, oppure manovella – pedale dell'acceleratore, acceleratore automatico • Parti "nascoste" (implementazione): "come l'auto fa ciò che si può fare" – meccanica dello sterzo e dell'alimentazione – elettromeccanica dell'avviamento – sistema di alimentazione e accensione • Approccio "puro" lo stato è privato, e lo si può modificare solo attraverso quei metodi che sono stati dichiarati pubblici . Esempio: Fermati() • Approccio di Java anche le componenti dello stato possono essere dichiarate pubbliche e modificate dall'esterno Esempio: velocita=0 Introduzione al linguaggio Java 53 Introduzione al linguaggio Java 54 Introduzione al linguaggio Java 9 9 INTERAZIONI TRA OGGETTI ESEMPIO: UN'AUTOVETTURA • Gli oggetti possono comunicare e interagire mediante scambio di messaggi attraverso le loro interfacce pubbliche (stato o funzioni) • Il sistema antiskid durante una frenata invia periodicamente un messaggio alle ruote per "leggere" la loro velocità di rotazione • Per mezzo di un messaggio un oggetto può chiedere un'informazione a un altro oggetto, causarne un cambiamento di stato, oppure delegargli un'attività • Il galleggiante nel serbatoio del carburante invia messaggi all'indicatore di livello sul cruscotto per "scrivervi" un nuovo stato • Un messaggio in arrivo viene trattato dal metodo omonimo del ricettore, il quale "si attiva" per rispondere, per cambiare di stato, oppure per intraprendere un'attività • Il volante tornando alla posizione di riposo invia un messaggio al comando meccanico dell'indicatore di direzione per delegargli il compito di interrompere l'eventuale segnale lampeggiante (i.e. di "togliere la freccia") Introduzione al linguaggio Java 55 Introduzione al linguaggio Java 56 OGGETTI COMPOSTI UN SISTEMA A OGGETTI Un oggetto può essere costituito da altri oggetti chiamata di un metodo di b main d b automobile a c e ruota g carrozzeria motore f Introduzione al linguaggio Java 57 Introduzione al linguaggio Java 58 SISTEMI A OGGETTI ESEMPIO: ARTIFICIAL LIFE • Società di entità attive, cooperanti, riusabili • Bottom-up, non top-down • Visione locale, non globale • “Comportamento emergente” Introduzione al linguaggio Java 59 Introduzione al linguaggio Java 60 Introduzione al linguaggio Java 10 10 UNA DOMANDA IMPORTANTE I computer possono fare di più di quanto venga loro indicato? EREDITARIETÀ • È il meccanismo che consente di derivare una sottoclasse da una classe data • Una sottoclasse si ottiene per aggiunta, per occultamento o per ridefinizione di uno o più membri rispetto alla classe di partenza (che diventa una superclasse della nuova classe) Esempio: StartTassametro EndTassametro Licenza automobile taxi Introduzione al linguaggio Java 61 Introduzione al linguaggio Java 62 ESEMPIO ESEMPI • Implementazione di un'interfaccia grafica class Taxi extends Automobile { int licenza; public void StartTassametro() { … } public void EndTassametro () { … } } nuovo campo – classe "finestra": attributo privato "sfondo" e metodo "cambia-sfondo" – sottoclasse "finestra-nera": attributo privato "sfondo" ridefinito con il valore costante "nero", metodo "cambia-sfondo" occultato nuovi metodi • Libreria di algebra lineare: – classe "matrice": metodo "determinante" generico – sottoclasse "matrice-diagonale": metodo "determinante" che moltiplica tra di loro gli elementi sulla diagonale • Dichiarazione dei redditi – classe "contribuente": quadri del modello 740 base – classe "autonomi": aggiunta del membro "quadro-E" Introduzione al linguaggio Java 63 Introduzione al linguaggio Java 64 GERARCHIA DI CLASSI ESEMPIO obiect obiect Veicolo Veicolo Generalizzazione Specializzazione VeicoloSenza VeicoloSenza Motore Motore Veicolo Veicolo AAMotore Motore Motocicletta Motocicletta Automobile Automobile instanziazione Taxi Taxi Introduzione al linguaggio Java 65 Introduzione al linguaggio Java 66 Introduzione al linguaggio Java 11 11 AGGIUNGERE SOTTOCLASSI RIDEFINIZIONE DEI METODI obiect obiect Veicolo Veicolo VeicoloSenza VeicoloSenza Motore Motore Veicolo VeicoloAAMotore Motore Noleggia Veicolo Veicolo AAMotore Motore Motocicletta Motocicletta Motocicletta Motocicletta Automobile Automobile Automobile Automobile Aereo Aereo Noleggia Altro Altro Taxi Taxi utilizza la versione locale ereditano il metodo Introduzione al linguaggio Java 67 Introduzione al linguaggio Java 68 POLIMORFISMO VISIBILITÀ DEI NOMI nome “Ciò che vale per una classe, vale anche per le sue sottoclassi. Se una proprietà viene ridefinita, quando la uso viene selezionata la versione corretta” Esempio: Quando uso un metodo di un oggetto, non so: • a quali livelli è definito • quale tra i metodi omonimi nella gerarchia verrà usato gerarchia di classi Il msg inviato all’oggetto risale nella gerarchia fino a trovare una definizione b.nome oggetto b oggetto a Introduzione al linguaggio Java 69 Introduzione al linguaggio Java 70 PROGRAMMAZIONE A OGGETTI E TASSONOMIA ESEMPI ALTERNATIVI Nel paradigma a oggetti, l’attenzione del programmatore è spostata dalla creazione di processi di computazione alla creazione di tassonomie del sistema in esame Spider Osservazioni: • Per descrivere un sistema sono possibili tassonomie diverse, a seconda degli obbiettivi Automobile Automobile Benzina Berlina Segmento A Segmento B Diesel Segmento C • La tassonomia è un’arte difficile Introduzione al linguaggio Java 71 Introduzione al linguaggio Java 72 Introduzione al linguaggio Java 12 12 EREDITARIETÀ MULTIPLA RIUSO • Meccanismo che consente di derivare sottoclassi da due o più classi Classi specifiche sviluppo interno Mezzo Pubblico Automobile Classi specializzate dal fornitore di classi Taxi Classi generali • Il problema degli omonimi • Java non implementa ereditarietà multipla col linguaggio Linguaggio Introduzione al linguaggio Java 73 Introduzione al linguaggio Java 74 INDICE PARTE 3 • • • • • • • • • IL LINGUAGGIO JAVA Caratteristiche lessicali Tipi Strutture di controllo Classi Ereditarietà Interfacce Packages Struttura di un’applicazione Multithreading Introduzione al linguaggio Java 75 Introduzione al linguaggio Java 76 ALFABETO CARATTERISTICHE LESSICALI • I sorgenti Java utilizzano il codice standard internazionale a 16 bit Unicode, che comprende gli alfabeti più diffusi: arabo, greco, ebraico, cirillico, thai, katakana, hiragana, cinese, coreano, e molti altri (http://www.unicode.org) • I programmi Java possono essere scritti con altre codifiche (es. ASCII), ma devono essere convertiti in Unicode prima di essere compilati • Sequenze di escape: /udddd (d: 0-9, a-f, A-F) Introduzione al linguaggio Java 77 Introduzione al linguaggio Java 78 Introduzione al linguaggio Java 13 13 FORMATO COMMENTI • Il formato di un sorgente Java è libero: gli spazi (blank, tab, newline, form feed) non sono significativi, tranne che per separare i token fra loro, o nei letterali Tre diversi stili: • /* Commento tradizionale, eventualmente su più linee, non nidificato */ • // Commento su di una sola linea • /** Commento di documentazione". */ Solo immediatamente prima di una dichiarazione di classe, interfaccia, metodo o campo, e viene incluso nella documentazione generabile automaticamente a partire dal codice sorgente (es.: javadoc) Introduzione al linguaggio Java 79 Introduzione al linguaggio Java 80 ESEMPIO TAGS Tag @see /** Questo è un esempio di commento di documentazione per una classe “Automobile” * @see Ruota * @see Carrozzeria * @author Roberto * @version 1.0 */ @author @version @param @return @exception Introduzione al linguaggio Java 81 Descrizione Nome di classe collegata Nome autore Versione Nome e descrizione parametro Descrizione del valore di ritorno Nome e descrizione eccezione Si applica a Classe, metodo, campo Classe Classe Metodo Metodo Metodo Introduzione al linguaggio Java 82 IDENTIFICATORI PAROLE CHIAVE • Sono composti da “lettere Java” e “cifre Java”, e devono iniziare con una “lettera Java” • Possono essere di qualsiasi lunghezza • Attenzione: – sono lettere e cifre Unicode! – _ e $ sono considerate lettere – caratteri con codifica diversa (es. maiuscole e minuscole) sono considerati diversi (anche se hanno la stessa rappresentazione) Le seguenti keywords non possono essere usate come identificatori: abstract double int super boolean else interface switch break extends long synchronized byte final native this case finally new throw catch float package throws char for private transient class (goto) protected try (const) if public void continue implements return volatile default import short while do instanceof static Note: - const e goto sono riservate, ma non usate - anche i letterali null, true, false sono riservati Introduzione al linguaggio Java 83 Introduzione al linguaggio Java 84 Introduzione al linguaggio Java 14 14 KEYWORDS JAVA E C Java C struct union enum signed unsigned extern auto register sizeof typedef byte boolean final char int short long float double void if else for while do switch case default break continue return goto°° volatile static const°° try catch finally throw throws private public protected transient synchronized native abstract TIPI import class extends instanceof implements interface package this super new true° false° null° ° letterali, non keywords °° riservate ma non usate in Java Introduzione al linguaggio Java 85 Introduzione al linguaggio Java 86 TIPI: SINTESI TIPI boolean: Primitivi numerici interi floating-point Reference TIPI (segue) KEYWORD NOTE boolean true, false byte short int long char 8 bit interi in compl. a 2 16 bit 32 bit 64 bit 16 bit Unicode float double 32 bit IEEE 754 64 bit classi class interfacce interface • Linguaggio fortemente tipato: il tipo di una espressione è sempre noto a compile-time • Linguaggio a oggetti non puro: non tutti i tipi sono classi • Rispetto al C, non esistono: signed, unsigned, long double, enum, puntatori, struct, union, typedef array Null Introduzione al linguaggio Java 87 Introduzione al linguaggio Java 88 TIPI PRIMITIVI: ESEMPI CLASSI • Dichiarazioni: int i, float f; • Inizializzazioni: double d = 3.14; • Espressioni: i+5 j = i++ Essenzialmente, gli stessi operatori del C Nota: byte e short vengono sempre promossi a int prima di essere valutati • Assegnamenti: i = j + 5; dichiarazione di classe: class Automobile { <campi> <metodi> } dichiarazione di oggetto: Automobile a; a creazione di oggetto: a I campi vengono inizializzati a = new Automobile(); uso dell’oggetto: … a.campo … … a.metodo(…) ... Introduzione al linguaggio Java 89 nul heap Introduzione al linguaggio Java 90 Introduzione al linguaggio Java 15 15 CLASSI: ESEMPIO class Safe { public int private boolean private int CLASSI “WRAPPER” 123 doorNumber = 123; locked = true; combination = 456; public boolean isLocked() { return (locked) } Safe aSafe; public void unLock (int thisCombination) { aSafe = new Safe(); if (thisCombination == combination) unLock(); } Safe anotherSafe; private void unLock() { anotherSafe = new Safe(1927) locked = false; ... } aSafe.doorNumber=456; private void setCombination(int setting) { aSafe.unLock(1997); combination = setting; } Safe() { } /* costruttore */ Safe (int door) { /* altro costruttore (overloading) */ doorNumber = door; setCombination(doorNumber); } • Tutti i tipi primitivi tranne byte e short hanno una classe corrispondente nel package java.lang: Boolean, Integer, Long, Character, Float, Double, (“wrapper class”) • Tale classe definisce metodi e costanti utili per quel tipo, ad esempio: Classe: Character Costanti (static): MIN_VALUE, MAX_VALUE, … Metodi (static): isDefined, isLowerCase, IsUpperCase, isTitleCase, isDigit, isLetter, isLetterOrDigit, isSpace, isJavaLetter,isJavaLetterOrDigit, toLowerCase, toUpperCase, toTitleCase, digit, forDigit } Introduzione al linguaggio Java 91 Introduzione al linguaggio Java 92 INTERFACCE ESEMPIO • In sostanza, sono liste di metodi di cui non è definita l’implementazione, ma solo l’interfaccia • La loro implementazione deve essere realizzata da una classe public interface AudioClip { void play (); /* avvia i'esecuzione */ void loop (); /* esegui ciclicamente una audio clip */ void stop (); /* interrompi l'esecuzione */ } class MyAudio implements AudioClip { void play () { <codice che implementa play> } void loop () { <codice che implementa loop> } void stop () { <codice che implementa stop> } } class YourAudio implements AudioClip { <codice> } I metodi possono essere public o abstract, gli attributi public, static o final Introduzione al linguaggio Java 93 Introduzione al linguaggio Java 94 ARRAY ARRAY (segue) • In Java gli array sono oggetti • I componenti di un array: – sono tutti dello stesso tipo – possono essere di tipo primitivo o reference (inclusi altri array) – sono indicizzati con int (indice primo elemento: 0), con controllo di validità degli indici a run-time • Esempio: int[ ] a; /* dichiarazione */ /* anche int a[ ]; */ a = new int[3]; /* creazione */ a a null int[ ] a = new int[3]; heap a a heap a[0] = 0; /* uso */ • La lunghezza di un array è fissata al momento della sua creazione, e non può essere cambiata… • ... ma si può assegnare un nuovo array di diversa lunghezza all’array reference: a = new int[5]; heap Introduzione al linguaggio Java 95 Introduzione al linguaggio Java 96 Introduzione al linguaggio Java 16 16 ARRAY DI ARRAY short [ ] [ ] a; short a[ ] [ ]; ARRAY DI OGGETTI /* array di array di short */ /* equivalente */ a a[2][0] a = new short [3][2]; class Automobile { public int targa; public int velocità; …. } …. Automobile[ ] a=new Automobile[3]; a heap heap a a = new short [3][ ]; null null a[2].targa null heap Introduzione al linguaggio Java 97 Introduzione al linguaggio Java 98 STRUTTURE DI CONTROLLO: SINTESI Sequenza Selezione STRUTTURE DI CONTROLLO if switch Iterazione for while do-while Salto Gestione eccezioni break uscita da un blocco continue return continua un loop da un metodo Non c’è goto! try-catchfinally-throw Introduzione al linguaggio Java 99 Introduzione al linguaggio Java 100 SINTASSI USCITE boolean, non integer! if ( condition ) statement; [else statement; ] switch ( intexpr ) { case intexpr : statement; [case intexpr : statement; ... default : statement; ] } • break [label]; • continue [label]; • return expr; • label: statement while ( condition ) statement; for ( init; condition; increment ) statement; do statement; while ( condition ); Introduzione al linguaggio Java 101 Introduzione al linguaggio Java 102 Introduzione al linguaggio Java 17 17 ESEMPIO GESTIONE ECCEZIONI label: for (i =0 , j=0 ; i<10 && j<20; i++ , j++) { for (z=0 ; z<100 ; z++) { switch (expr) { case tag: statements; break; /* esce da switch */ ..... default: statements; break label; /* esce da label */ } if (z==15) continue; /* prosegue il for z */ if (z==i+j) continue label; /* prosegue da label */ } } • È una struttura di controllo che permette la gestione di condizioni di errore senza complicare la struttura del codice (codici di ritorno, flag, …) • Quando si rileva una condizione anomale (eccezione), essa viene segnalata (throw), e il controllo viene automaticamente trasferito al gestore della eccezione, che la tratta Introduzione al linguaggio Java 103 Introduzione al linguaggio Java 104 STRUTTURA try-catch-finally LA SEGNALAZIONE DELLE ECCEZIONI qui dentro viene segnalata la eccezione, con throw e try blocco-0 catch (exception_type1 id) blocco-1 catch (exception_type2 id) block-2 … finally blocco-n Le eccezioni possono venire segnalate: blocco-0 exception_type1 • dal sistema run-time, es.: exception_type2 blocco-1 ArithmeticException IndexOutOfBoundsException SecurityException NullPointerException ... blocco-2 • dal programma: blocco-n throw e; Introduzione al linguaggio Java 105 Introduzione al linguaggio Java 106 CHE COSA SONO LE ECCEZIONI LA DICHIARAZIONE throws • Le eccezioni sono oggetti, di una sottoclasse della classe Throwable: Object Throwable Exception Error type method(args) throws MyException { …. throw new MyException(…) …. } •Permette al compilatore di controllare quali eccezioni vengono segnalate • fornisce documentazione all’utente del metodo unchecked exceptions Runtime Exception unchecked exceptions checked exceptions, definite dall’utente Introduzione al linguaggio Java 107 Introduzione al linguaggio Java 108 Introduzione al linguaggio Java 18 18 DICHIARAZIONE DI CLASSI [Doc comment] [Modifiers] class ClassName [ extends SuperClassName] [ implements InterfaceName [, InterfaceName] ...] {ClassBody} CLASSI Doc comment Modifiers extends implements ClassBody commento di documentazione abstract, final, public, ... la classe è sottoclasse di un'altra la classe realizza una o più interfacce i campi e i metodi della classe Introduzione al linguaggio Java 109 Introduzione al linguaggio Java 110 ESEMPIO DICHIARAZIONE DI CAMPI Dichiarazione di una classe MyClass public class MyClass { int i; public void Add_to_i (int j) { i = i+j; } public MyClass () { i = 10; } } [DocComment] [Modifiers] Type VariableDeclarator [,VariableDeclarator]… ; /* campo */ /* metodo */ /* metodo costruttore: ha lo stesso nome della classe */ Creazione e uso di una istanza di MyClass MyClass mc; mc = new MyClass(); mc.i++; mc.Add_to_i(10); /* dichiarazione, non creazione */ /* creazione: l'attributo i vale 10 */ /* ora i vale 11 */ /* e ora i vale 21 */ Esempio: static int i = 5, j = 7, a[]; Doc comment Modifiers commento di documentazione static, public, protected,private, final, ... tipo (primitivo o reference) identificatore (anche di array), con eventuale inizializzazione Type VariableDeclarator Introduzione al linguaggio Java 111 Introduzione al linguaggio Java 112 DICHIARAZIONE DI METODI ESEMPIO [Doc comment] [Modifiers] ReturnType MethodName (ParameterList) [throws ClassType [,ClassType] … ] { MethodBody int base; } Doc comment Modifiers commento di documentazione static, public,protected,private, abstract, final,native, ... ReturnType può essere un tipo primitivo o reference, o void (nessun valore di ritorno). Deve essere sempre specificato (ma non per i costruttori) ParameterList campo della classe public int power (int n) { int i, p; p=1; for (i=1; i<=n; ++i) p=p*base; return p; } variabili locali valore della funzione un metodo ha sempre un numero fisso di argomenti (ma è possibile l’ overloading) Introduzione al linguaggio Java 113 Introduzione al linguaggio Java 114 Introduzione al linguaggio Java 19 19 IL MODIFICATORE static ESEMPIO class Safe { static int LastSerialNumber; Il costruttore Safe fa sì che public int SerialNumber; ogni istanza di Safe abbia un int SetCombination; SerialNumber unico …. Safe(int Combination) { SerialNumber = LastSerialNumber++; SetCombination = Combination; } public static StartNewSeriesFrom (int Start) { LastSerialNumber = Start; } } …. Safe.LastSerialNumber(100000); /* inizializza il numero di serie */ Safe MySafe = new Safe(23456); /* crea una Safe di SerialNumber = 100001 e combinazione 23456 */ … MySafe.SerialNumber …. • Campi e metodi dichiarati static, sono associati alla classe e non a una particolare istanza class MyClass { static int a; … static void MyMethod() { a = a+1; } } • Pertanto: esiste una sola copia di un campo statico, condiviso da tutte le istanze della classe; non occorre istanziare un oggetto per usare un membro statico; metodi statici possono accedere solo a membri statici della classe • Sono qualificati con il nome della classe, e non della istanza MyClass.a =MyClass.a + 1; Introduzione al linguaggio Java 115 Introduzione al linguaggio Java 116 VARIABILI LOCALI LA KEYWORD this • Se una variabile locale ha lo stesso nome di un membro della sua classe, questo risulta invisibile (“shadowing”) … • … a meno di usare la keyword this, che denota l’oggetto corrente • Le variabili locali a un metodo: – sono visibili solo dal corpo del metodo – vengono allocate (nello stack di run-time) alla chiamata e deallocate all’uscita del metodo – non vengono inizializzate automaticamente (diversamente dai campi di una classe) Esempio: • Non si può accedere a una variabile a cui non si sia prima assegnato un valore (e viene segnalato in compilazione !) Esempio: class MyClass { int x, y, z; void MyMethod (int x) { int y; y=x+1; z=this.x; … int i; if ( cond ) { i = 55; … } i++; /* compile-time error */ /* membri */ /* parametro */ /* variabile locale */ /* y è la variabile locale, x è il parametro */ /* this.x è il membro x */ } NB: Poichè this denota un oggetto, non si può usare con membri dichiarati static Introduzione al linguaggio Java 117 Introduzione al linguaggio Java 118 PASSAGGIO DI PARAMETRI A UN METODO COSTRUTTORI • Sono metodi che vengono chiamati quando si crea una istanza di una classe; non ritornano alcun valore • Se non definisco alcun costruttore, per default viene fornito il costruttore vuoto: • Tutti i tipi primitivi sono passati per valore • Anche i riferimenti a oggetti di tipo reference sono passati per valore Es: i int i; SomeObject obj = new SomeObject(); obj MyMethod( i, obj ); …. o j Void MyMethod (int j, SomeObject o) { j = j+1; /* non altera i, passato per valore */ o = null; /* non altera obj, che si riferisce ancora all’oggetto */ } class MyClass { … MyClass() { } } heap • Possono essere overloaded; non ha senso che siano static Introduzione al linguaggio Java 119 Introduzione al linguaggio Java 120 Introduzione al linguaggio Java 20 20 ESEMPIO: OVERLOADING Dichiarazione di una classe MyNewClass public class MyNewClass { int i; public MyNewClass () { i = 10; } public MyNewClass (int j) { i = j; } Overloading: metodi omonimi devono essere distinguibili per la quantità e/o per il tipo degli argomenti ..... • Java non supporta distruttori di oggetti: gli oggetti non possono essere distrutti esplicitamente • Un oggetto privo di riferimenti incidenti non è più accessibile, e la memoria che esso occupa può essere "riciclata" dal garbage collector, che opera in un thread indipendente a bassa priorità String s; s = new String ("abc"); s = "def"; } Creazione di una istanza di MyNewClass MyNewClass mc0, mc1; mc0 = new MyNewClass(); mc0.i++; mc1= new MyNewClass(20); mc1.i++; DISTRUZIONE DI OGGETTI /* dichiarazione, non creazione */ /* creazione: s punta a "abc" */ /* "abc" non è più puntata da s */ /* dichiarazione, non creazione */ /* creazione: l'attributo i vale 10 */ /* ora i vale 11 */ /* creazione: l'attributo i vale 20 */ /* ora i vale 21 */ Introduzione al linguaggio Java 121 Introduzione al linguaggio Java 122 FINALIZZATORI DI OGGETTI IL MODIFICATORE native • Un oggetto "riciclabile" (cioè privo di puntatori incidenti) potrebbe trovarsi in uno stato poco "pulito" (ad es. potrebbe aver aperto dei file che non sono stati ancora chiusi) • Prima di riciclarlo, il garbage collector invoca il metodo finalize dell’oggetto, es.: • Un metodo è dichiarato native quando il suo codice è dipendente dalla piattaforma (ad esempio, è scritto in un altro linguaggio) Esempio: public native void seek(long pos) throws IOException ; protected void finalize () throws Throwable { ... super.finalize(); /* meglio metterlo sempre */ } non deve essere specificato il body • Il metodo finalize esiste sempre: se non è stato definito, viene ereditato da Object; Introduzione al linguaggio Java 123 Introduzione al linguaggio Java 124 SOTTOCLASSI EREDITARIETA’ • In Java, una classe può estendere una sola altra classe (ereditarietà singola) • Una sottoclasse eredita i campi e i metodi della sua superclasse che non siano dichiarati private e che non siano costruttori, e li può usare come se fossero dichiarati al suo interno • Un oggetto di una sottoclasse può essere usato ovunque può essere usato un oggetto della sua superclasse Introduzione al linguaggio Java 125 Introduzione al linguaggio Java 126 Introduzione al linguaggio Java 21 21 “COME” ESTENDERE UNA CLASSE ESEMPIO class Animale { Gatto Fufi = new Gatto(); float Peso; Animale creatura = Fufi; … void Mangia () { … } … lecito, perchè “gatto” } è una sottoclasse class Mammifero extends Animale { di “animale” int BattitoCardiaco; // eredita Peso … void Respira() { … } // eredita mangia … } class Gatto extends Mammifero { // eredita BattitoCardiaco, Peso, Mangia, Respira void FaLeFusa() { … } } • Attenzione alla differenza fra la relazione “è un” e la relazione “ha un” : solo la prima può definire una sottoclasse Esempio: Un cerchio può essere definito mediante il suo centro e il suo raggio, ma sarebbe scorretto definire una classe cerchio come sottoclasse di punto: class punto { class cerchio extends punto { double x; int y; double raggio; … ... } } Introduzione al linguaggio Java 127 Introduzione al linguaggio Java 128 SHADOWING E OVERRIDING POLIMORFISMO • shadowing un campo di una sottoclasse può “nascondere” un campo omonimo di una sua superclasse • overriding un metodo di una sottoclasse può “sovrascrivere” un metodo di ugual “segnatura” e ugual ReturnType di una sua superclasse Esempio: class SuperClass { nasconde int i; sovrascrive void m(int k) {…} … } class Subclass extends Superclass { long i: void m(int n) {…} … } Gatto Fufi = new Gatto(); Animale creatura =Fufi; creatura.Mangia(); Introduzione al linguaggio Java 129 Introduzione al linguaggio Java 130 LA KEYWORD super CASTING • per denotare un membro nascosto (campo shadowed o metodo overridden non static), si può usare la keyword super Esempio: class Animale { … void Mangia () { … } … } class Mammifero extends Animale { … } class Gatto extends Mammifero { … void Mangia() { … } ... } class SuperClass { int i; … } class Subclass extends SuperClass { long i: … i = super.i +1; … } viene eseguito il metodo Mangia della classe Gatto! (binding dinamico: il metodo da chiamare viene selezionato a run-time) Gatto Fufi = new Gatto(); Animale creatura; ... creatura = Fufi; /* ok */ Fufi = creatura; /* errore di compilazione: tipi incompatibili */ Fufi = (Gatto)creatura; /* ok, ma solo perchè creatura è un gatto: se non lo fosse, il controllo a run-time segnalrebbe una eccezione */ Introduzione al linguaggio Java 131 Introduzione al linguaggio Java 132 Introduzione al linguaggio Java 22 22 COSTRUTTORI NELLE SOTTOCLASSI IL MODIFICATORE abstract Nel costruttore di una sottoclasse, è corretto, come prima cosa, chiamare il costruttore della superclasse • Una classe è dichiarata abstract quando contiene almeno un metodo abstract (cioè senza body) • Una classe abstract non può essere instanziata: occorre sovrascrivere tutti i metodi abstract in una sottoclasse, e istanziare la sottoclasse Esempio: class SubClass extends SuperClass { SubClass() { super(); <altre operazioni> } } Esempio: abstract class a { … abstract int m(int k); } class b extends a { ... int m(int n) { … } } sovrascrive, fornendo la implementazione del metodo Introduzione al linguaggio Java 133 Introduzione al linguaggio Java 134 IL MODIFICATORE final METODI final: ESEMPIO final ha tre significati diversi: • campo final • metodo final • classe final non può essere modificato: è un campo costante (deve essere inizializzato) Esempio: final int i = 5; non può essere sovrascritto non può avere sottoclassi (quindi i suoi metodi sono implicitamente final) class Password { private int passwd; final boolean validatePassword(String s) { ….. se non fosse final , } potrebbe essere sovrascritto ! ... } Introduzione al linguaggio Java 135 Introduzione al linguaggio Java 136 INTERFACCE INTERFACCE Una interface è una struttura sintattica dotata di nome, che racchiude la specifica della segnatura e del ReturnType dei metodi di una classe non ancora implementata Esempio: interface Driveable { boolean startEngine(); void stopEngine(); float accelerate(float acc); boolean turn(Direction dir); } Introduzione al linguaggio Java 137 Introduzione al linguaggio Java 138 Introduzione al linguaggio Java 23 23 IMPLEMENTAZIONE DI UNA INTERFACCIA Una interfaccia può essere implementata da una (o più) classi: POLIMORFISMO Esempio: Driveable vehicle; interface Driveable { boolean startEngine(); ... } interface Automobile implements Driveable { boolean startEngine() { ... } // una particolare implementazione …. } interface Motorcycle implements Driveable { boolean startEngine() { ... } // un’altra implementazione …. } /* variabile di tipo interfaccia; le possiamo assegnare qualunque oggetto di una classe che implementa l’interfaccia */ Automobile auto = new Automobile(); Motorcycle moto = new Motorcycle(); ... vehicle = auto; vehicle.startEngine(); /* polimorfismo: è il metodo di Automobile */ … vehicle = moto; vehicle.startEngine(); /* polimorfismo: è il metodo di Motorcycle */ Introduzione al linguaggio Java 139 Introduzione al linguaggio Java 140 EREDITARIETA’ MULTIPLA SUPERINTERFACCE Una classe può implementare più di una interfaccia interface Driveable { void startEngine(); void stopEngine(); float accelerate(float acc); boolean turn(Direction dir); } • Una interfaccia può estendere una o più altre interfacce, es.: interface Rentable { void startRental(); void endRental(); int book(Date start, Date end); } interface a extends b, c, d { …. } class AvisCar implements Driveable, Rentable { void startEngine() { … } void startRental() { … } … } • Ogni classe che implementa un’interfaccia deve estendere anche tutte le sue superinterfacce Introduzione al linguaggio Java 141 Introduzione al linguaggio Java 142 INTERFACCE vs CLASSI abstract • Le interfacce sono simili a classi che abbiano soltanto: – metodi abstract – campi static e final (cioè costanti) • A differenza delle classi, le interfacce permettono di realizzare una forma di ereditarietà multipla Introduzione al linguaggio Java 143 PACKAGES Introduzione al linguaggio Java 144 Introduzione al linguaggio Java 24 24 PACKAGES NOMI DI CLASSI • Più classi o interfacce interrelate possono essere riunite in un package, dotato di nome Esempio: classe o interfaccia MyPackage • Il nome di una classe (o di una interfaccia) va sempre qualificato con il nome del package a cui appartiene, tranne quando viene usato all’interno dello stesso package Esempio: c b a aaa.bbb.ccc.MyClass d e all’interno di aaa.bbb.ccc basta questo Introduzione al linguaggio Java 145 Introduzione al linguaggio Java 146 NOMI DI PACKAGE PACKAGES STANDARD • Il nome di un package può essere composto da più identificatori separati da “.”: roberto.utilities.internet java.lang classi base del linguaggio (Object, Thread, Throwable, System, String, Math, wrapper classes, …) java.io classi di I/O (FileInputStream, FileOutputStream, ) • Per evitare che package di produttori diversi abbiano lo stesso nome, si suggerisce di far iniziare il nome del package con il dominio Internet del produttore (invertito, e con il nome di più alto livello tutto maiuscolo): IT.unimi.dsi.roberto.utilities.internet java.util classi di utilità (Date, Random, …) java.applet classi di supporto alle applicazioni di rete (socket, URL, …) classe Applet, … java.awt Abstract Windowing Toolkit java.net nome di dominio Introduzione al linguaggio Java 147 Introduzione al linguaggio Java 148 LO STATEMENT package LO STATEMENT import • Specifica che le classi che seguono appartengono a un certo package • Deve apparire (una sola volta) all’inizio di una unità di compilazione Esempio: a.java package p; class a {.. class b {... class c {.. le classi a,b,c appartengono al package p Se lo statement è omesso, la classe appartiene al package anonimo • Per evitare di usare sempre nomi completi di classi, si può usare lo statement import Esempio: class MyClass { java.util.Date today; … } import java.util.Date; class MyClass { Date today; ... } Note: • import java.util.* importa tutte le classi del package java.util • java.lang.* è sempre importato implicitamente Introduzione al linguaggio Java 149 Introduzione al linguaggio Java 150 Introduzione al linguaggio Java 25 25 PACKAGE E DIRECTORY CLASS PATH • Per indicare al class loader da quale directory partire per la mappatura può essere usata la variabile di ambiente CLASSPATH • Molti ambienti Java mappano i nomi dei package sui pathname del file system (compilatore e class loader) Esempio (Unix): setenv CLASSPATH /classi : /usr/roberto/classi : . Esempio: aaa.bbb.ccc.MyClass package aaa/bbb/ccc/MyClass classe directories java.lang.Math file nome completo della classe pathname /java.lang.Math.class pathname assoluto Introduzione al linguaggio Java 152 VISIBILITA’ VISIBILITA’ DI CAMPI E METODI Classi e interfacce • sono visibili all’interno del package in cui sono dichiarate; sono visibili all’esterno del package solo se dichiarate public public class a { … public interface b { … Membri (campi e metodi) • sono visibili quando: più visibile Introduzione al linguaggio Java 151 Modificatore private nessuno (default) protected public Visibilità solo nella classe in cui è definito solo nelle classi del package classi nel package e sottoclassi (stesso package o altri package) tutte le classi NB: I membri di una interfaccia sono sempre pubblici – la loro classe è visibile e – il loro modificatore li rende visibili Introduzione al linguaggio Java 153 Introduzione al linguaggio Java 154 ESEMPIO PROGETTARE LA VISIBILITA’ package pac class a {... class b { private int i; private void m( ) {…} int j; visibile void n( ) {…} public int k; public p( ){…} protected int i; protected void m( ){…} class classddextends extendsbb{... {... class e extends d {... class c {... Quando progettiamo una classe dobbiamo pensare a due tipi di utenti: • quelli che utilizzeranno la classe per realizzare delle applicazioni • quelli che estenderanno la classe per realizzare sottoclassi • I primi useranno i membri public; i secondi anche i membri protected • Le interfacce public e protected vanno progettate con cura Introduzione al linguaggio Java 155 Introduzione al linguaggio Java 156 Introduzione al linguaggio Java 26 26 DUE TIPI DI UTENTI PACKAGES: RIASSUNTO class a { private int i; private void m( ) {…} int j; void n( ) {…} public int k; public p( ){…} protected int i; protected void m( ){…} ESTENDE USA package pac interfaccia I packages: • permettono di creare gruppi di classi e interfacce fra loro in relazione • definiscono uno spazio di nomi locale per classi e interfacce evitando conflitti con classi e interfacce di altri packages • permettono di avere classi, interfacce e membri (campi e metodi) non visibili all’esterno del package • possono essere organizzati gerarchicamente interfaccia Introduzione al linguaggio Java 157 Introduzione al linguaggio Java 158 UNITA’ DI COMPILAZIONE: RIASSUNTO MyClass.java package Roberto.util; import java.util.* ; public class MyClass { … } class MyOtherClass { … } interface MyInterface { … } /* opzionale */ /* opzionale */ STRUTTURA DI UN’APPLICAZIONE /* opzionale */ /* opzionale */ Introduzione al linguaggio Java 159 Introduzione al linguaggio Java 160 STRUTTURA DI UN’APPLICAZIONE HELLO WORLD Hello.java • Affinchè un sistema a oggetti “parta”, devo avere una classe con un metodo statico e pubblico di nome main main d b class Hello { public static void main (String args []) { System.out.println("Hello World!"); } } a c e g f obbligatorio in questa forma Introduzione al linguaggio Java 161 Introduzione al linguaggio Java 162 Introduzione al linguaggio Java 27 27 SPIEGAZIONI UNITA’ DI COMPILAZIONE public static void main (String args []) – void indica che main non ritorna nulla, il che è necessario per superare il type-checking del compilatore – args[] sono gli argomenti passati a main dalla shell quando si digita: java Hello arg1 arg2 ... argn – String dice che gli argomenti sono di classe String – public rende il metodo main visibile alle altre classi - e al comando java (interprete) – static associa main alla classe Hello, e non alle sue istanze • Il sorgente di un’applicazione consiste di uno o più file (“unità di compilazione”) • Ogni file contiene una o più dichiarazioni di classi (o di interfacce), di cui al più una dichiarata public • Il nome del file deve essere uguale a quello della sua classe public , con estensione .java: file a.java stesso nome public class a {... class b {... System.out.println("HelloWorld!") – invoca il metodo println dell’oggetto out della classe System, che stampa la stringa sul file stdout class c {.. Introduzione al linguaggio Java 163 Introduzione al linguaggio Java 164 COMPILAZIONE ED ESECUZIONE COMPILAZIONE ED ESECUZIONE a.java a.class public class a {… public main (..) {…. java a args javac a.java <bytecode> b.class class b {… …uso di c... <bytecode> La classe a deve contenere un metodo pubblico e statico di nome main Verificare Verificare le le caratteristiche caratteristiche del del sistema sistema di di programmazione programmazione utilizzato utilizzato c.class <bytecode> il compilatore crea file di nome classname.class classe c, usata da b, compilata in precedenza Introduzione al linguaggio Java 165 Introduzione al linguaggio Java 166 Introduzione al linguaggio Java 28 28 La programmazione orientata agli oggetti in Java Cosa identifica la OOP? Oggetti e classi : identità, stato, classe, creazione, metodi che osservano e che modificano, notazione punto Information hiding : ruolo e modalità di occultamento Ereditarietà : cosa si eredita ? ereditarietà semplice e multipla Polimorfismo : quale? perché è così importante? classi astratte, definizione e ridefinizione di metodi Genericità : classi generiche, downcasting, genericità vincolata Aspetti avanzati : copia e uguaglianza, asserzioni, eccezioni, contenitori e iteratori, distruttori, persistenza 1. Cosa identifica la OOP ? L'acronimo OOP in informatica sta per Object Oriented Programming (Programmazione Orientata agli Oggetti) e vuole denotare l'insieme delle caratteristiche a fondamento del paradigma della programmazione ad oggetti. Storicamente, le prime idee fondanti di questo paradigma sono sorte con il Simula '67, un linguaggio di simulazione discreta di scuola scandinava, e sono state poi riscoperte negli USA negli anni '70-'80 con il linguaggio Smalltalk. Buona parte del gergo della OOP si deve a questi due linguaggi. Dalla metà degli anni '80 esiste un generale accordo sulle caratteristiche che devono essere presenti in un linguaggio per poterlo classificare come OOPL, cioè per affermare che mette a disposizione il paradigma della OOP: 1. insieme di operazioni astratte, associate ad un tipo 2. stato locale 3. ereditarietà La prima caratteristica, spesso associata all'acronimo ADT (Abstract Data Type), stabilisce che l'unico modo per agire sugli oggetti di un certo tipo è quello di invocare delle operazioni (nel gergo OOP chiamate metodi) prestabilite e note agli utenti in modo astratto, cioè indipendente dalla rappresentazione prescelta per la loro concreta implementazione (realizzazione). La seconda caratteristica stabilisce che ogni oggetto ha un proprio stato locale che può cambiare per effetto dell'esecuzione di alcuni metodi. In pratica il valore dello stato locale ad un certo istante è stabilito dal contenuto di un insieme di celle di memoria associate all'oggetto, dette campi o attributi dell'oggetto. L'ereditarietà stabilisce infine che il linguaggio deve prevedere un meccanismo per stabilire delle relazioni IS-A ("è-un") tra classi di oggetti. Questo meccanismo consente in definitiva il riuso e il polimorfismo, due dei principali fattori alla base del successo della OOP. 1 2. Oggetti e classi Un oggetto (software) è un'entità dotata di: • identità, che permette sempre di distinguere un oggetto da un altro (un "numero di serie") • stato, quindi in grado di "ricordare" qualcosa • comportamento, che si traduce nella possibilità di osservare (in tutto o in parte) lo stato e/o di modificare lo stato, tramite l'invocazione dei metodi sull'oggetto. Le metafore più pertinenti per gli oggetti della programmazione sono probabilmente le apparecchiature di tipo elettrico/elettronico riportando un numero di serie (l'identità), avendo degli indicatori di vario genere che descrivono (parte) dello stato interno ed esibendo dei comportamenti, in seguito all'azionamento di alcune leve, pulsanti, ecc. Un modo corretto di pensare ad un oggetto è rappresentato nella seguente figura: I blocchi P1, P2, ... ed F1, F2, ... rappresentano i "meccanismi interni" dell'oggetto: in pratica sono dei sottoprogrammi (i metodi) che realizzano le operazioni previste dall'oggetto. Seguendo una metodologia di progetto ampiamente condivisa i metodi vengono spesso divisi in in due categorie: • comandi, cioè metodi che modificano lo stato dell'oggetto. Sono procedure proprie, cioè che non restituiscono valori ma che producono degli effetti collaterali, generalmente limitati allo stato locale dell'oggetto. • osservatori ( queries), cioè metodi che si limitano ad osservare lo stato dell'oggetto. Sono procedure di tipo funzionale che restituiscono un valore ottenuto come elaborazione (solitamente molto semplice) dello stato corrente dell'oggetto. 2 Questa separazione, anche se può comportare qualche inefficienza, favorisce in genere la leggibilità e la trasparenza referenziale del codice. Per creare gli oggetti la tecnica più seguita è quella di definire prima una classe, cioè uno schema di creazione che definisca i possibili stati e i comportamenti, e di invocare un'operazione di istanziazione della classe, detta costruttore o creatore, che determina univocamente l'identità di un oggetto e che ne stabilisce lo stato iniziale. Una possibile sintassi di creazione potrebbe essere: variabile nuovo [ nome_costruttore ( parametri_attuali_se_previsti ) ] In pratica una classe sarà definita da un nome a cui viene associato un elenco di costruttori, attributi e metodi, che collettivamente chiameremo proprietà della classe. Nei linguaggi OOP tipizzati, la definizione di una classe comporta generalmente anche quella di un tipo con lo stesso nome. Si ammette che dall'elenco possano mancare i costruttori: in tal caso viene usato implicitamente un costruttore di default (senza parametri). Per accedere al valore di un attributo o per invocare un metodo su un oggetto la maggior parte dei linguaggi fa uso della notazione punto: espressione_oggetto.nome_attributo espressione_oggetto.nome_metodo( eventuali_parametri_attuali_se_previsti ) 3 Esercizio 1 Realizzare una classe che permetta di effettuare le operazioni di somma e prodotto tra numeri reali e di restituirne il risultato. Si utilizzi una variabile che contenga il risultato dell’operazione secondo la logica dell’incapsulamento (information hiding) dando la possibilità di impostare tale risultato. class Calcolatrice { public Calcolatrice() { accumulatore=0.0f; } public Calcolatrice(float val){ accumulatore=val; } protected float accumulatore; public void somma(float x){ accumulatore += x; } public void moltiplica(float x){ accumulatore *= x; } public float risultato() { return accumulatore; } } Esempio di creazioni: ... //Usando il costruttore di default Calcolatrice c1 = new Calcolatrice(); //Usando il costruttore overloaded che inizializza Calcolatrice c2 = new Calcolatrice(3.0); ... //Esempi d'uso c1.somma(5.0); c2.somma(1.0); c1.moltiplica(C2.risultato()); System.out.println(scrivi C1.risultato()); /* scrive 20.0 */ 3. Information hiding 4 Il concetto di information hiding (che potremmo tradurre con "occultamento di informazione") nella OOP è implicito in quello di ADT e consiste nell'idea che l'utente di un servizio è tenuto a conoscere solo le informazioni strettamente necessarie per usufruire del servizio. Ogni altra informazione può confondere l'utente e/o mettere a rischio l'integrità dell'oggetto stesso. Tecnicamente si afferma che l'utente deve conoscere solo l' interfaccia della classe, cioè il suo nome e l'interfaccia di ciascuna proprietà pubblica. Alcuni sistemi sono in grado di estrarre/documentare automaticamente l'interfaccia di classe dalla definizione completa di un classe. In realtà esiste un altro importante vantaggio dell'information hiding: l'implementatore di una classe potrà ritenersi libero di effettuare delle migliorie senza che questo comporti delle modifiche ai programmi clienti, cioè che usino i servizi offerti da quella classe. L'information hiding è quindi determinante non solo per semplificare la vita ai programmatori, ma anche per la manutenzione e il "riuso del software". In particolare, nella OOP, l'informazione da nascondere è la rappresentazione dello stato dell'oggetto, cioè l'insieme degli attributi. A rigore, quindi, tutti gli attributi dovrebbero essere nascosti: l'utente deve potervi accedere solo indirettamente attraverso i metodi. Tuttavia, per motivi di efficienza, alcuni linguaggi ad oggetti (tra cui C++, Java e Delphi) permettono l'accesso agli attributi (sia in lettura che in scrittura). Il problema dell'information hiding viene risolto in questi linguaggi permettendo l'accesso solo ad alcuni attributi classificati come pubblici (tipicamente saranno quelli presenti in tutte le possibili rappresentazioni). Oltre agli attributi si possono nascondere anche metodi. Tipico è il caso dei metodi ausiliari, cioè utilizzati per implementare i metodi pubblici, e più in generale, di tutti quei metodi la cui esistenza è legata alla rappresentazione scelta. In generale, ogni linguaggio propone proprie soluzioni al problema della visibilità, cioè di come stabilire a quali classi rendere visibili le proprietà (sia attributi che metodi) di una classe. A titolo puramente indicativo possiamo citare la soluzione a tre livelli del linguaggio Java: proprietà pubbliche: tutte le classi possono accedervi proprietà protette: solo le sottoclassi possono accedervi proprietà private: nessuna classe può accedervi Infatti, per questioni di flessibilità ed efficienza, si sente la necessità di poter definire diversi "livelli" di visibilità. L'ideale è poter decidere per ogni proprietà, quali sono le classi che possono accedervi. L'ereditarietà, in particolare, pone un problema che occorre risolvere di volta in volta: quali proprietà ereditate di una classe devono essere nascoste alle sue sottoclassi ? alcuni linguaggi (ad es. C++ e Java) danno questa risposta: quelle pubbliche e quelle dichiarate appunto come "protette". Altri (ad es. Eiffel) sostengono la tesi che tutto quello che è visibile all'implementatore di una classe deve essere visibile anche agli implementatori delle sue sottoclassi. Inoltre Eiffel non permette la modalità "private", sostenendo il punto di vista secondo cui l'implementatore di una classe non può decidere arbitrariamente che alcuni attributi non siano utili agli implementatori delle sottoclassi. 4. Ereditarietà L'ereditarietà risulta indispensabile per processi di modellazione molto importanti nella moderna costruzione del software quali la specializzazione e la generalizzazione. Nella sua forma più semplice, l'ereditarietà (inheritance) è un meccanismo che consente ad una 5 classe di considerarsi erede di un'altra, detta classe padre o genitore (parent class), con una dichiarazione che possiamo assumere del tipo: classe <nome> eredita da <classe padre> ... Così facendo la classe <nome>, detta classe figlia (o classe derivata), eredita tutte le proprietà della <classe padre> specificata : tutti gli attributi e i metodi (anche quelli nascosti). Sono state proposte varie notazioni grafiche per rappresentare una relazione di ereditarietà tra classi. Una delle più semplici è la seguente, in cui la relazione è rappresentata da un arco diretto dalla classe figlia alla classe padre. Rappresentando l'insieme delle relazioni di questo genere si ottiene il grafo di ereditarietà Da un punto di vista pratico si può ereditare da qualsiasi classe, a patto di non introdurre cicli nel grafo di ereditarietà. Tuttavia, come suggerito dai nomi delle classi della figura, da un punto di vista metodologico è opportuno e consigliato ereditare X da Y solo quando si è certi che tra Y e X esiste una relazione Y IS-A X ("Y è un X"), o in altri termini, quando la classe figlia è una specializzazione di quella padre. Oltre a ereditare, la classe figlia può: • aggiungere propri attributi o metodi • ridefinire (overriding) metodi ereditati In questo caso il metodo ereditato (metodo precursore) e quello ridefinito hanno lo stesso nome. I linguaggi devono predisporre meccanismi linguistici opportuni per consentire all'implementatore della classe di accedere ai precursori di un metodo di qualsiasi livello. Si intende che gli utenti della classe si riferiranno a quello ridefinito. Si osservi che per ogni classe rimane definito l'insieme dei sui discendenti (supertipi) e dei sui discendenti (sottotipi). Molti linguaggi ad oggetti consentono solo l'ereditarietà semplice: ogni classe ha al massimo un padre. La classificazione degli oggetti è quindi strettamente gerarchica. Se esiste un'unica radice questa ha nomi come Object o ANY. I linguaggi ad oggetti più evoluti consentono l'ereditarietà multipla: cioè la possibilità per una classe di ereditare da più di una classe (cioè di avere più padri). Sorgono però problemi non banali di ereditarietà ripetuta: esiste cioè la possibilità di ereditare più di un metodo con lo stesso nome e occorre risolvere in qualche modo le ambiguità che si vengono a creare. 6 Esercizio 2 Realizzare una classe che permetta di effettuare oltre alle operazioni di somma e prodotto tra numeri reali anche quella di sottrazione. Il risultato dell’operazione va restituito in valore assoluto. public class CalcolatriceLusso extends Calcolatrice{ public void sottrazione(float x){ accumulatore -= x; } public float risultato() { if(accumulatore<0) accumulatore = -accumulatore; return accumulatore; } } 5. Il polimorfismo Tra i vari tipi di polimorfismo che possono essere presenti in un linguaggio, quello che si deve necessariamente ritrovare nella programmazione ad oggetti è noto come polimorfismo di inclusione universale, basato proprio sul concetto di ereditarietà. Questa forma di polimorfismo si basa sui seguenti presupposti: 7 a) la possibilità di usare variabili polimorfe, cioè che possono riferirsi ad oggetti di tipi diversi (generalmente "inclusi" in una certa gerarchia). In pratica basta permettere ad una variabile di tipo T di ricevere un oggetto di un qualsiasi sottotipo di T. b) la possibilità di effettuare chiamate polimorfe, cioè di indicare con lo stesso nome dei metodi che appartengono a classi diverse e che sono quindi generalmente diversi ("polimorfo" = "avente più forme"). A differenza di altre forme di polimorfismo, come l'overloading (sovraccarico o sovrapposizione) degli operatori, il polimorfismo di inclusione universale prevede che la decisione su quale debba essere la routine da richiamare viene presa a tempo di esecuzione a seconda della classe effettiva (più stretta) di appartenenza dell'oggetto rispetto a cui viene fatta la chiamata. Questa tecnica è nota come collegamento dinamico (late o dynamic binding) dei nomi al codice che deve essere effettivamente eseguito. Esso si contrappone al tradizionale collegamento statico (early o static binding) deciso dal compilatore, di norma, nel caso di chiamate non polimorfe. Spesso il polimorfismo viene introdotto con le classe astratte, vale a dire classi in cui compaiono uno o più metodi la cui definizione viene rinviata alle sottoclassi (metodi astratti). Tipico è l'esempio rappresentato nella figura qui sotto, in cui la classe ANIMALE ha un metodo astratto fai_verso() che trova una concreta realizzazione (definizione) solo nei discendenti "concreti" (ad es. CANE, GATTO, ecc. ). Il polimorfismo trova applicazione soprattutto in schemi simili a quello esemplificato dal seguente frammento: per ogni a : ANIMALE in S esegui a.fai_verso() fineperogni Si immagina che la variabile a assuma di volta in volta i vari oggetti (di tipo ANIMALE) che si trovano in un insieme o in un array S. Alla variabile a verrà quindi di volta in volta associato un animale potenzialmente diverso e a priori sconosciuto. Quindi, per il compilatore, la chiamata a.fai_verso() è polimorfa e, come tale, soggetta al collegamento dinamico. 6. Genericità Un'altra delle caratteristiche desiderabili del linguaggi OOP tipizzati è la genericità, cioè la possibilità di definire delle classi con uno o più parametri di tipo "tipo". Questa possibilità è utile soprattutto quando si vogliono definire delle classi di tipo contenitore di dati: array, pile, code, alberi, ecc. 8 L'idea è quella di estendere la possibilità di dichiarare il tipo degli elementi presente per il tipo predefinito array (ad es. array of integer, array of string, ecc. ) ai contenitori definiti dall'utente (pila of integer, pila of string, ecc. ). In assenza di questo strumento (ad es. Java ne è sprovvisto) si è costretti a definire una classe di oggetti "qualsiasi" (ANY o Object) e fare quindi un downcasting, cioè una conversione forzata al sottotipo che ci interessa di volta in volta. Il ricorso al downcasting si rivela comunque necessario in altre occasioni, come quelle che si presentano quando dobbiamo elaborare una collezione di oggetti di varie classi utilizzando le loro operazioni specifiche (non polimorfe). A volte esiste la necessità di restringere i possibili parametri attuali di tipo "tipo" a quelli che possiedono determinate operazioni (tipico è il caso dell'operazione di confronto : <, >, ecc.). Alcuni linguaggi (ad es. Eiffel e Sather) mettono a disposizione a tale proposito la cosiddetta genericità vincolata: solo le classi discendenti di una certa classe specificata possono essere sostituite al posto del parametro. 7. Aspetti avanzati 7.1 Copia e uguaglianza La semantica di default per le operazioni di assegnamento e di confronto per = fra oggetti prevede che vengano coinvolte solo le identità degli oggetti (in pratica, spesso, dei puntatori di memoria). Nel caso dell'assegnamento questo può creare degli spiacevoli effetti collaterali dovuti alla condivisione di strutture dinamiche che si viene a creare. Per evitarli occorre effettuare l'assegnamento con operazioni del tipo a:=copia(b) che ha l'effetto di creare in a un puntatore ad una copia dell'oggetto indicato in b. Nel confronto x = y tra oggetti, se si vuole che il confronto non venga fatto sulle identità (questo è quasi sempre il caso) ma bensì sullo stato dei due oggetti, è necessario usare operatori diversi come, ad es., uguale(x,y) . In genere i linguaggi mettono a disposizione del programmatore la possibilità di ridefinire copia e uguale classe per classe. 7.2 Asserzioni Le asserzioni in un linguaggio di programmazione sono delle espressioni booleane valutabili a tempo di esecuzione che possono assolvere a diversi scopi: • • • • forma primitiva di specifica e di documentazione prevenzione contro possibili malfunzionamenti del software; in particolare nella OOP come precondizioni e postcondizioni dei metodi strumento di verifica durante la fase di testing possibili clausole di uno stile di programmazione noto come progetto per contratto I linguaggi OOP si differenziano notevolmente rispetto al supporto e alla varietà di tipi di asserzioni che mettono a disposizione del programmatore. 7.3 Eccezioni Per aumentare la robustezza di un'applicazione, tutti i più recenti linguaggi OOP mettono a disposizione la possibilità definire, sollevare e trattare eccezioni, cioè eventi causati da malfunzionamenti o imprevisti hardware o software che si possono sempre verificare. In particolare il programmatore di ogni metodo ha la possibilità di catturare un'eccezione, riconoscerla e prendere 9 le necessarie azioni di recupero almeno per mantenere l'oggetto in uno stato interno consistente. Il trattamento standard di default è quello di propagare l'eccezione al chiamante, fino eventualmente a raggiungere il metodo avviato per primo, facendolo abortire. 7.4 Contenitori e iteratori Una volta definito come classe un contenitore astratto di dati (ad es. una pila, una lista, una tabella, ecc.) si può presentare il problema di attraversare uno di questi contenitori, cioè di costruire cicli del tipo portati sul primo elemento finché non sei giunto all'ultimo e non hai trovato una condizione di arresto elabora l'elemento corrente passa all'elemento successivo finefinché La soluzione più generale, flessibile e astratta a questo problema prevede il ricorso a degli oggetti chiamati iteratori la cui classe di appartenenza viene definita in "simbiosi" a quella dei contenitori che li attraversano. In pratica essi assolvono ad un ruolo molto simile a quello rivestito dagli indici dei "for" per l'attraversamento degli array. La differenza è che viene completamente nascosta la rappresentazione dei cursori. Il cursore è l'oggetto che all'interno di un iteratore "punta" all'elemento del contenitore in corso di attraversamento. Questo permette un domani di cambiare sia la rappresentazione dei contenitori che quella degli iteratori senza cambiare il codice delle applicazioni "clienti". 7.5 Distruttori Oltre ai costruttori può essere talvolta necessario che il programmatore definisca dei metodi, chiamati spesso distruttori, che assolvono al compito di svolgere delle azioni finali prima che l'oggetto venga completamente distrutto e le sue aree di memoria rese disponibili per operazioni di allocazione di nuovi oggetti. In particolare, in C++, i distruttori hanno spesso l'onere di recuperare parte della memoria occupata dall'oggetto. Da questo onere sono liberi tutti i linguaggi che prevedono il garbage collector, cioè quel processo della macchina virtuale del linguaggio che assolve appunto al compito di individuare e recuperare le aree occupate da oggetti che si rendono inaccessibili ("garbage", appunto). 7.6 Persistenza La persistenza nella OOP è la proprietà di un oggetto di sopravvivere al processo che l'ha creato. Un modo per implementare la persistenza è tipicamente quello di "salvarlo" su un supporto di memoria persistente, come il disco. I linguaggi OOP adottano varie tecniche per fornire questo tipo di servizio all'utenza. Il più semplice e primitivo è quello di mettere a disposizione delle primitive di salvataggio e recupero di un oggetti su un file con un certo nome. Il più sofisticato (ma anche il più semplice da usarsi) è quello di prevedere la possibilità di dichiarare come persistenti alcune classi: gli oggetti creati saranno automaticamente resi persistenti. 10 ITIS “A.Avogadro” Compito in classe V A del 29-11-2005 Durata: 3h Realizzare un programma Java che utilizzi la classe Automobile e due sottoclassi AutoDaCorsa ed Utilitaria. Le sottoclassi ereditano automaticamente le variabili di istanza e i metodi della superclasse. Le proprietà che devono essere gestite ed impostate sono la velocità, la tenuta di strada e la temperatura massima. Le utilitarie e le auto da corsa devono avere comportamenti diversi per la rilevare la temperatura, le utilitarie se riscontrano che la temperatura del motore ha superato la temperatura massima devono segnalare a schermo il messaggio di fermata alla prima sosta e controllare la temperatura dell’acqua del radiatore, mentre le auto da corsa i messaggio di controllo strumentazione e fermata ai box. Utilizzare una classe di Test per verificare il funzionamento. Si realizzi il diagramma delle classi, evidenziandone proprietà e metodi. ITIS “A. Avogadro ” Soluzione proposta • Diagramma delle classi • Implementazione delle classi //Classe auto generica, file Automobile.java package auto; class Automobile { // Classe auto generica int velocita = 0; // variabili di istanza float tenutaStrada = 0f; int temperaturaMax = 100; void setVelocita(int velocita) { //metodo imposta velocità this.velocita = velocita; } int getVelocita() { //metodo velocità System.out.println(this.velocita); return this.velocita; } void getTenutaStrada() { //metodo tenutastrada System.out.println("metodo getTenutaStrada di automobile"); } void temperaturaAlta(int temperatura) { //metodo temperatura if (temperatura > temperaturaMax) System.out.println("attenzione temperatura alta"); } } //Classe auto da corsa, file AutoDaCorsa.java package auto; class AutoDaCorsa extends Automobile { // Classe auto da corsa ( extends fa ereditare ) void temperaturaAlta(int temperatura) { // metodo temperatura if (temperatura > temperaturaMax) { System.out.println("Controllo strumentazione"); System.out.println("Fermata ai box"); } } void getTenutaStrada() { // metodo tenutastrada float coeff_asfalto = 0.001f; this.tenutaStrada = coeff_asfalto * this.velocita; System.out.println(this.tenutaStrada); } } //Classe utilitaria, file Utilitaria.java package auto; class Utilitaria extends Automobile { // Classe utilitaria (extends fa ereditare ) void temperaturaAlta(int temperatura) { // metodo temperatura if (temperatura > temperaturaMax) { System.out.println("Ferma alla prima sosta"); System.out.println("Controllo temperatura acqua radiatore"); } } void getTenutaStrada(int mantoStradale) { // metodo tenutastrada float coeff_terra = 0.034f; float coeff_asfalto = 0.03f; if (mantoStradale == 0) { this.tenutaStrada = coeff_asfalto * this.velocita; } else { this.tenutaStrada = coeff_terra * this.velocita; } System.out.println(this.tenutaStrada); } } //Classe di test, file Test.java package auto; public class Test { // classe auto che contiene il metodo main public static void main(String[] args) { AutoDaCorsa ferrari = new AutoDaCorsa(); Utilitaria cinquecento = new Utilitaria(); ferrari.setVelocita(200); cinquecento.setVelocita(100); ferrari.getTenutaStrada(); cinquecento.getTenutaStrada(1); ferrari.getVelocita(); cinquecento.getVelocita(); ferrari.temperaturaAlta(123); cinquecento.temperaturaAlta(119); } }