Corso JAVA Lezione n° 04 Istituto Statale di Istruzione Superiore “F. Enriques” Corso di Programmazione in Java – Lezione n° 04 I Paradigmi di Programmazione 2 Un paradigma di programmazione è un insieme di strumenti concettuali a cui un linguaggio di programmazione si ispira per la stesura di programmi e ne definisce/determina il modo in cui il programmatore concepisce e percepisce il programma. La storia dei paradigmi di programmazione si presta a essere rappresentata con un albero genealogico; in molti casi, infatti, un nuovo paradigma nasce come evoluzione di un altro, aggiungendo nuovi concetti ma mantenendo anche quelli fondamentali del precedente Talvolta questo "salto evolutivo" consiste nel rendere obbligatoria e/o supportare esplicitamente quella che nei paradigmi precedenti si era affermata come regola di buona programmazione. Per esempio, la programmazione strutturata ha introdotto strutture di controllo standard (sequenze, cicli e alternative) e ha vietato l'uso dell'istruzione di goto, della quale si era dimostrata la non Istituto Statale di Istruzione Superiore “F. Enriques” indispensabilità. Corso di Programmazione in Java – Lezione n° 04 I Paradigmi di Programmazione (2) In generale possiamo raggruppare i paradigmi in due grandi branche: 1. Quelli di tipo dichiarativo: per cui i programmi devono essere delle specifiche eseguibili del problema: ci si preoccupa cioè di cosa risolvere tralasciando il "come" risolverli. In generale questo approccio comporta una certa inefficienza. 2. Quelli di tipo procedurale: per cui i programmi vengono considerati alla stregua degli algoritmi; ci si preoccupa quindi direttamente del come risolvere il problema trascurando le specifiche del problema . I principali paradigmi di tipo dichiarativo sono quelli funzionale e quello logico, basati rispettivamente sul concetto di espressione e di predicato, come vedremo tra breve. I principali paradigmi procedurali sono quello imperativo e ad oggetti. 3 Istituto Statale di Istruzione Superiore “F. Enriques” Corso di Programmazione in Java – Lezione n° 04 I Paradigmi di Programmazione (3) Tra tutti i paradigmi di programmazione di tipo procedurale quelli più diffusi sono due: 1. La programmazione imperativa: è quella classica in cui rientrano i linguaggi macchina dei comuni microprocessori e i linguaggi ad al alto livello più vecchi e diffusi come FORTRAN, COBOL, BASIC, PASCAL, C. 2. La programmazione ad oggetti: è un'evoluzione di quella imperativa, ne fanno parte linguaggi come Java, C++, C#, Perl, Delphi. Entrambi i tipi di programmazione sono infatti basati sul concetto di “stato” e sulla possibilità di modificarlo attraverso l'esecuzione di “comandi”. Le differenze riguardano soprattutto la “distribuzione” e le modalità per l'accesso dello stato complessivo . 4 Istituto Statale di Istruzione Superiore “F. Enriques” Corso di Programmazione in Java – Lezione n° 04 La Programmazione Imperativa Nelle lezioni precedenti abbiamo studiato il frammento imperativo di Java, cioè i costrutti che Java fornisce per scrivere programmi secondo il paradigma imperativo. Nella programmazione imperativa, l'enfasi viene posta nella progettazione e nella scrittura dell'algoritmo con il quale, a partire dai dati in ingresso, si producono i risultati. Una computazione si svolge come una sequenza di cambiamenti di stato. Lo stato viene modificato da comandi semplici (assegnamento, invocazione di metodo), che possono essere combinati usando istruzioni condizionali o iterative. Quindi l'enfasi è posta sulle strutture di controllo: i dati (elementari o strutturati, come gli array) sono manipolati in modo passivo. 5 Istituto Statale di Istruzione Superiore “F. Enriques” Corso di Programmazione in Java – Lezione n° 04 La Programmazione Orientata agli Oggetti Nella programmazione orientata ad oggetti ci si concentra quindi sulla progettazione di un modello del dominio di applicazione. Un oggetto è una rappresentazione di un oggetto del mondo reale, o di un concetto. Nella fase di progettazione si individuano gli oggetti rilevanti, e per ogni oggetto si identifica la sua struttura e le sue funzionalità. Gli oggetti possono interagire, ad esempio quando un oggetto attiva una funzionalità di un altro oggetto. L'effetto che ne consegue può essere la creazione di altri oggetti, la attivazione di altre funzionalità dello stesso oggetto o di altri oggetti. Gli oggetti sono raggruppati in classi: ogni classe rappresenta un insieme di oggetti simili per struttura e funzionalità. La relazione di sottoinsieme viene modellata con la relazione di ereditarietà tra le classi. 6 Istituto Statale di Istruzione Superiore “F. Enriques” Corso di Programmazione in Java – Lezione n° 04 Classi e Oggetti nella vita reale: Un esempio pratico. Concentriamoci per qualche istante su alcuni concetti tralasciando l’aspetto tecnico del paradigma object oriented e proviamo per un istante a pensare ad un libro. Quando pensiamo ad un libro pensiamo subito ad un insieme di oggetti aventi caratteristiche comuni: ogni libro contiene delle pagine, ogni pagina contiene del testo, ecc Altra cosa che ci viene subito in mente riguarda le azioni che tipicamente compiamo quando utilizziamo un libro: voltare pagina, leggere il testo, guardare le figure etc. E’ interessante notare che utilizziamo il termine “libro” per generalizzare un concetto relativo a qualcosa che contiene pagine da sfogliare, da leggere, ecc.. ossia ci riferiamo ad un insieme di oggetti con attributi comuni, ma comunque composto da entità aventi ognuna caratteristiche proprie che rendono ognuna differente rispetto all’altra. Possiamo quindi affermare che un libro è un oggetto che contiene pagine e contenuti da guardare e viceversa ogni oggetto contenente pagine e contenuti da guardare può essere classificato come un libro. Abbiamo quindi definito una categoria di oggetti che chiameremo classe e che, nel nostro caso, fornisce la descrizione generale del concetto di libro. Ogni nuovo libro con caratteristiche proprie apparterrà comunque a questa classe base. 7 Istituto Statale di Istruzione Superiore “F. Enriques” Corso di Programmazione in Java – Lezione n° 04 Le Classi e Gli Oggetti Ritornando verso un aspetto più attinente alla programmazione…nelle lezioni precedenti abbiamo visto i tipi di dato primitivi che il linguaggio Java mette a disposizione (int, long, char, ecc…); sebbene sia possibile scrivere programmi interessanti usando questi tipi primitivi, spesso i programmi hanno bisogno di manipolare tipi di dato più complessi che rappresentano più fedelmente le entità del mondo reale. Conti bancari, anagrafiche di dipendenti, ecc… sono alcuni esempi di questo genere di dati. Per questi motivi un linguaggio a oggetti utilizza il concetto di classe per definire nuovi tipi di dato, ad esempio gli oggetti libri visti prima. Una classe quindi definisce un insieme di oggetti, descrivendone: la struttura (caratteristiche) che gli oggetti devono avere, le operazioni che possono operare su di essi. 8 Istituto Statale di Istruzione Superiore “F. Enriques” Corso di Programmazione in Java – Lezione n° 04 Le Classi e gli Oggetti (2) La dichiarazione di classe introduce un nuovo tipo di dato (la classe stessa), le cui istanze saranno i suoi oggetti. Es. Classe Auto (con attributi: colore, n° porte) (e metodi: accelera, frena, gira dx/sx.) Classe Auto L’istanza di una Classe è un oggetto di cui posso modificare le caratteristiche, In questo esempio potrebbe essere il colore, il numero di porte, ecc.. 9 Istituto Statale di Istruzione Superiore “F. Enriques” Oggetti di tipo Auto (3 Istanze) Corso di Programmazione in Java – Lezione n° 04 Le Classi e gli Oggetti (3) Esaminiamo adesso come si realizza praticamente ed effettivamente un oggetto. Come abbiamo detto una classe è il modello di un oggetto, ne definisce il tipo e dice cosa contiene e come si deve comportare l'oggetto in risposta alle richieste dall'esterno di effettuare un’azione (le chiamate dei metodi). Nella programmazione imperativa (quella che abbiamo visto fino ad ora) i dati sempre sono esposti al pubblico chiunque può accedere ai dati che i nostri programmi utilizzano e modificarli a suo piacimento… Nella programmazione ad oggetti le strutture dati sono invece un dettaglio che non deve essere reso noto ma protetto dall'esterno, per evitare che qualcuno possa manipolarlo in maniera scorretta. Le informazioni contenute in un oggetto sono racchiuse al suo interno, nelle sue strutture dati che rappresentano appunto l'informazione riservata "incapsulata". 10 Istituto Statale di Istruzione Superiore “F. Enriques” Corso di Programmazione in Java – Lezione n° 04 Le Classi e gli Oggetti (4) L’insieme delle strutture dati di un oggetto ne definiscono lo stato, ovvero le sue caratteristiche in uno specifico istante temporale; capite quindi che un programma per funzionare deve essere in grado di modificare lo stato (ovvero le strutture dati) di un oggetto. Il fatto che la programmazione ad oggetti cerchi di proteggere i dati da una manipolazione scorretta non significa che neghi all'algoritmo di agire sulle strutture dati, pretende però che si dica una volta per tutte quali sono gli algoritmi e su quali strutture dati agiscono. Notare che neppure gli algoritmi sono pubblici: anche essi rappresentano un dettaglio implementativo che viene nascosto all'esterno, ovvero per quanto possibile all’esterno dell’oggetto non deve interessare come funziona al suo interno, ma fornire solo le informazioni necessarie per il suo utilizzo. L'utilizzatore di un oggetto ne potrà solamente invocare i metodi; ciò garantisce che soltanto i metodi di un oggetto possano accedere alle strutture dati che definiscono lo stato dell’oggetto garantendo quindi che l'oggetto modifichi il suo stato interno in modo controllato e prevedibile. 11 Istituto Statale di Istruzione Superiore “F. Enriques” Corso di Programmazione in Java – Lezione n° 04 Come si crea una classe? In generale la sintassi per creare (dichiarare) una classe è la seguente: <modificatori d’accesso> class Nome_della_Classe { <costruttori> <modificatori d’accesso> <variabili statiche> <modificatori d’accesso> <metodi statici> <modificatori d’accesso> <variabili d'istanza> <modificatori d’accesso> <metodi d'istanza> } Se si usa la classe come contenitore Se si usa la classe come prototipo Nelle prossime diapositive verranno spiegati i significati dei campi < >. 12 Istituto Statale di Istruzione Superiore “F. Enriques” Corso di Programmazione in Java – Lezione n° 04 I Modificatori di accesso I modificatori si applicano a: classi, metodi e strutture dati; ne precedono la dichiarazione specificandone chi può accedervi. public: Tutti possono accedere. protected: Possono accedere la classi dello stesso package e tutte le sottoclassi nessun modificatore: Possono accedere tutte le classi dello stesso package (incluse le sottoclassi, ma solo se stanno nello stesso package) private: Si può accedere solo all'interno della classe Di solito, si usano solo public e private. Es. Vorrei che un attributo rimanesse ignoto all’esterno della classe. In tal caso farò precedere la definizione di tale variabile dalla parola private. Avevamo già visto un modificatore, vi ricordate? public static void main () { Il nostro Programma }; 13 Istituto Statale di Istruzione Superiore “F. Enriques” Corso di Programmazione in Java – Lezione n° 04 Il costruttore di una classe Il costruttore serve per definire e creare nuovi oggetti. Nella programmazione a oggetti, si chiamano costruttori le funzioni che vengono invocate per inizializzare un oggetto. I costruttori in un certo senso sono metodi, ma sono dei metodi speciali, infatti non necessitano di un oggetto per essere utilizzati (a differenza dei metodi veri e propri) e come risultato della loro invocazione non alterano lo stato di un oggetto ma ne creano uno. I costruttori si dichiarano all'interno di una classe rispettando le seguenti regole: il nome del costruttore deve coincidere con quello della classe; il tipo del costruttore non deve essere specificato. (Attenzione, questo non significa che il tipo del costruttore è void: concettualmente, il costruttore restituisce sempre l'oggetto appena creato.) il modificatore static non può essere usato per un costruttore. N.B.: E’ obbligatorio almeno un costruttore. (Ciò significa che ce ne può essere anche più di uno). 14 Istituto Statale di Istruzione Superiore “F. Enriques” Corso di Programmazione in Java – Lezione n° 04 Variabili Statiche e D’istanza Abbiamo detto che le strutture dati di una classe rappresentano le caratteristiche di un insieme di oggetti, e i metodi le “azioni” che tali oggetti possono svolgere per modificare tali dati. All’interno della classe si possono definire due tipi di variabili: le variabili statiche e quelle d’istanza. Le variabili d’istanza, vengono “replicate” ogni volta che si istanzia un oggetto, pertanto ogni oggetto ha la propria copia di tali variabili e può modificarle a loro piacimento. Le variabili statiche sono dette anche della classe, perché non vengono replicate, il loro valore è memorizzato una sola volta e tutti gli oggetti istanziati fanno riferimento al valore di quella variabile. Ogni modifica ad essa vale per tutti gli oggetti istanziati da quella classe. Queste variabili sono precedute dalla parola static. Le variabili statiche hanno anche una ulteriore proprietà: possono essere utilizzate anche senza un istanza; Per accedere al loro valore può bastare il nome della classe ed il nome della variabile, visto che ne è disponibile un’unica copia. 15 Istituto Statale di Istruzione Superiore “F. Enriques” Corso di Programmazione in Java – Lezione n° 04 I Metodi Nota: Nonostante la similitudine con le variabili, per adesso tralasciamo la differenza tra metodi d’istanza e metodi statici, che riprenderemo nelle lezioni successive Una istruzione rappresenta il mattone per creare le funzionalità di un oggetto. Nasce spontaneo chiedersi: come vengono organizzate le istruzioni all’interno di oggetti? I metodi sono gruppi di istruzioni riuniti a fornire una singola funzionalità, e vengono descritti con la seguente forma: Tipo_Restituito Nome _Metodo(Tipo_Parametro Nome_Parametro, … ) { Istruzioni; } Tipo_Restituito e Tipo_Parametro rappresentano ogni tipo di dato (primitivo o oggetto). Nome _Metodo e Nome_Parametro sono identificatori alfanumerici ed iniziano con una lettera. Se il metodo non ritorna valori, dovrà essere utilizzata la chiave speciale void al posto di Tipo_Restituito. Riprendendo l’esempio del libro un paio di metodi possono essere: void Gira_Pagina() { istruzioni da eseguire per girare la pagina di un libro;} oppure int Conta_Pagine() { istruzioni da eseguire per contare le pagine di un libro}; 16 Istituto Statale di Istruzione Superiore “F. Enriques” Corso di Programmazione in Java – Lezione n° 04 Riepilogo. Quindi in definitiva: Una classe definisce un nuovo tipo (il nome della classe). Gli oggetti istanziati dalla classe hanno come tipo la classe stessa. Ogni classe ha almeno un costruttore. Le variabili e i metodi d’istanza appartengono agli oggetti (istanze della classe). Le variabili e i metodi statici appartengono alla classe. Per ogni variabile e metodo, nonché classe è possibile (ma non obbligatorio) utilizzare un modificatore d’accesso (public, private, protected). 17 Istituto Statale di Istruzione Superiore “F. Enriques” Corso di Programmazione in Java – Lezione n° 04 Esempio di classe e metodi public class ContoCorrente { private float saldo; Variabile d’istanza (non c’è static) public ContoCorrente( ) { saldo = 0; } Costruttore public void Deposito(float importo_deposito) { saldo = saldo + importo_deposito; } public boolean Prelievo_Consentito(float importo_prelievo) { float Nuovo_saldo; Nuovo_saldo = saldo – importo_prelievo; Metodi if (Nuovo_saldo >= 0) return(true); else return(false); } public void Prelievo (float importo) { if (Prelievo_Consentito(importo)) saldo = saldo – importo; } public float Dimmi_Saldo() { return saldo; } } 18 Istituto Statale di Istruzione Superiore “F. Enriques” Corso di Programmazione in Java – Lezione n° 04 Esercizio per casa Per la prossima volta pensate a come potrebbe essere descritto tramite una classe l’oggetto Studente: Pensate quindi alle caratteristiche che ogni oggetto Studente possiede, se ci possono essere eventuali variabili statiche che si possono inserire nella classe, e quali metodi può effettuare uno studente. Vi si richiede solo la dichiarazione di queste cose, ovvero: tipo Nome_Variabile; modificatore Nome_metodo ( tipo nome parametro){ Scritto a parole quello che dovrebbe fare il metodo; } 19 Istituto Statale di Istruzione Superiore “F. Enriques”