Paola Magillo, Univestita' di Genova, Corso di Programmazione II per SMID, a.a. 2006-2007.

Lezione 01:

CONCETTI BASE DELLA PROGRAMMAZIONE ORIENTATA A OGGETTI (O.O.)

Abbiamo distribuito una scheda da compilare:

Scheda per corso di Programmazione II -- SMID
Anno accademico:
Cognome:
Nome:
Email:
Ha passato Programmazione I (si/no):

Questa scheda e' il nostro "esempio" per spiegare il significato di alcuni termini O.O.: classe, oggetto, attributi, identita'.

Classi, oggetti, attributi

Classe = la matrice di stampa della scheda:

Oggetto = la scheda stampata (il foglio di carta) con caselle compilate. Le scritte nelle caselle obbediscono allo schema.

Attributi = le caselle: titolo (nome della variabile) e tipo.

Valore dell'attributo = quello che scrivo dentro la casella (conforme al tipo).

Identita'

Identita' = essere "se stesso". Che cosa e' l'identita' di un oggetto?

L'identita' dell'oggetto e' il foglio di carta.

Se cancello e riscrivo il contenuto delle caselle cambiandolo, rimane lo stesso oggetto.
Un oggetto resta se stesso evolvendo nel tempo. I valori correnti dei suoi attributi sono il suo stato corrente. Lo stato di un oggetto puo' cambiare nel tempo, l'identita' resta sempre quella.

Se faccio la fotocopia del foglio di carta, ottengo un altro oggetto, anche se il contenuto delle caselle e' uguale.
Sono due oggetti con stato uguale, ma identita' diverse.

Nota: anche il foglio non compilato e' un oggetto. Ha valore degli attributi nullo (caselle lasciate bianche).
Se faccio N fotocopie della scheda vuota, sono N oggetti diversi (N fogli di carta), ognuno con la sua identita'.

Essendo piu' informatici

Oggetto = foglio di carta (con stampata sopra la struttura della scheda, e possibilmente compilata) = area di memoria allocata (e strutturata in un certo modo, contenente valori).

Classe = matrice di stampa della scheda = modo in cui e' strutturata quell'area di memoria.
Es. i primi 10 byte sono da considerarsi come 10 caratteri e servono a contenere il cognome, ecc.

Una classe puo' servire da matrice per tanti oggetti chiamati istanze della classe.

Attributi di istanza e attributi di classe

Attributo di istanza o di oggetto = casella che ogni oggetto compila come vuole. Il valore dell'attributo e' deciso dal singolo oggetto (i valori possono essere diversi nei vari oggetti).

Stato di un oggetto = suoi valori correnti degli attributi.

Attributo di classe = casella pre-compilata nella matrice di stampa (es. potrei aver pre-compilato l'anno accademico 2006-7). Il valore dell'attributo e' deciso dalla classe (stesso valore nei vari oggetti).
Quando la classe lo cambia, cambia automaticamente in tutti gli oggetti (qui paragone con la scheda stampata non regge piu').

Attributi e metodi

Una classe e' piu' di quello che ho detto.

Classe =

In linguaggio non o.o., i tipi definiscono dati "inerti". Fuori dai dati esistono le funzioni che agiscono su di essi.

In linguaggio o.o., le classi definiscono dati "attivi". Gli oggetti fanno da soli le operazioni su se stessi.

Esempio:
Non o.o.: operazione che presa una scheda e un nome, lo scrive sulla scheda nella casella del nome.
O.o.: operazione della scheda che preso un nome, lo scrive su se stessa nella casella del nome.

La scheda non ha bisogno di qualcuno che la compili, si compila da sola!

O.O. come metafora del mondo reale

Nello zoo di pezza (linguaggio non o.o.) ci sono pupazzi degli animali, qualcuno li manovra per fare cose con loro.

Nel mondo reale (linguaggio o.o.) ci sono animali che sanno fare cose da soli, qualcuno glielo comanda mandando loro messaggi.

Il primo linguaggio o.o. (SmallTalk, anni '80) nato assieme alle prime interfacce iconiche MacIntosh, usa il termine "messaggi" invece che "metodi". Per eseguire un'operazione si manda un messaggio a un oggetto.

Modularita', estendibilita', riusabilita' del sw

Classi come moduli

Una classe prevede certe operazioni per i suoi oggetti. Tranne quelle operazioni, non se ne possono fare altre.
Classe analoga a modulo sw da prendere a "scatola chiusa". Si puo' usare cio' che sta dentro la scatola solo tramite i metodi previsti dalla classe: incapsulazione.

Classi e sottoclassi

Un modulo essere scritto riutilizzando un altro modulo.

Modulo pre-esistente = superclasse
Modulo nuovo = sottoclasse

Le caratteristiche (attributi e metodi) della sottoclasse sono un sopra-insieme di quelle della superclasse.
Viceversa gli oggetti della sottoclasse sono un sotto-insieme di quelli della superclasse.

Un oggetto istanza della sottoclasse puo' essere visto ed usato anche come oggetto della superclasse: possiede tutte le caratteristiche degli oggetti della superclasse piu' altre proprie della sottoclasse, basta "dimenticare" queste ultime.
Tuttavia, per i metodi la cui implementazione e' stata modificata, viene sempre presa l'implementazione della classe piu' specifica a cui l'oggetto appartiene (cioe' la sottoclasse).