Introduzione alla Programmazione ad Oggetti Qual il problema
Introduzione alla Programmazione ad Oggetti
Qual è il problema? � Abbiamo visto che lo sviluppo e la gestione di software complesso richiede: � Un più alto livello di astrazione � Una maggiore protezione dei dati � Un facile riutilizzo del codice già scritto � ATTENZIONE: qualsiasi software si può scrivere con qualsiasi linguaggio che abbia la potenza computazionale del linguaggio while � Ma quanto tempo richiede? � Ma quanti rischi di introdurre errori? � Ma quanto è difficile la manutenzione? 2
Qual è la soluzione? � La soluzione può essere un linguaggio di programmazione che metta a disposizione nativamente costrutti per � Un più alto livello di astrazione � Una maggiore protezione dei dati � Un facile riutilizzo del codice già scritto � Attraverso � La 3 definizione di entità che uniscono dati e codice
Esempio � Un contatore definito tramite un costrutto ADTdef Contatore { /* attributi (non accessibili) */ int val; /* operazioni ammesse */ void set. Val(int new. Val) {val = new. Val; } void inc() {val++; } int get. Val() {return val; } } 4
Esempio Uso: main() { Contatore cont; /* istanzio un oggetto Contatore*/ Contatore cont 2; /* ne istanzio un altro */ cont. set. Val(0); cont 2. set. Val(1); cont. inc(); /* invoco delle operazioni sul contatore */ /* o, più precisamente, richiedo al contatore cont di eseguire dei servizi */ cont 2. inc() /* posso invocare le stesse operazioni sull'altro contatore: non modificano il primo contatore */ if(cont. get. Val() > MAX) {. . . } � 5
Esempio � Non è possibile chiedere operazioni non ammesse cont++; � Il compilatore dà errore: cont non è un intero cont. val=cont*345; cont. val++; � Errate entrambe: il dato val è accessibile solo tramite le operazioni di cont 6
Protezione dei dati – esempio � Vediamo un esempio: l’attributo età della classe Persona ADTdef Persona { /* attributi (non accessibili) */ . . . int età; /* deve essere >= 0 */ . . . /* operazioni ammesse */ void set. Età(int nuova. Età) {if (nuova. Età >=0) età = nuova. Età; else ERRORE; } 7
Protezione dei dati – esempio (2) � Uso della classe Persona p; p. set. Età(21); � Corretto, la variabile età di p adesso vale 21 p. set. Età(-2); � Sbagliato, il metodo set. Età controlla il nuovo valore, non permette la modifica e segnala errore � La variabile età di p vale sempre 21 8
Protezione dei dati - vantaggi � Il controllo è incluso nell’entità � Viene codificato una volte per tutte � Altrimenti, si dovrebbe fare il controllo ogni volta che si modifica il valore della variabile � La protezione dei dati impone di accedere alle variabili solo attraverso l’uso dei metodi � Il controllo sulle modifiche può essere cambiato in futuro senza dover cambiare il resto del software 9
Oggetti � Nel nostro esempio, cont e cont 2 sono “oggetti” del linguaggio, cioè entità che racchiudono (“incapsulano”) dati e codice � Oggetto � Entità software che modella un oggetto reale � Composto da uno stato e una interfaccia � Entità che unisce dati e le operazioni su di essi � Astrazione di dato (istanza di un tipo di dato astratto) 10
Stato � Contiene le informazioni sullo stato dell’oggetto � Nascosto all’esterno � È composto da un insieme di variabili (chiamate attributi o campi) � Lo stato può essere composto a sua volta da oggetti (si parla di composizione di oggetti) 11
Interfaccia �È costituita dalle operazioni (metodi) che possono essere invocati dall’esterno � I metodi servono per agire sullo stato � Solo stato 12 tramite i metodi si agisce (o si dovrebbe agire) sullo
Schema logico di un oggetto interfaccia stato 13
Classi � Oggetti diversi possono avere la stessa struttura � Una classe descrive la struttura comune a più oggetti � In termini di attributi e operazioni � I valori dei singoli oggetti possono essere diversi � Tipo di dato astratto � Sorta di “stampino” per creare oggetti � Il processo di classificazione è intrinseco nei processi cognitivi umani 14
Classi e oggetti � Le classi sono definite staticamente dal programmatore � Gli oggetti sono creati dinamicamente durante l’esecuzione del programma � Gli oggetti possono essere considerati come dei “server” che mettono a disposizione dei servizi � Modello � Ogni client-server operazione invocabile dall’esterno è un servizio che l’oggetto mette a disposizione 15
Modello client-server � Il modello client-server presuppone l’esistenza di due ruoli: � Client � Richiede il servizio � Conosce il server � Server � Mette a disposizione il servizio � Non conosce a priori il client � Spostamento � NON del fuoco: chiamare una funzione che agisca su un’entità, � MA chiedere all’entità di svolgere un servizio 16
Punto di vista Procedurale operazione (oggetto, parametri) Esempio inserisci(Lista, Elemento) 17 Ad Oggetti oggetto. operazione (parametri) Esempio Lista. inserisci(Elemento)
Esempi e vantaggi � Esempio: � dato un vettore, NON invocare una procedura di ordinamento, MA chiedere al vettore di ordinarsi � Esempio: � dato un file, non invocare una funzione che scriva dati sul file, ma chiedere al file stesso di svolgere il servizio relativo alla scrittura di file su di esso �I client non conoscono l’organizzazione interna dei centri di servizio, e non possono accedere direttamente a essa non interessa l'algoritmo (come sono fatte le cose) ma interessa che le cose vengano fatte � i clienti sono indipendenti da come sono fatti i server: facilita la manutenzione � 18
Filosofia oo � Applicazione = insieme di oggetti che interagiscono � Interazione tra oggetti tramite scambio di messaggi (invocazione di metodi) � Rapporto client-server (dinamico) tra oggetti � Semantica per riferimento � In alcuni linguaggi, si ha il concetto di ambiente 19
Cosa c’è di nuovo? � Attenzione: � quello che viene eseguito è sempre codice in linguaggio macchina! � Nuovo � Più livello di astrazione vicino al mondo da modellare � Nuovi costrutti linguistici � Danno 20 nuove possibilità al programmatore
Astrazione e classificazione � Il mondo da implementare in SW è modellato ad oggetti � Oggetto = entità indivisibile di strutturazione � L’oggetto ha una identità precisa e permanente � Dal mondo reale (complesso) vanno selezionati quegli aspetti che ci interessano semplificazione 21
Classe � Classificazione �insiemi di oggetti possono condividere gli stessi comportamenti � Classe �entità descrittiva che raggruppa tutte le definizioni (dello stato e delle operazioni) che caratterizzano un insieme di oggetti � Oggetto �istanza di una classe 22
Classe - oggetto � Forte dipendenza tra l’oggetto e la classe di cui è istanza �la relazione classe-istanza perdura per tutto il tempo di vita della istanza �l’istanza ritrova nella classe il codice da eseguire a fronte di una richiesta 23
Classe - oggetto (2) � Variabili di istanza � ogni istanza ne possiede una copia � l’esistenza è legata all’esistenza dell’istanza � Variabili di classe � sono condivise da tutte le istanze della classe � esistono indipendentemente dall’esistenza di istanze � Metodi 24 di classe e di istanza
Esempio Gestione di corsi di laurea 25
Individuare le entità � Progettiamo un programma che gestisca i corsi di laurea � Come primo passo dobbiamo individuare quali sono le entità del mondo reale che vogliamo modellare nel software come classi � Corsi di Laurea (Cd. L) � Studenti � Esami � Ma anche � Contatori � Date �… 26
Definire attributi e operazioni � Classe Cd. L � � � Classe Studente � � attributi: nome, cognome, matricola, data iscrizione, anno iscrizione, elenco esami superati, numero totali esami superati metodi: aggiornare esami superati e numero esami, e anno di iscrizione, sapere se lo studente ha superato un certo esame NON DI DEVONO POTER FARE: diminuire anno iscrizione o numero esami superati, cambiare nome/cognome. Classe Esame � � attributi: nome, esami, studenti iscritti, contatore globale degli esami superati metodi: aggiungere uno studente, recuperare uno studente, sapere quanti esami sono stati superati attributi: nome corso, promosso/bocciato, data superamento, voto metodi: per dare un voto positivo e leggere il nome dell’esame e il voto preso NON SI DEVONO POTER FARE: modifica voto, modifica da promosso a bocciato. Classe Contatore: come in precedenza 27
Creare oggetti �A tempo di esecuzione vanno creati gli oggetti che rappresentano le entità del mondo reale � Un oggetto Cd. L per ogni corso di laurea � Un oggetto Studente per ogni nuovo studente che si iscrive, che diventerà un attributo dell’oggetto Cd. L di cui fa parte � Un oggetto Esame per ogni esame superato, che diventerà un attributo dell’oggetto Studente che rappresenta lo studente reale che ha superato l’esame 28
A runtime Analis i 26 Stud. 453 Informatic a Conta esami 453 Conta esami Informatic a main Fisica Matematic a 29 Stud. 454 Conta esami 454 Fisica 28 Analis i 21 Fisica 24
Note sull’esempio � Gli oggetti vengono creati quando servono, non si ha semplicemente una dichiarazione iniziale di tutti gli oggetti (come succede per le variabili in programmi C) � Gli oggetti devono in qualche modo “conoscersi” l’un l’altro per poter interagire, richiedendosi servizi l’un l’altro � Tale conoscenza si ha attraverso “riferimenti” tra oggetti, che rappresentano in qualche modo degli “indirizzi” � Un oggetto che crea un altro oggetto, necessariamente conosce il suo indirizzo � Un oggetto che non ha creato un altro oggetto ma ha bisogno di chiedergli servizi deve in qualche modo venire a conoscenza del suo indirizzo � Può essere comunicato dal creatore ad altri oggetti tramite una sorta di “passaparola” � Gli 30 oggetti sono entità indipendenti e non inclusi l’uno nell’altro
Caratteristiche della OOP 31
Caratteristiche � Incapsulamento � Ereditarietà � Polimorfismo � Introspezione 32
Incapsulamento � Due 1. 2. aspetti Ogni oggetto “incapsula” dati e codice Ogni oggetto protegge i suoi dati verso l’esterno � Solo l’oggetto può manipolare i dati che contiene � Dall’esterno uso dell’interfaccia � Stato = insieme di variabili � valori primitivi � riferimenti ad altri oggetti 33
Ereditarietà � Una classe può derivare da un’altra classe, estendendola e specializzandola � La classe figlia eredita le variabili e le operazioni dalla classe padre � La classe figlia aggiunge le proprie variabili e le proprie operazioni a quelle del padre � Gerarchia delle classi � Classe radice 34
Ereditarietà (2) � Un modo per riutilizzare il codice � implementazione � Ma anche un modo per definire una relazione tra le classi e tra i tipi che rappresentano � progetto 35
Polimorfismo � Alla stessa richiesta di operazione possono corrispondere comportamenti diversi a seconda � dell’oggetto che esegue l’operazione � del contesto di esecuzione � del tipo di parametri passati 36
Introspezione � Capacità di un oggetto di “guardarsi dentro” � Meta-classi, classi che descrivono: � classi � metodi � variabili 37
Introspezione (2) � Possibilità di: � determinare la classe di un oggetto � avere informazioni su campi, metodi, modificatori, costruttori e superclassi di una classe � creare una istanza di una classe il cui nome sia conosciuto solo a runtime � ottenere e modificare il valore di un campo il cui nome sia conosciuto solo a runtime � invocare un metodo campo il cui nome sia conosciuto solo a runtime �. . . 38
I linguaggi OO - estensioni �C C++ � C Objective. C � Pascal Turbo Pascal ad oggetti � Lisp Xlisp � Limiti � Non OOP pura � Trucchi per usare OO � Programmazione ibrida 39
Linguaggi OO puri � Smalltalk � Forté � Eiffel � Java � C# 40
Vantaggi della OOP � Facilitazione � diverse di costruzione cooperativa di software: persone sviluppano diverse classi � ogni programmatore può semplicemente verificare il comportamento delle sue classi istanziandone oggetti e verificandone il comportamento in risposta a richieste di servizio � unico accordo necessario per integrare il tutto in un unico sistema finale: definire le interfacce (quali metodi e quali parametri) delle classi 41
Vantaggi della OOP (2) � Facilitazione � Se della gestione e manutenzione vi sono errori sui dati in un oggetto, è facile scoprire dove si trova l'errore, perché (siccome i dati non sono visibili all'esterno dell'oggetto) esso non potrà essere che all'interno dell'oggetto che gestisce quei dati � le modifiche a una classe non rendono necessario modificare il resto del programma (le altre classi) a meno che non venga modificata l'interfaccia 42
Vantaggi della OOP (3) � Supporto a progettazione e sviluppo incrementali � si possono definire nuove classi sfruttando il codice di classi già esistenti (p. e. , una classe studente a partire da una classe persona) � Possibilità � non di rapida prototipazione importa che una classe sia completamente definita per poter iniziare a "testare" il funzionamento degli oggetti di quella classe. 43
Costi della OOP � Necessità della mentalità OO � Infrastruttura costosa per applicazioni semplici � Non banale la definizione delle classi � Attenzione a finta OOP � una sola classe � troppe classi � COBOL ad oggetti (!!!) 44
- Slides: 44