Documento sulla Programmazione Orientata Agli Oggetti (OOP). Il Pdf esplora i principi fondamentali dell'OOP, come oggetti, classi, ereditarietà e polimorfismo, per studenti universitari di Informatica.
Mostra di più15 pagine


Visualizza gratis il Pdf completo
Registrati per accedere all’intero documento e trasformarlo con l’AI.
La programmazione procedurale/modulare presenta limiti tra i quali la riusabilità, la modificabilità e la manutenibilità. esiste un evidente scollamento tra i dati e le strutture di controllo che agiscono su di essi; in altre parole la programmazione modulare risulta avere un approccio orientato alla procedura piuttosto che ai dati. Con l'avvento della programmazione ad oggetti i limiti della programmazione procedurale/modulare vennero superati. Contrariamente alle tecniche di programmazione meno recenti, il paradigma OOP è basato sul fatto che esiste una serie di oggetti che interagiscono vicendevolmente, scambiandosi messaggi ma mantenendo ognuno il proprio stato ed i propri dati.
Metodo Metodo Dati Metodo Dati Metodo Metodo Metodo Metodo Dati Metodo Figura 1 - OOP Interazione attraverso scambio di messaggi
La programmazione ad oggetti, naturalmente, pur cambiando radicalmente l'approccio mentale all'analisi progettuale non ha fatto a meno dei vantaggi derivanti dall'uso dei moduli. Al contrario, tale tecnica è stata ulteriormente raffinata avvalendosi delle potenzialità offerte dalla programmazione ad oggetti.
Possiamo dare una definizione formale di programmazione orientata agli oggetti: DEF. Programmazione orientata agli oggetti (OOP- Object Oriented Programming): è un paradigma di programmazione che prevede di raggruppare in un'unica entità (la classe) sia le strutture dati che le procedure che operano su di esse, creando per l'appunto un "oggetto" software dotato di proprietà (dati o attributi) e metodi (procedure) che operano sui dati dell'oggetto stesso.
Un programma viene realizzato progettando e realizzando il codice sotto forma di classi ossia è costituito da oggetti software (istanze di classi) che interagiscono tra di loro.
La OOP si basa sulla metodologia di progettazione bottom-up in cui si parte dalla progettazione del dettaglio particolare, i singoli elementi vengono fatti interagire tra loro per costituire il progetto nella sua interezza. Questa tecnica permette una modularità molto spinta che agevola la riusabilità del software e lo sviluppo incrementale.
La programmazione a oggetti presenta molti vantaggi rispetto alla programmazione imperativa: Pag. 1· il mondo reale è orientato agli oggetti: i programmatori possono progettare software allo stesso modo in cui percepiscono il mondo reale; · la programmazione orientata agli oggetti distingue nettamente tra che cosa deve essere fatto e come deve essere fatto; per usare un oggetto basta sapere che cosa fa, cioè quali sono i metodi disponibili e come devono essere richiamati, e non come lo fa, cioè come sono implementati i metodi; l'implementazione è nascosta e potrebbe anche essere modificata senza problemi; · l'orientamento agli oggetti permette di avere: - riusabilità del codice e facilità di manutenzione: le classi definite si possono riutilizzare, eventualmente estendendole per creare nuove classi (quindi è più facile anche apportare modifiche); - robustezza cioè capacità di continuare l'esecuzione in presenza di errori; i casi anomali vengono gestiti con il meccanismo delle eccezioni; ogni volta che si verifica un problema viene lanciata un'eccezione; il codice può intercettare l'eccezione e fornire delle operazioni da eseguire in quel caso; - affidabilità: si può verificare che siano soddisfatte le condizioni per cui un oggetto appartiene a una classe
Ogni linguaggio di programmazione consente di usare, un certo numero di tipi di dato ed in quasi tutti i linguaggi imperativi è possibile definire dei nuovi tipi partendo dai tipi predefiniti ma questo meccanismo non consente di definire tipi di dato con lo stesso grado di astrazione dei tipi predefiniti nel linguaggio.
Per superare questo problema alcuni linguaggi permettono di definire dei tipi di dato che si comportano esattamente come i tipi predefiniti, attraverso i tipo di dato astratto o ADT (Abstract Data Type)
DEF. ADT (Abstract Data Type): è un tipo di dato le cui istanze possono essere manipolate con modalità che dipendono esclusivamente dalla semantica del dato e non dalla sua implementazione.
Nella programmazione per tipi di dati astratti, un tipo di dato viene definito distinguendo nettamente la sua interfaccia con l'implementazione interna. Ossia le operazioni fornite per la manipolazione del dato con il modo in cui le informazioni sono conservate e il modo in cui le operazioni agiscono al fine di esibire, all'interfaccia, il comportamento desiderato.
Il concetto di ADT è alla base della stessa programmazione orientata agli oggetti, in quanto "una classe è l'implementazione di un dato astratto"
La classe può essere considerata l'erede del tipo di dato astratto,può essere vista come il costrutto che permette di realizzare questa astrazione con un supporto strutturato da parte del linguaggio.
DEF. OGGETTO: una capsula contenente sia dati che operazioni per manipolarli e che fornisce all'esterno un'interfaccia attraverso la quale l'oggetto è accessibile.
Oggetto: classe Attributi: valore I dati di un oggetto sono detti attributi (o variabili di istanza o datamember), le operazioni di un oggetto sono chiamate metodi e possono accedere naturalmente ai dati contenuti nell'oggetto. L'esecuzione di un metodo di un oggetto è invocata mandando all'oggetto un messaggio che consiste nel nome del metodo e nei suoi eventuali parametri.
oggetto.metodo(parametri)
DEF. CLASSE: è un modello di un insieme di oggetti e stabilisce: ● Il nome
Classe Attributi Metodi Pag. 2· I suoi dati (quanti, di quale tipo) · La visibilità e l'implementazione dei suoi metodi
Diremo allora che più oggetti software che hanno le stesse proprietà e gli stessi metodi possono essere raggruppati in una classe ben definita di oggetti.
Dunque, una classe rappresenta, sostanzialmente, una categoria particolare di oggetti e, dal punto di vista della programmazione, è anche possibile affermare che una classe funge da tipo per un determinato oggetto ad essa appartenente.
Nei linguaggi OOP, il costrutto classe consente di definire nuovi tipi di dato (astratti) e le relative operazioni sotto forma di operatori o di funzioni (i metodi). I nuovi tipi di dato possono essere gestiti quasi allo stesso modo dei tipi predefiniti del linguaggio ossia · si possono creare istanze ● si possono eseguire operazioni su di esse
Diremo, inoltre, rafforzando la definizione di "oggetto", che un particolare oggetto che appartiene ad una classe costituisce un'istanza della classe stessa e lo stato di un oggetto è rappresentato dai valori correnti delle variabili che costituiscono la struttura dati concreta sottostante il tipo astratto
Gli oggetti sono creati dinamicamente mediante istanziazione di una classe, ossia viene allocato uno specifico oggetto con la propria struttura.
Diremo, formalizzando la definizione di classe: Una classe può essere vista come l'insieme degli oggetti che sono istanza della classe stessa.
DEF. METODO: sono azioni che un oggetto è in grado di compiere.
Una delle domande principali da porsi quando si vuole creare un oggetto è: "Cosa si vuole che sia in grado di fare?"
In generale, potremmo definire almeno tre buone regole per identificare i metodi da associare ad un oggetto:
Ogni metodo ha una segnatura (o firma) costituita dal nome del metodo e dal numero e tipo dei suoi parametri. Lo stesso nome di metodo può essere usato per operazioni diverse, con definizioni diverse che richiedono un diverso tipo o numero di parametri, cioè una diversa segnatura. La definizione di più metodi con lo stesso nome e segnatura diversa è nota come overloading (o sovraccarico). Quando si richiama un metodo sovraccarico il metodo effettivo da utilizzare viene individuato in base alla corrispondenza dei parametri nella chiamata e nella definizione.
DEF. PROPRIETA': Le proprietà rappresentano i dati dell'oggetto, ovvero le informazioni su cui i metodi possono eseguire le loro elaborazioni.
Un oggetto, per essere ben definito, deve contenere le proprietà che effettivamente gli competono e non tutte quelle che gli si potrebbero comunque attribuire. Questa regola di buona programmazione nasce, oltretutto, dall'esigenza di rendere più facile la fase di disegno e quella di debug che altrimenti risulterebbero certamente complesse.
In generale, esistono tre tipologie di proprietà: gli attributi, i componenti e i peer objects.
Gli attributi rappresentano quelle proprietà che descrivono le caratteristiche peculiari di un oggetto (ad esempio, riferendosi ad una persona: altezza, peso).
I componenti sono identificabili in quelle proprietà che sono atte a svolgere delle azioni (testa, Pag. 3corpo, mani, gambe).
I peer objects definiscono delle proprietà che a loro volta sono identificate e definite in altri oggetti (ad esempio: l'automobile posseduta da una persona).
DEF. MESSAGGIO: Si è detto che i metodi rappresentano le azioni che un oggetto è in grado di eseguire. Ma, in base a quale criterio vengono scatenate ed eseguite tali azioni? Semplicemente rispondendo alle "sollecitazioni" provenienti da altri oggetti. Tali sollecitazioni costituiscono quelli che, in un programma che utilizza il paradigma OOP, vengono definiti messaggi. Questi ultimi rappresentano il cuore del modello ad oggetti. Esempio, ipotizziamo di avere 2 oggetti:l'oggetto masterizzatore che esegue il metodo Scrivi_CD, e l'oggetto controller che al suo interno ha una proprietà "masterizzatore". Il controller invia una richiesta (messaggio) al masterizzatore sollecitandone l'azione di scrittura.
Si è soliti suddividere i messaggi nelle seguenti categorie:
Una classe che non si interfacci con altre classi è sicuramente poco significativa in OOP. Abbiamo visto che gli oggetti, in un programma Object Oriented, interagiscono tra loro utilizzando lo scambio di messaggi per richiedere l'esecuzione di un particolare metodo. Tale comunicazione consente di identificare all'interno del programma una serie di relazioni tra le classi in gioco la cui documentazione risulta essere assai utile in fase di disegno e di analisi.
Le più comuni relazioni tra classi, in un programma ad Oggetti sono identificabili in tre tipologie:
Associazione L'Associazione è il tipo di Relazione più intuitiva ed anche più diffuso. In generale, diciamo che una classe A utilizza una classe B se un oggetto della classe A è in grado di inviare dei messaggi ad un oggetto di classe B oppure se un oggetto di classe A può creare, ricevere o restituire oggetti di classe B. Più in dettaglio, potremmo dire che una classe è associata ad un'altra se è possibile "navigare" da oggetti della prima classe ad oggetti della seconda classe seguendo semplicemente un riferimento ad un oggetto.
Aggregazione La relazione di tipo Aggregazione si basa, invece, sul seguente concetto: Un oggetto di classe A contiene un oggetto di classe B se B è una proprietà (attributo) di A. In sostanza, l'aggregazione è una forma di associazione più forte: una classe ne aggrega un'altra se esiste tra le due classi una relazione di tipo "intero-parte". Ad esempio la classe Azienda aggrega la classe Persona perché una ditta (che costituisce l'intero") è composta da persone (che costituiscono la "parte"). Una classe ContoBancario, invece, non è legata da una relazione di tipo Pag. 4