Vai alla Home Page About me Courseware Federica Living Library Federica Federica Podstudio Virtual Campus 3D Le Miniguide all'orientamento Gli eBook di Federica La Corte in Rete
 
 
Il Corso Le lezioni del Corso La Cattedra
 
Materiali di approfondimento Risorse Web Il Podcast di questa lezione

Ernesto Burattini » 21.Cenni di programmazione orientata agli oggetti


Introduzione alla programmazione ad oggetti

Gli strumenti di programmazione finora mostrati sono solo una piccola parte della strumentazione necessaria alla progettazione e realizzazione di software attinenti applicazioni reali.

Di norma una applicazione richiede migliaia o centinaia di migliaia di linee di codice per cui è di fondamentale importanza avere adeguati strumenti sia di programmazione che di verifica del software.

Introduzione alla programmazione ad oggetti (segue)

I grandi progetti software richiedono un gruppo di lavoro e non un singolo individuo e di conseguenza si hanno interazioni continue tra diversi soggetti.

Di qui la necessità di conformare l’attività del gruppo a degli standard:

  • uniformità di stile di programmazione,
  • progettazione comune di interfacce,
  • documentazione standard,
  • ………………………….

Introduzione alla programmazione ad oggetti (segue)

Anche la qualità del software deve soddisfare ad alcune proprietà:

  • Correttezza. Un software è corretto se e solo se soddisfa le sue specifiche. Le specifiche descrivono il comportamento del sistema nel suo complesso in tutti i dettagli, così come stabilito dal contratto tra utente e sviluppatori.
  • Robustezza. Un software è robusto se ha la capacità di funzionare anche in condizioni anormali. Se le specifiche descrivono in dettaglio tutti gli errori in cui si può incorrere allora si ottiene un software più robusto.

Introduzione alla programmazione ad oggetti (segue)

  • User-friendly. Un software è di facile utilizzo se richiede poco tempo sia nell’apprendimento del sistema nel suo complesso, sia nel suo uso pratico.
  • Adattabilità. E’ la capacità del software di evolversi senza traumi. Piccoli cambiamenti nel software (aggiungendo nuove caratteristiche o modificando quelle esistenti) non devono provocare continui errori nel sistema.
  • Riusabilità. Un software è riusabile quando i suoi componenti possono essere riutilizzati in altri sistemi software.
  • Interoperabilità. E’ la capacità del software di essere facilmente combinato con altri sistemi software.

Introduzione alla programmazione ad oggetti (segue)

  • Efficienza. Un sistema software è efficiente se i vari costi da sostenere sono sufficientemente bassi.
  • Portabilità. E’ la capacità di un software di essere trasportato su un diverso hardware (di norma con costo minore).
  • Sicurezza. Un sistema è sicuro se un utente non autorizzato non può accedervi e, quindi, introdurre modifiche o produrre danni.

Introduzione alla programmazione ad oggetti (segue)

E’ necessario, quindi, introdurre una metodologia per lo sviluppo del software che abbia due caratteristiche fondamentali:

  • essere una descrizione astratta di come si costruiscono grossi sistemi di software;
  • provvedere a prescrizioni di come il software deve essere costruito.

Introduzione alla programmazione ad oggetti (segue)

Nell’ambito dello sviluppo software si identifica il così detto “ciclo di vita del software” che può essere suddiviso in una serie di passi distinti secondo lo schema seguente:

  • Introduzione dei requisiti e delle specifiche (Requirements). In questa fase vengono determinate le specifiche del software; esse coinvolgono gli utenti e gli sviluppatori per determinare gli scopi e le funzionalità del prodotto richiesto.
  • Analisi e razionalizzazione dei requisiti (Analysis). Vengono analizzate le specifiche per evitare eventuali ambiguità ed imprecisioni; è in questa fase che si incomincia a costruire un modello astratto del sistema.

