  |
Le classi implementano il principio dell'incapsulazione |

Esaminiamo adesso come si realizza praticamente ed effettivamente
un oggetto. Come abbiamo già detto una classe è il modello di un oggetto,
ne definisce il tipo e dice cosa contiene e come si deve comportare
l'oggetto in risposta alle richieste dall'esterno (le chiamate dei metodi).
  |
i campi reppresentano lo stato interno di un oggetto |
Nella programmazione ad oggetti i dati non sono esposti al pubblico come
nella tradizionale programmazione strutturata. Infatti quando si programma
in linguaggi come il pascal classico si hanno "strutture dati" che
vengono gestiti da "algoritmi". Ricordiamo infatti che il famoso
libro di Wirth che è uno dei capisaldi della storia dell'informatica
(e che presenta il linguaggio Pascal) si intitolava: "Algoritmi + Strutture Dati
= Programmi". Nella programmazione ad oggetti le strutture dati sono invece
un dettaglio, che non deve essere reso noto ma protetto dall'esterno per evitare
che qualcuno possa maniporarlo in maniera scorretta. Le informazioni contenute
in un oggetto sono racchiuse al suo interno, nelle sue strutture dati che
rappresentano appunto l'informazione riservata "incapsulata".
  |
i metodi permettono di cambiare lo stato in modo controllato |
Ovviamente un programma per funzionare deve poter modificare le strutture dati.
La programmazione ad oggetti non nega che l'algoritmo deve agire sulle strutture
dati. Pretende però che si dica una volta e per tutte quali sono gli algoritmi
e su quali strutture dati agiscono. Notare che nememeno gli algoritmi
sono pubblici: anche essi rappresentano un dettaglio implementativo che viene
nascosto all'esterno. L'utilizzatore potrà solamente invocare i metodi di
un oggetto. Il fatto che i metodi siano i soli a poter accedere alle strutture
dati garantisce che l'oggetto modifichi il suo stato interno in modo
controllato e prevedibile. Pensiamo ad uno stack: siccome gli unici modi
che ho per modificarlo sono i metodi push e pop, se implemento correttamente
gli algoritmi sono messo al sicuro da situazion
in cui per esempio il contatore di elementi non coincida con il numero di
elementi effettivamente presenti nello stack.
  |
i costruttori inizializzano l'oggetto in uno stato noto |
Quindi, io creo uno stack vuoto. Poi aggiungo un elemento con push. Di
conseguenza ho uno stack con un elemento. Da qui posso svuotarlo con pop
o aggiungere un altro elemento con push. Come si vede l'oggetto si muove entro
dei binari ben predefiniti. L'ultimo elemento che rimane da aggiungere al
tassello è appunto la creazione di cui ne abbiamo parlato. Serve per definire
e creare nuovi oggetti, ed è un concetto importante quanto quello di metodo
o di campo. In programmazione a oggetti, si chiamano costruttori le funzioni
che vengono invocate per inizializzare un oggetto. I costruttori in un certo
senso sono metodi, ma sono metodi speciali. Infatti non necessitano di un
oggetto per essere utilizzati (a differenza dei metodi veri e propri) e
come risultato della loro invocazione creano un nuovo oggetto.
|