Corso di Programmazione ad Oggetti

Documenti analoghi
Corso di Programmazione ad Oggetti

Object Oriented Programming

!"#$%&&'()#*%+%+!"#$"',,'()#*%+ -")%*&'&'+'$.)+-$$%&&) !"#$%&&'(%)'*+%",#-%"#.'%&'#/0)-+#12"+3,)4+56#7+#.')8'9

Corso di Informatica

Indice generale. OOA Analisi Orientata agli Oggetti. Introduzione. Analisi

Programmazione II. Lezione 4. Daniele Sgandurra 30/09/2011.

Automazione Industriale 4- Ingegneria del Software

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Concetti di base di ingegneria del software

Programmazione a Oggetti Modulo B

Modulo 4: Ereditarietà, interfacce e clonazione

Progettazione : Design Pattern Creazionali

Programmazione a Oggetti Lezione 10. Ereditarieta

Introduzione alla Programmazione ad Oggetti in C++

Strumenti di modellazione. Gabriella Trucco

1. I FONDAMENTI DELLA PROGRAMMAZIONE AD OGGETTI

Soluzione dell esercizio del 2 Febbraio 2004

Object Oriented Software Design

Parola chiave extends

Modellazione dei dati in UML

Progettaz. e sviluppo Data Base

La Metodologia adottata nel Corso

Funzioni in C. Violetta Lonati

Concetto di Funzione e Procedura METODI in Java

Progettazione ad oggetti

e-dva - eni-depth Velocity Analysis

Java: Compilatore e Interprete

I casi d uso corrispondono ai compiti che l attore (che può essere una persona fisica e non) può svolgere.

Testo Esercizio. Un modello è ragionevole quando contiene queste tre caratteristiche.

Alessandra Raffaetà. Basi di Dati

I motori di ricerca. Che cosa sono. Stefania Marrara Corso di Sistemi Informativi

Piano di gestione della qualità

Abstract Data Type (ADT)

Informatica 3. LEZIONE 7: Fondamenti di programmazione orientata agli oggetti (1)

Progettazione concettuale

Soluzione dell esercizio del 12 Febbraio 2004

Il paradigma OO e le relative metodologie di progettazione. Programmazione orientata agli oggetti

UML Unified Modeling Language

Introduzione alla Programmazione Orientata agli Oggetti. Classi, Oggetti e Messaggi

RIFERIMENTI ATTORI GLOSSARIO. ERRORI COMUNI REV. REQUISITI INGEGNERIA DEL SOFTWARE Università degli Studi di Padova

Oggetti Lezione 3. aspetti generali e definizione di classi I

B.P.S. Business Process Server ALLEGATO C10

Architetture Applicative

Il documento rappresenta una guida sintetica per descrivere sia la filosofia che il modulo software per l implementazione dei workflow in recuper@2.

TECNICHE DI SIMULAZIONE

Esercizi su. Funzioni

Corso di Amministrazione di Reti A.A. 2002/2003

MANUALE MOODLE STUDENTI. Accesso al Materiale Didattico

Indice. pagina 2 di 10

Organizzazione degli archivi

L ambizione dei design pattern (letteralmente schemi di programmazione) è quella di offrire soluzioni a problemi ricorrenti che facilitano lo

Fondamenti di Informatica C Esercitazioni di Laboratorio / 3 Outline

Programmi e Oggetti Software

Esercitazione n 4. Obiettivi

CONTABILITÀ FINANZIARIA ASCOT 3 IL PROSPETTO DI CONCILIAZIONE SPECIFICHE FUNZIONALI SCHEMI OPERATIVI SOLUZIONE AI PROBLEMI

Diagrammi dei package

Introduzione all Information Retrieval

Il database management system Access

Strutturazione logica dei dati: i file

Registratori di Cassa

Gli attributi di STUDENTE saranno: Matricola (chiave primaria), Cognome, Nome.

Modello di Controllo dell Accesso basato sui ruoli (RBAC)

Corso di Informatica

Linguaggi di programmazione

Eredità in C++ Corso di Linguaggi di Programmazione ad Oggetti 1. a cura di Giancarlo Cherchi