Introduzione alla programmazione ad oggetti (segue)

  • Progettazione (Design). Scrittura di un documento che costituisca la base del software, sia rispetto alla sua consistenza che alla sua manutenzione ed adattabilità.
  • Implementazione (Production). Scelta delle strutture dati e degli algoritmi necessari e scrittura del codice relativo.
  • Testing. Controllo dei difetti sia nelle unità componenti che nel software nel suo insieme.
  • Manutenzione (Maintenance). Evoluzione del sistema software.

Introduzione alla programmazione ad oggetti (segue)

A parte la manutenzione, che deve necessariamente essere effettuata dopo che il software è andato in uso, si hanno due modelli per la progettazione del software:

Waterfall (a cascata) ed Evolutionary (a spirale o evolutivo).

Modello Waterfall: è un modello nel quale ogni passo di progettazione può essere compiuto soltanto dopo il completamento di quello precedente; l’integrazione tra le varie fasi avviene soltanto alla fine dello sviluppo per cui il software è utilizzabile solo alla fine del processo.

Modello Evolutionary: è un modello nel quale si identificano brevi cicli di sviluppo completo con una forte integrazione tra i passi; è spesso presente un prototipo del software che implementa alcune funzionalità.

Introduzione alla programmazione ad oggetti (segue)

Nell’ottica del modello Evolutionary sono stati introdotti i cosiddetti linguaggi a oggetti.

Tra questi uno dei più utilizzati è proprio il C++.

Esso presenta la caratteristica di poter essere usato sia secondo una metodologia orientata alla funzione, come in realtà abbiamo fatto finora, sia secondo una metodologia più propriamente orientata agli oggetti OOD (Object Oriented Design).

Introduzione alla programmazione ad oggetti (segue)

Terminologia della programmazione a oggetti

Introduciamo alcuni termini che si usano nella programmazione a oggetti.

Esempi di oggetti sono le persone, gli animali, le piante, le automobili, gli aerei, i palazzi, i calcolatori e quant’altro.

Gli uomini pensano in termini di oggetti.

Possiamo suddividere gli oggetti in due grandi categorie: oggetti animati e inanimati. I primi si muovono e intraprendono azioni, al contrario dei secondi.

Entrambi i tipi di oggetti hanno una caratteristica in comune:

gli attributi, come ad esempio la dimensione, la forma, il colore, il peso, e così via.

Introduzione alla programmazione ad oggetti (segue)

Gli oggetti hanno tutti dei comportamenti: un pallone rotola, rimbalza, si gonfia o si sgonfia; un bambino piange, dorme, mangia, cammina; un’automobile accelera, frena, svolta; un asciugamano assorbe l’acqua e così via.

Nella programmazione a oggetti si devono individuare i tipi di attributi e i comportamenti che caratterizzano gli oggetti software individuati.

Introduzione alla programmazione ad oggetti (segue)

Molti oggetti diversi possono essere caratterizzati da attributi e comportamenti molto simili tra loro. Ad esempio un bambino e un adulto hanno comportamenti simili per alcuni versi e diversi per altri. Oppure se pensiamo alla classe dei felini avremo animali come i gatti e le tigri che sono simili per alcuni aspetti e molto diversi per altri.

L’idea sottointesa dalla progettazione ad oggetti è quella di modellare gli oggetti software sulla base degli oggetti del mondo reale con i loro attributi e modalità di funzionamento.

Introduzione alla programmazione ad oggetti (segue)

E’ stato quindi introdotto il concetto di classe che individua tutte le proprietà che caratterizzano in genere una larga varietà di oggetti, che si diranno appartenere a quella classe.

Ad esempio alla classe delle sedie appartengono tutti quegli artefatti che consentono ad un uomo di sedere; hanno quindi una certa altezza massima, hanno un piano di appoggio, sono spostabili, e così via. Quindi alla classe sedia appartengono le poltrone, le sedie a sdraio, gli sgabelli e così via.

Introduzione alla programmazione ad oggetti (segue)

Si introducono poi delle relazioni di ereditarietà, secondo le quali è possibile definire nuove classi di oggetti derivate da classi esistenti, ereditando le loro caratteristiche ed estendendole con caratteristiche proprie.

