La OOP nasce con lo scopo preciso di simulare e modellare la realtà nei linguaggi di programmazione
Nella OOP non si fa differenza fra valori ed operazioni: si parla di Tipo di dato che ingloba le due entità in un’unica struttura. Quindi è necessario definire nuovi Tipi di dato ed accedere ai suoi valori in lettura o in modifica: questo è fattibile tramite il meccanismo di incapsulamento.
Un altro cardine della OOP è il riuso del codice: cioé utilizzare del codice esistente per poterlo specializzare.
Il polimorfismo è un'altra caratteristica dei linguaggi OOP: gli oggetti devono poter avere forma diversa.
Sviluppato allo Xerox PARC da Alan Kay, Dan Ingalls, Ted Kaehler, Adele Goldberg, e altri durante gli anni settanta, Smalltalk ha pesantemente influenzato altri linguaggi come Objective C, C#, Actor, Java, JavaScript e Ruby. Molti concetti attualmente impiegati nello sviluppo del software (es. design patterns, extreme programming, refactoring) derivano dalla comunità Smalltalk.
Smalltalk ha rappresentato un autentico cambio di paradigma rispetto al tradizionale modello procedurale, sostituendo al paradigma tradizionale di Von Neumann (basato sulla separazione dati/programmi) un nuovo paradigma basato sul concetto di oggetto, che contiene, in modo inscindibile, sia dati che programmi.
L'elaborazione quindi non è più descritta da una procedura, ma è ottenuta da una "simulazione" del mondo, di cui gli oggetti sono un modello.
- Definire nuovi tipi di dati.
- Incapsulare i valori e le operazioni.
- Riusare il codice esistente.
- Supportare il polimorfismo.
-
un oggetto è una istanza di una classe.
-
un oggetto deve essere conforme alla descrizione di una classe.
-
un oggetto è contraddistinto da:
- attributi;
- metodi;
- identità;
-
un oggetto non deve mai manipolare direttamente i dati di un altro oggetto
-
la classe è una entità statica cioè a tempo di compilazione;
-
l’oggetto è una entità dinamica cioè a tempo di esecuzione (run time);
- i dati (o attributi)
- contengono le informazioni di un oggetto;
- le operazioni (o metodi)
- consentono di leggere/scrivere gli attributi di un oggetto;
-
La classe rappresenta la descrizione di un oggetto, contiene le definizioni di proprietà e metodi dell'oggetto che rappresenta.
-
La classe consente di implementare gli ADT attraverso il meccanismo di incapsulamento.
-
i dati devono rimanere privati insieme all’implementazione
-
solo l’interfaccia delle operazioni è resa pubblica all’esterno della classe.
- uso: una classe può usare oggetti di un’altra classe;
- aggregazione: una classe può avere oggetti di un’altra classe;
- ereditarietà: una classe può estendere un’altra classe.
- L’uso o associazione è la relazione più semplice che intercorre fra due classi.
- Per definizione diciamo che una classe A usa una classe B se:
- un metodo della classe A invia messaggi agli oggetti della classe B , oppure
- un metodo della classe A crea, restituisce, riceve oggetti della classe B .
- una classe A aggrega oggetti di una classe B quando la classe A contiene oggetti della classe B
- è un caso speciale della relazione di uso
- relazione has-a (ha-un)
- riuso del codice
- classe derivata o sottoclasse
- classe base o superclasse
- relazione is-a (è-un)
Consideriamo la classe base B che ha un metodo f(...) e la classe derivata D che eredita da B. La classe D può usare il metodo f(...) in tre modi:
- lo eredita: quindi f(...) può essere usato come se fosse un metodo di D ;
- lo riscrive (override): cioè si da un nuovo significato al metodo riscrivendo la sua implementazione nella classe derivata, in modo che tale metodo esegua una azione diversa;
- lo estende: cioè richiama il metodo f(...) della classe base ed aggiunge altre operazioni.
- Usare l’ereditarietà solo quando il legame fra la classe base e la classe derivata è per sempre, cioè dura per tutta la vita degli oggetti, istanze della classe derivata.
- Se tale legame non è duraturo è meglio usare l’aggregazione al posto della specializzazione.
- La parola polimorfismo deriva dal greco e significa letteralmente molte forme.
- Nella OOP tale termine si riferisce ai metodi: per definizione, il polimorfismo è la capacità di un oggetto, la cui classe fa parte di una gerarchia, di chiamare la versione corretta di un metodo.
- Quindi il polimorfismo è necessario quando si ha una gerarchia di classi.