(Esercizi Tratti da Temi d esame degli ordinamenti precedenti)

Inizializzazione, Assegnamento e Distruzione di Classi

Le Mappe di Karnaugh.

Database. Si ringrazia Marco Bertini per le slides

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Corso Analista Programmatore Web PHP Corso Online Analista Programmatore Web PHP

LA GESTIONE DELLE VISITE CLIENTI VIA WEB

La gestione di un calcolatore. Sistemi Operativi primo modulo Introduzione. Sistema operativo (2) Sistema operativo (1)

Testo Esercizio. Un modello è ragionevole quando contiene queste tre caratteristiche.

SQL/OLAP. Estensioni OLAP in SQL

IL SISTEMA INFORMATIVO

Raccolta dei Requisiti con i Casi D'uso. Corso di Ingegneria del Software Anno Accademico 2012/13

Raggruppamenti Conti Movimenti

ISTITUTO TECNICO ECONOMICO MOSSOTTI

Database 1 biblioteca universitaria. Testo del quesito

Comune di San Martino Buon Albergo

4.5 CONTROLLO DEI DOCUMENTI E DEI DATI

BDX 3D-EDITOR (autore: Marco Bedulli) Scopo del software. Caratteristiche fondamentali. Linguaggi utilizzati. Navigazione 3D

Esercizio data base "Biblioteca"

Considera tutti i requisiti funzionali (use cases) NON deve necessariamente modellare i requisiti non funzionali

Relazioni tra oggetti e classi : Composizione. Relazioni tra oggetti e classi : esempio di Aggregazione. classe contenitore

Automazione Industriale (scheduling+mms) scheduling+mms.

UML Diagrammi delle classi. UML Diagramma classi 1

Introduzione alla Progettazione per Componenti

Esercitazione di Basi di Dati

Basi di dati. Concetti introduttivi ESEMPIO. INSEGNAMENTI Fisica, Analisi, Aule. Docenti. Entità Relazioni Interrogazioni. Ultima modifica: 26/02/2007

MODELLO E/R. Modellazione dei dati

Basi di Dati Relazionali

Corso di Sistemi di Elaborazione delle informazioni

Gestione Manutenzione Preventiva

Programmazione A.A Programmazione Orientata agli Oggetti: Lavorare con gli oggetti ( Lezione XXVII)

Transcript:

Corso di Programmazione ad Oggetti Introduzione alla programmazione ad oggetti a.a. 2008/2009 Claudio De Stefano 1

La programmazione modulare Un programma può essere visto come un insieme di moduli che interagiscono tra di loro. Tutte le funzioni di un modulo sono scritte nello stesso file. Ogni modulo è fatto di due parti, la specifica e l'implementazione. Questi due aspetti sono separati mettendoli in due file diversi: la specifica si trova nel suo file.h mentre l'implementazione nel file.cpp. MODULO interfaccia (Visibile dall'esterno) corpo (Nascosto all'esterno e protetto) 2

La programmazione modulare I moduli non fanno parte del linguaggio, ma rappresentano una tecnica di organizzazione del codice molto seguita dai programmatori. La programmazione modulare offre enormi vantaggi nell'implementazione di programmi: in particolare, al crescere della complessità dei programmi da sviluppare, consente rendere più semplici ed efficaci le operazioni di modifica e di testing del codice prodotto. Tra i principali vantaggi: Suddivisione del lavoro tra diversi programmatori; Semplificazione del riuso del software Semplificazione della manutenzione; 3

La programmazione ad oggetti La programmazione ad oggetti rappresenta un ulteriore sviluppo rispetto alla programmazione modulare. La programmazione orientata agli oggetti ( Object Oriented Programming, OOP) è un paradigma di programmazione, in cui un programma viene visto come un insieme di oggetti che interagiscono tra di loro. Nei linguaggi OOP esiste un nuovo tipo di dato, la classe. Questo tipo di dato serve appunto a modellare un insieme di oggetti dello stesso tipo. In generale, un oggetto è caratterizzato da un insieme di attributi e da un insieme di funzionalità Un paradigma di programmazione è caratterizzato dall'insieme di concetti e astrazioni che utilizza per rappresentare un programma e i passi che compongono un calcolo. Esempi di paradigmi sono: imperativo, funzionale, object oriented, logico: 4