Ad esempio, un oggetto della classe mucca ha le stesse proprietà degli oggetti appartenenti alla classe mammifero in aggiunte ad altre proprietà che la caratterizzano, quali ad esempio quella di produrre latte.

Introduzione alla programmazione ad oggetti (segue)

Programmando ad oggetti abbiamo uno strumento più naturale e intuitivo di pensare al processo della programmazione, in quanto possiamo modellare, con la precisione che ci interessa, gli oggetti del mondo reale, i loro attributi e i loro comportamenti.

Con la programmazione ad oggetti è anche consentita una comunicazione tra gli oggetti che avviene mediante messaggi, che reciprocamente possono inviarsi.

Un oggetto prenotazione ferroviaria, potrebbe, ad esempio, ricevere un messaggio che gli impone di ridurre il numero di posti disponibili su un determinato treno, a seguito di un messaggio inviato da un altro oggetto denominato biglietto e relativo ad una prenotazione effettuata.

Introduzione alla programmazione ad oggetti (segue)

La progettazione ad oggetti incapsula i dati (gli attributi) e le funzioni (i comportamenti) in pacchetti denominati oggetti; tali dati e funzioni sono intimamente correlati tra di loro.

E’ possibile per un oggetto mascherare delle informazioni (information hiding). Infatti, sebbene gli oggetti comunichino tra loro attraverso interfacce ben definite, non sempre un oggetto conosce la struttura interna degli oggetti con cui comunica, in quanto i dettagli delle implementazione sono nascosti all’interno di ciascun oggetto.

Ad esempio possiamo tranquillamente adoperare un calcolatore anche se non conosciamo come esso funzioni.

Introduzione alla programmazione ad oggetti (segue)

Si hanno quindi i linguaggi come il C, il Pascal e così via detti linguaggi procedurali, nei quali la programmazione tende a essere orientata all’azione.

Al contrario la programmazione nei linguaggi come il C++ è detta orientata agli oggetti.

Introduzione alla programmazione ad oggetti (segue)

Mentre in C l’unità di programmazione è la function, in C++ l’unità è la classe, dalla quale eventualmente si istanziano (creano) gli oggetti.

La relazione fra classi e oggetti può essere esemplificata come segue:
Il progetto di un’automobile sta all’automobile costruita, allo stesso modo in cui le classi stanno agli oggetti.

Infatti, così come è possibile costruire molte automobili partendo dallo stesso progetto allo stesso modo, possiamo istanziare parecchi oggetti a partire da una sola classe.

Introduzione alla programmazione ad oggetti (segue)

I programmatori C si concentrano sulla scrittura di funzioni, cioè di gruppi di azioni che effettuano un’operazione completa.

Un programma è costituito da un insieme di funzioni.

I dati sono importanti anche in C, naturalmente, ma il concetto è che essi sono soltanto un supporto alle azioni da intraprendere.

I verbi presenti nelle specifiche (descrizioni) di un sistema guidano il programmatore C nel determinare le funzioni che devono lavorare insieme per implementarlo.

Introduzione alla programmazione ad oggetti (segue)

Le classi del C++ contengono funzioni che implementano le operazioni e i dati che implementano gli attributi.

Una progettazione orientata agli oggetti OOD (Object Oriented Design) focalizza l’attenzione sul dominio del problema più che sui processi inerenti la sua soluzione.

In altre parole gli elementi di base sono ora gli oggetti e non più le funzioni.

Introduzione alla programmazione ad oggetti (segue)

Che cosa è un oggetto?

Ad esempio, il tipo int rappresenta il concetto di numero intero mentre le operazioni +, -, *, /, % rappresentano alcuni dei suoi metodi, cioè sono gli strumenti che possiamo utilizzare per operare con essi.

Quindi possiamo dire che il concetto di tipo parte da un’idea astratta per poi assumere una rappresentazione concreta.

Introduzione alla programmazione ad oggetti (segue)

