Introduzione alla Programmazione ad Oggetti

Slides:



Advertisements
Presentazioni simili
Unità di apprendimento 6 Dal problema al programma.
Advertisements

Fondamenti di Informatica - D. Talia - UNICAL 1 Fondamenti di Informatica FONDAMENTI DI INFORMATICA Domenico Talia
1 Elementi DI INFORMATICA Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica Linguaggio C A.A. 2011/2012
Parte 2 Programmare in Matlab – I Sommario: Introduzione: m-file Strutture condizionali e cicli –Istruzione “if” + Operatori logici in MatlabIstruzione.
Fondamenti di Informatica A - Massimo Bertozzi LE FUNZIONI.
Programmazione in Java Parte II Lezione 5 Dott. Marco Faella.
PGDay 2009 FSGateway Ing. Torello Querci Resp. Architetture SW - Negens S.r.l. 4 Dicembre 2009, Pisa.
.  I tipi di dati non primitivi sono gli array, le struct e le union.  Gli array sono degli aggregati di variabili dello stesso tipo.  La dichiarazione.
CONTROLLO DELLA CONCORRENZA
Basi di dati - Fondamenti
Ereditarietà Uno dei principi della programmazione orientata agli oggetti (OOP) è il riuso Le classi dovrebbero essere progettate come componenti riutilizzabili.
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning
Progettazione di una base di dati relazionale
Rileaborato da M. Lenzerini - Basi di dati
© 2007 SEI-Società Editrice Internazionale, Apogeo
Alcune note, dalla rete, sui Sistemi cellulari
Rielaborato da Atzeni et al., Basi di Dati, Mc-Graw Hill
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning
Rielaborato da Atzeni et al., Basi di dati, Mc-Graw Hill
EasyGraph Dynamic web-based dashboard
Generazione di codice dinamico per la realizzazione di catene di servizi componibili Matteo Fazi – matr
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Microcontrollori e microprocessori
Progettazione di una base di dati relazionale
Raccolta ed Analisi dei Requisiti nella Progettazione
Progettazione di una base di dati relazionale
IL CONCETTO DI ALGORITMO
10. Programmazione Ricorsiva Ing. Simona Colucci
Basi di Dati: Introduzione
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Unità di apprendimento 7
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Robot che vivono in un mondo incerto
Programmazione a oggetti
Un’università vuole raccogliere ed organizzare in un database
I vincoli di integrità Alcuni aspetti della realtà NON possono essere modellati solamente con entità, attributi e relazioni, per esempio i vincoli di integrità.
Programmazione a oggetti
Asynchronous JavaScript and XML
PROGRAMMAZIONE BASH – ISTRUZIONE IF
Informatica per l’Ingegneria
Rielaborato da Atzeni et al., Basi di Dati, Mc-Graw Hill
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Programmazione ad Oggetti per la Fisica
Gli schemi concettuali
Introduzione alle basi di dati
Psicologia dell’apprendimento
OBJECT ORIENTED DATABASE
Introduzione alla normalizzazione
Basi di dati - Fondamenti
Programmare.
© 2007 SEI-Società Editrice Internazionale, Apogeo
Progettazione concettuale
I numeri relativi DEFINIZIONE. Si dicono numeri relativi tutti i numeri interi, razionali e irrazionali dotati di segno (positivo o negativo). ESEMPI Numeri.
Ricorsione 16/01/2019 package.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Definizione di linguaggio di programmazione
APPUNTI SUL LINGUAGGIO C
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
OpenLayers Client di mappe “non solo” WMS
Concorrenza e parallelismo
Parti interne del computer
Strategie di progetto Si possono utilizzare le strategie tipiche dello sviluppo di un processo di ingegnerizzazione (es. ingegneria del software). Strategie.
Unità 1 Programmi base.
Array e Stringhe Linguaggio C.
Il questionario: progettazione e redazione II Modulo
Ese 1 (del 31 Marzo 2004).
Vincoli di Integrità Non tutte le combinazioni possibili di valori dei domini su cui è definita una relazione sono accettabili. Alcuni attributi possono.
CLOUD.
Transcript della presentazione:

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?

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 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 setVal(int newVal) {val = newVal;} void inc() {val++;} int getVal() {return val;} }