Un esempio di oggetto Un automobile può essere caratterizzata in questo modo: attributi funzionalità potenza frena marce accellera peso cambio marcia cilindrata caqmbia direzione È possibile interagire con l'automobile, per determinarne il suo comportamento attraverso il suo interfaccia che permette di effettuarele operazioni consentite: Pedale del freno Pedale dell acceleratore Leva del cambio volante 5

Un ulteriore esempio: un videogioco 6

Classi e oggetti: un esempio Classi Orco Istanze (Oggetti) Cavaliere 7

La programmazione orientata agli oggetti La programmazione orientata agli oggetti si basa su alcuni concetti fondamentali: Classe Incapsulamento Oggetto Ereditarietà Polimorfismo 8

Linguaggi ad oggetti E possibile adottare tecniche di programmazione basate sugli oggetti anche in linguaggi tradizionali (ad es., in C o Pascal) adoperando opportune discipline di programmazione, aderendo cioè ad un insieme di regole. Queste regole non fanno però parte del linguaggio e il loro uso non può essere forzato né verificato dal compilatore. Un linguaggio di programmazione ad oggetti offre costrutti espliciti per la definizione di entità (oggetti) che incapsulano una struttura dati e le operazioni possibili su di essa. Alcuni linguaggi, in particolare il C++, consentono di definire tipi astratti, e quindi istanze (cioè, variabili) di un dato tipo astratto. In tal caso il linguaggio basato sugli oggetti presenta costrutti per la definizione di classi e di oggetti. 9

Classi e oggetti Nei linguaggi a oggetti, il costrutto class consente di definire nuovi tipi di dato e le relative operazioni. Le operazioni possono essere definite sotto forma di operatori o di funzioni (dette metodi o funzioni membro), i nuovi tipi di dato possono essere gestiti quasi allo stesso modo dei tipi predefiniti del linguaggio: si possono creare istanze, e si possono eseguire operazioni su di esse Un oggetto è una variabile che appartiene ad un particolare tipo di dato definito dall'utente per mezzo del costrutto class. Nel gergo dei linguaggi OO una variabile definita di un certo tipo (classe) rappresenta un'istanza della classe. Lo stato di un oggetto, invece, è rappresentato dai valori correnti delle variabili che costituiscono la struttura dati utilizzata per implementare il tipo di dato rappresntato definito dalla classe. 10

Caratteristiche di una classe La classe è un modulo software con le seguenti caratteristiche: E dotata di un interfaccia (specifica) e di un corpo (implementazione); La struttura dati concreta di un oggetto della classe, e gli algoritmi che ne realizzano le operazioni, sono tenuti nascosti all interno del modulo che implementa la classe; Lo stato di un oggetto evolve unicamente in relazione alle operazioni ad esso applicate; Le operazioni sono utilizzabili con modalità che prescindono completamente dagli aspetti implementativi; in tal modo è possibile modificare gli algoritmi utilizzati senza modificare l interfaccia 11

Il linguaggio C++ C++ è un linguaggio di programmazione general-purpose che supporta: la programmazione procedurale (è un C migliore ); la programmazione orientata agli oggetti; la programmazione generica. C++ è quindi un linguaggio ibrido, nel senso che supporta più paradigmi di programmazione 12

L'incapsulamento L'incapsulamento (in inglese: information hiding) è la suddivisione di un oggetto in due parti: Interfaccia: costituito dall'insieme di metodi (detti anche messagi) che possono essere invocati dall'utente per accedere alle funzionalità dell'oggetto; Implementazione Contiene l'implementazione delle funzionalità dell'oggetto e delle strutture dati necessarie È nascosta all utente L'incapsulamento è realizzato per mezzo delle istruzioni: Private: le funzioni e le variabili definite private NON sono accessibili all'esterno della classe. Public: le funzioni e le variabili definite publiche sono accessibili all'esterno della classe. 13