Altro esempio. Abbiamo introdotto le strutture con la parola chiave struct, che ci hanno permesso di definire vari tipi, come studente, anagrafe, data etc., che si servono a loro volta sia di tipi elementari che di altre strutture.

Ora, così come accade per i tipi int e float, potremmo definire delle operazioni anche per strutture tipo la struct studente.

In questo caso, per esempio, potremmo avere, come operazioni, o metodi, la lettura e scrittura dei dati dello studente, il calcolo della media dei voti e delle tasse pagate fino ad un certo periodo, e così via.

Introduzione alla programmazione ad oggetti (segue)

Per ottenere questo risultato è necessario introdurre un nuovo costrutto che inglobi in sè sia i dati che le operazioni.

A tal fine si introduce un nuovo tipo utilizzando la parola chiave class.

La class è, quindi, un tipo definito dall’utente con annesse tutte le operazioni e le proprietà che lo rendono adatto agli scopi che l’utente stesso si prefigge.

Introduzione alla programmazione ad oggetti (segue)

Gli oggetti sono le variabili di tipo class: diremo anche che un oggetto è un’istanza della classe.

Per conservare la modularità, è necessario che ogni oggetto esegua il suo compito senza che l’utilizzatore conosca esattamente come ciò avvenga.

Questo si verifica sicuramente con i tipi standard, int e float: infatti noi eseguiamo su di loro tutte le operazioni del caso senza necessariamente sapere come queste operazioni sono implementate.

Introduzione alla programmazione ad oggetti (segue)

Con questo information hiding, si rendono invisibili dall’esterno tutti i meccanismi interni dell’oggetto.

Inoltre, l’oggetto contiene al suo interno tutte le proprietà e le operazioni che consentono di gestirlo: questo meccanismo di autosufficienza dell’oggetto è detto incapsulamento.

In definitiva un oggetto è qualcosa di autosufficiente caratterizzato da

  • uno stato: in cui sono definite tutte le proprietà dell’oggetto
  • un’interfaccia: in cui sono definite tutte le operazioni che si possono eseguire sull’oggetto

Introduzione alla programmazione ad oggetti (segue)

Le proprietà e i metodi di un oggetto possono essere
pubblici (public) se sono sempre accessibili dall’esterno,

privati (private) se sono invisibili dall’esterno e quindi gestibili unicamente dagli oggetti stessi,

protetti (protected) se sono pubblici per gli oggetti derivati e privati per quelli astratti.

La tipologia protected è connessa all’ereditarietà ed al polimorfismo, aspetti che non tratteremo in questo corso.

Introduzione alla programmazione ad oggetti (segue)

Un oggetto è un insieme indistinto di variabili e comportamenti.

Un oggetto è la definizione di un nuovo tipo, che rappresenta la sua classe (class).

Un oggetto-classe definisce una particolare variabile che lo contiene insieme a tutti i comportamenti che può esibire.

Le variabili associate con una classe sono dette data-member (istanze di variabili) e i comportamenti sono detti function-member (o metodi).

I metodi sono i processi che possono essere attivati all’interno della metodologia orientata agli oggetti; essi corrispondono alle function della metodologia Top-down.

Introduzione alla programmazione ad oggetti (segue)

Nella progettazione orientata agli oggetti i dati devono corrispondere agli elementi concettuali che meglio possono essere utili per la soluzione del problema proposto.

Le classi, contenendo tipi primitivi, tipi di dati definiti dall’utente, come le struct, e le operazioni relative, consentono al compilatore di verificare eventuali inconsistenze tra specifiche, implementazione ed uso grazie al concetto di astrazione in esse contenuto.

  • Contenuti protetti da Creative Commons
  • Feed RSS
  • Condividi su FriendFeed
  • Condividi su Facebook
  • Segnala su Twitter
  • Condividi su LinkedIn
Progetto "Campus Virtuale" dell'Università degli Studi di Napoli Federico II, realizzato con il cofinanziamento dell'Unione europea. Asse V - Società dell'informazione - Obiettivo Operativo 5.1 e-Government ed e-Inclusion