Nella progettazione di un sistema software è opportuno adoperare dei criteri di astrazione per dominare la complessità del sistema da realizzare.

I tipi di astrazione più diffusi sono:

ASTRAZIONE SUL CONTROLLO:
consiste nell'astrarre una data funzionalità dai dettagli della sua implementazione; è ben supportata dai linguaggi di programmazione tradizionali tramite il concetto di sottoprogramma (procedura o funzione).

ASTRAZIONE SUI DATI:
consiste nell'astrarre le entità (oggetti) costituenti il sistema, descritte in termini di una struttura dati e delle operazioni possibili su di essa.

Il concetto di tipo di dato in un linguaggio di programmazione tradizionale è quello di insieme dei valori che può assumere una informazione (una variabile). Il tipo di dati astratto (ADT) estende questa definizione, includendo anche l'insieme di tutte e sole le operazioni possibili su dati di quel tipo. La struttura dati è incapsulata nelle operazioni su di essa definite.

 

Tipo di dati astratto

Un tipo di dato astratto (ADT) è un modello matematico consistente in una collezione di valori assieme ad una collezione di operazioni definite sul modello. Gli ADT generalizzano i tipi di dato primitivi (interi, reali, etc.), mentre le procedure generalizzano le operazioni primitive (+, -, ...).

Nei linguaggi tradizionali (ad es., in C) è spesso possibile adottare una metodologia basata sugli oggetti, adoperando una opportuna disciplina di programmazione, aderendo cioè ad un insieme di regole, il cui uso però non può essere forzato nè verificato dal compilatore.

Un linguaggio di programmazione supporta invece direttamente tecniche di sviluppo software basate sugli oggetti se offre meccanismi espliciti per la definizione di entità (oggetti) che incapsulano una struttura dati nelle operazioni possibili su di essa. Alcuni linguaggi, in particolare il C++, estendono tali meccanismi nella direzione della tipizzazione dei dati, offrendo la possibilità di definire istanze (cioè, variabili) di un dato tipo astratto. In tal caso il linguaggio basato sugli oggetti presenta costrutti per la definizione di classi ed oggetto. Una classe è una implementazione di un tipo di dati astratto. Un oggetto può essere riguardato come una istanza di una classe.

La programmazione orientata agli oggetti (OOP, object-oriented programming) è intimamente connessa a tecniche di sviluppo di tipo ``bottom-up''. La metodologia ``bottom-up'' mira all'individuazione delle entità astratte (oggetti) facenti parte del sistema, delle loro proprietà e delle interrelazioni tra di esse. Tale approccio favorisce il riuso attraverso l'individuazione di entità corrispondenti a componenti già esistenti. Al limite, una nuova applicazione può essere costruita a partire da componenti esistenti, opportunamente assemblati.

La programmazione tradizionale si fonda invece su metodologie tipicamente ``top-down'', basate su un approccio di decomposizione funzionale nella definizione del sistema software, cioè sull'individuazione delle funzionalità del sistema da realizzare e su raffinamenti successivi, da iterare finchè la scomposizione del sistema individua sottosistemi di complessità accettabile.

Rispetto alla programmazione tradizionale, la programmazione orientata agli oggetti offre vantaggi in termini di:

  • modularità: le classi sono i moduli del sistema software;
  • coesione dei moduli: una classe è un componente software ben coeso in quanto rappresentazione di una unica entità;
  • disaccoppiamento dei moduli: gli oggetti hanno un alto grado di disaccoppiamento in quanto i metodi operano sulla struttura dati interna ad un oggetto; il sistema complessivo viene costruito componendo operazioni sugli oggetti;
  • riuso: l'ereditarietà consente di riusare la definizione di una classe nel definire nuove (sotto)classi; inoltre è possibile costruire librerie di definizioni di classi raggruppate per tipologia di applicazioni;
  • information hiding: sia le strutture dati che gli algoritmi possono essere nascosti alla visibilità dall'esterno di un oggetto;
  • estensibilità: l'ereditarietà, il polimorfismo ed il binding dinamico agevolano l'aggiunta di nuove funzionalità, minimizzando le modifiche necessarie al sistema esistente quando si vuole estenderlo.

La programmazione ad oggetti si basa sui seguenti concetti:

  • Classe
  • Oggetto
  • Ereditarietà
  • Polimorfismo
  • "Binding" dinamico

In particolare, questi ultimi tre concetti caratterizzano la programmazione orientata agli oggetti rispetto a quella basata sugli oggetti.