Le classi in C++ Il linguaggio C++ supporta esplicitamente la dichiarazione e la definizione di tipi astratti da parte dell'utente mediante il costrutto class; le istanze di una classe vengono dette oggetti. In una dichiarazione class occorre specificare sia la struttura dati che le operazioni consentite su di essa. Una classe possiede, in generale, una sezione pubblica ed una privata. La sezione pubblica contiene tipicamente le operazioni (dette anche metodi) consentite ad un utilizzatore della classe. Esse sono tutte e sole le operazioni che un utente può eseguire, in maniera esplicita od implicita, sugli oggetti. La sezione privata comprende le strutture dati e le operazioni che si vogliono rendere inaccessibili dall'esterno. 14

Le classi in C++: un esempio Inter faccia class Contatore { public: void Incrementa(); // operazione incremento void Decrementa(); // operazione decremento unsigned int give_value(); // restituisce il valore // corrente Implem entazione }; private: unsigned int value; // valore corrente const unsigned int max; // valore massimo 15

Produzione e uso di una classe Il meccanismo delle classi è orientato specificamente alla riusabilità del software. Occorre dunque fare riferimento ad una situazione di produzione del software nella quale operano: Il produttore della classe, il quale mette a punto: la specifica, in un file di intestazione (header file); l implementazione della classe (in un file separato) L utente della classe, il quale ha a disposizione la specifica della classe, crea oggetti e li utilizza nel proprio modulo. Si parla anche di modello client- server: la classe è un server che mette a disposizione un certo numero di servizi ai clients (utenti). utente client classe SERVER 16

Produzione e uso di una classe Utente.cpp // Modulo utilizzatore del modulo // Contatore #include Contatore.h unsigned int i; Contatore cont1, cont2;... cont1.incrementa(); cont2.decrementa(); i = cont1.get_value(); Contatore.h // Interfaccia del // modulo Contatore class Contatore {... }; Contatore.cpp // Implementazione del modulo Contatore #include Contatore.h Contatore::incrementa() {.. } Contatore::decrementa() {.. } 17

Ereditarietà e polimorfismo L ereditarietà consente di definire nuove classi per specializzazione o estensione di classi preesistenti, in modo incrementale Il polimorfismo consente di invocare operazioni su un oggetto, pur non essendo nota a tempo di compilazione la classe cui fa riferimento l oggetto stesso 18

Ereditarietà Il meccanismo dell'ereditarietà è di fondamentale importanza nella programmazione ad oggetti, in quanto induce una strutturazione gerarchica nel sistema software da costruire. L ereditarietà consente infatti di realizzare relazioni tra classi di tipo generalizzazione-specializzazione, in cui una classe, detta base, realizza un comportamento generale comune ad un insieme di entità, mentre le classi derivate (sottoclassi) realizzano comportamenti specializzati rispetto a quelli della classe base Esempio Tipo o classe base: Animale Tipi derivati (sottoclassi): Cane, Gatto, Cavallo, In una gerarchia gen-spec, le classi derivate sono specializzazioni (cioè casi particolari) della classe base 19

Ereditarietà Generalizzazione: dal particolare al generale Specializzazione o particolarizzazione: dal particolare al generale Generalizzazione Specializzazione Nel paradigma a oggetti, col meccanismo dell ereditarietà ci si concentra sulla creazione di tassonomie del sistema in esame 20

Ereditarietà: un esempio Oggetto Veicolo Veicolo Senza Motore Veicolo A Motore Motocicletta Automobile Aereo Taxi Per descrivere un sistema sono possibili tassonomie diverse, a seconda degli obiettivi Automobile Automobile Benzina Berlina Diesel Station Wagon 21

Ereditarietà: vantaggi Esiste però anche un altro motivo, di ordine pratico, per cui conviene usare l'ereditarietà, oltre quello di descrivere un sistema secondo un modello gerarchico; questo secondo motivo è legato esclusivamente al concetto di riuso del software. In alcuni casi si ha a disposizione una classe che non corrisponde esattamente alle proprie esigenze. Anziché scartare del tutto il codice esistente e riscriverlo, si può seguire con l'ereditarietà un approccio diverso, costruendo una nuova classe che eredita il comportamento di quella esistente, salvo che per i cambiamenti che si ritiene necessario apportare Tali cambiamenti possono riguardare sia l'aggiunta di nuove funzionalità che la modifica di quelle esistenti 22

Ereditarietà In definitiva, l ereditarietà offre il vantaggio di ridurre i tempi di sviluppo, in quanto minimizza la quantità di codice da scrivere quando occorre: definire un nuovo tipo che è un sottotipo di un tipo già disponibile, oppure adattare una classe esistente alle proprie esigenze Non è necessario conoscere in dettaglio il funzionamento del codice da riutilizzare, ma è sufficiente modificare (mediante aggiunta o specializzazione) la parte di interesse 23

Polimorfismo Per polimorfismo si intende la proprietà di una entità di assumere forme diverse nel tempo. Una entità è polimorfa se può fare riferimento, nel tempo, a classi diverse. Siano ad esempio a, b due oggetti appartenenti rispettivamente alle classi A, B, che prevedono entrambe una operazione m, con diverse implementazioni. Si consideri l'assegnazione: a := b L'esecuzione della operazione m sull'oggetto a dopo l'assegnazione, per la quale è spesso adoperata la sintassi: a.m() produce l'esecuzione della implementazione di m specificata per la classe B. 24

Polimorfismo: un esempio Si consideri una gerarchia di classi di figure geometriche: Figura +disegna() Triangolo Rettangolo Quadrato +disegna() +disegna() +disegna() Sia ad es. A un vettore di N oggetti della classe Figura, composto di oggetti delle sottoclassi Triangolo, Rettangolo, Quadrato: Figura A[N] (ad es.: A[0] è un quadrato, A[1] un triangolo, A[2] un rettangolo, etc.) 25

Polimorfismo: un esempio Si consideri una funzione Disegna_Figure(), che contiene il seguente ciclo: for i = 1 to N do A[i].disegna() L'esecuzione del ciclo richiede che sia possibile determinare dinamicamente (cioè a tempo d'esecuzione) l'implementazione della operazione disegna() da eseguire, in funzione del tipo corrente dell'oggetto A[i]. L istruzione A[i].disegna() non ha bisogno di essere modificato in conseguenza dell'aggiunta di una nuova sottoclasse di Figura (ad es.: Cerchio), anche se tale sottoclasse non era stata neppure prevista all'atto della stesura della funzione Disegna_Figure(). (Si confronti con il caso dell'uso di una istruzione case nella programmazione tradizionale). 26

Polimorfismo: estensibilità e binding dinamico Il polimorfismo supporta dunque la proprietà di estensibilità di un sistema, nel senso che minimizza la quantità di codice che occorre modificare quando si estende il sistema, cioè si introducono nuove classi e nuove funzionalità. Un meccanismo con cui viene realizzato il polimorfismo è quello del binding dinamico. Il binding dinamico (o late binding) consiste nel determinare a tempo d'esecuzione, anziché a tempo di compilazione, il corpo del metodo da invocare su un dato oggetto. 27

Vantaggi della programmazione OO Rispetto alla programmazione tradizionale, la programmazione orientata agli oggetti (OOP) offre vantaggi in termini di: modularità: le classi sono i moduli del sistema software; coesione dei moduli: una classe è un componente software ben coeso in quanto rappresentazione di una unica entità; disaccoppiamento dei moduli: gli oggetti hanno un alto grado di disaccoppiamento in quanto i metodi operano sulla struttura dati interna ad un oggetto; il sistema complessivo viene costruito componendo operazioni sugli oggetti; information hiding: sia le strutture dati che gli algoritmi possono essere nascosti alla visibilità dall'esterno di un oggetto; riuso: l'ereditarietà consente di riusare la definizione di una classe nel definire nuove (sotto)classi; inoltre è possibile costruire librerie di classi raggruppate per tipologia di applicazioni; estensibilità: il polimorfismo agevola l'aggiunta di nuove funzionalità, minimizzando le modifiche necessarie al sistema esistente quando si vuole estenderlo. 28