Esempio Uso: main() { Contatore cont; /* istanzio un oggetto Contatore*/   Contatore cont2; /* ne istanzio un altro */ cont.setVal(0); cont2.setVal(1); cont.inc(); /* invoco delle operazioni sul contatore */ /* o, più precisamente, richiedo al contatore cont di eseguire dei servizi */   cont2.inc() /* posso invocare le stesse operazioni sull'altro contatore: non modificano il primo contatore */ if(cont.getVal() > MAX) {...}

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

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 setEtà(int nuovaEtà) {if (nuovaEtà >=0) età = nuovaEtà; else ERRORE; }

Protezione dei dati – esempio (2) Uso della classe Persona Persona p; p.setEtà(21); Corretto, la variabile età di p adesso vale 21 p.setEtà(-2); Sbagliato, il metodo setEtà controlla il nuovo valore, non permette la modifica e segnala errore La variabile età di p vale sempre 21

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

Oggetti Nel nostro esempio, cont e cont2 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)

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)

Interfaccia È costituita dalle operazioni (metodi) che possono essere invocati dall’esterno I metodi servono per agire sullo stato Solo tramite i metodi si agisce (o si dovrebbe agire) sullo stato

Schema logico di un oggetto interfaccia stato

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

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 client-server Ogni operazione invocabile dall’esterno è un servizio che l’oggetto mette a disposizione

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 del fuoco: NON chiamare una funzione che agisca su un’entità, MA chiedere all’entità di svolgere un servizio

Punto di vista Procedurale Ad Oggetti operazione (oggetto, parametri) Esempio inserisci(Lista, Elemento) 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 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

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

Cosa c’è di nuovo? Attenzione: Nuovo livello di astrazione quello che viene eseguito è sempre codice in linguaggio macchina! Nuovo livello di astrazione Più vicino al mondo da modellare Nuovi costrutti linguistici Danno 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

Classe Classificazione Classe Oggetto 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

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

Classe - oggetto (2) Variabili di istanza Variabili di classe 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 di classe e di istanza

Esempio Gestione di corsi di laurea

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 (CdL) Studenti Esami Ma anche Contatori Date …

Definire attributi e operazioni Classe CdL attributi: nome, esami, studenti iscritti, contatore globale degli esami superati metodi: aggiungere uno studente, recuperare uno studente, sapere quanti esami sono stati superati 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 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

Creare oggetti A tempo di esecuzione vanno creati gli oggetti che rappresentano le entità del mondo reale Un oggetto CdL per ogni corso di laurea Un oggetto Studente per ogni nuovo studente che si iscrive, che diventerà un attributo dell’oggetto CdL 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

Conta esami Informatica A runtime Analisi 26 Stud. 453 Fisica 28 Informatica Conta esami 453 Conta esami Informatica main Analisi 21 Stud. 454 Fisica Conta esami 454 Fisica 24 Matematica

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 oggetti sono entità indipendenti e non inclusi l’uno nell’altro

Caratteristiche della OOP

Caratteristiche Incapsulamento Ereditarietà Polimorfismo Introspezione

Incapsulamento Due 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

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

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

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

Introspezione Capacità di un oggetto di “guardarsi dentro” Meta-classi, classi che descrivono: classi metodi variabili

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 ...

I linguaggi OO - estensioni C  C++ C  ObjectiveC Pascal  Turbo Pascal ad oggetti Lisp  Xlisp Limiti Non OOP pura Trucchi per usare OO Programmazione ibrida

Linguaggi OO puri Smalltalk Forté Eiffel Java C#

Vantaggi della OOP Facilitazione di costruzione cooperativa di software: diverse 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

Vantaggi della OOP (2) Facilitazione della gestione e manutenzione Se 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

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à di rapida prototipazione non importa che una classe sia completamente definita per poter iniziare a "testare" il funzionamento degli oggetti di quella classe.

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 (!!!)