Negli ultimi tempi si è affermata la programmazione orientata agli oggetti. Vorrei sapere in quali casi è opportuno ricorrere a questi linguaggi di programmazione, e quali sono i vantaggi (ed eventualmente, gli svantaggi) che si possono ottenere rispetto ai linguaggi procedurali tradizionali.

Innanzitutto vorrei premettere che i linguaggi di programmazione “Orientati
agli Oggetti” (OO) sono quasi tutti di tipo procedurale esattamente come
quelli più tradizionali. I più diffusi linguaggi di questo
tipo sono C++ e Java, ma per quasi tutti i linguaggi esistenti
sono state proposte “estensioni” di tipo OO.

Lo scopo essenziale dei linguaggi di programmazione, di qualunque tipo,
consiste nel fornire al programmatore strumenti di “astrazione” che consentano
di esprimere nel modo più efficace possibile il funzionamento di
un programma. Ad esempio tutti i linguaggi di programmazione hanno il
concetto di “variabile”, ovvero un “oggetto” dotato di nome al quale possono
essere assegnati valori diversi nel corso del programma e che può
comparire in “espressioni”. In questo caso il linguaggio di programmazione
“maschera” al programmatore il fatto che una variabile sia memorizzata
in un particolare punto della memoria e che le operazioni su essa definite
siano effettuate da particolari porzioni del codice del programma; il
programmatore, nello scrivere il programma, farà sempre riferimento
alla variabile con un nome da lui scelto, magari tale da ricordare il
significato della variabile o il suo particolare uso nel programma.

Uno degli strumenti di astrazione più utili che non a caso si
trova in tutti i linguaggi di programmazione magari sotto nomi diversi,
è il “sottoprogramma” che consiste, nella sua forma più
generale, in un blocco di codice che svolge una funzione ben definita
al quale viene assegnato un nome e che nel resto del programma viene utilizzato
usando appunto quel nome. Il risultato che si ottiene con questa tecnica
è che nello scrivere il programma (o nel rileggerlo per comprenderlo)
un insieme anche complesso di operazioni compare sotto un nome che ne
evidenzia la funzione complessiva senza “distrarre” con i dettagli relativi
a come tale funzione viene effettivamente realizzata dal sottoprogramma.

Consideriamo ad esempio un programma che debba in un certo momento ordinare
per ordine alfabetico un vettore di stringhe di caratteri. Se si predispone
un sottoprogramma che svolga tale funzione, nel punto in cui tale funzione
viene usata effettivamente comparirà una “chiamata a sottoprogramma”
del tipo:

sort(vettore)

Ciò che è importante per comprendere il funzionamento del
programma è sapere che, a questo punto, il vettore viene ordinato
in ordine alfabetico, non certo tutti i particolari passaggi necessari per
effettuare tale ordinamento utilizzando le istruzioni elementari del linguaggio
di programmazione.

I linguaggi OO si caratterizzano per l’aver introdotto alcuni concetti
di astrazione assai potenti, rispetto a quelli disponibili prima. In particolare
sono stati introdotti i concetti di Oggetto e di Classe
che cercherò di spiegare sotto (i due concetti sono talvolta fra
loro confusi, io mi atterrò al significato che mi sembra più
utile alla comprensione).

Una classe, nella terminologia dei linguaggi OO, è sostanzialmente
la definizione di una struttura di dati, ovvero di un insieme di variabili
fra loro strettamente collegate, e delle operazioni che su tali dati possono
essere svolte (dette “metodi”). I metodi corrispondono sostanzialmente
ai sottoprogrammi della terminologia classica. Ogni classe ha un particolare
metodo detto “costruttore” che ha lo scopo di creare un “oggetto” di quella
classe.

Un oggetto è un particolare elemento di una classe che
viene creato all’interno di un programma per essere poi utilizzato mediante
i metodi che la classe definisce. Si dice anche che un oggetto è
una istanza di una classe.

Ad esempio in molti linguaggi di programmazione OO tutte le entità
sono oggetti, anche quelle che sono comuni nei linguaggi più tradizionali;
ad esempio per poter utilizzare una variabile in doppia precisione all’interno
del programma, dovrà prima essere creato un oggetto di tipo “variabile
doppia precisione” creando un’istanza della classe (in questo caso si
presuppone che la classe sia predefinita dal linguaggio e non debba essere
definita dal programmatore in quanto si tratta di funzioni elementari)
in modo che poi tale oggetto possa essere usato mediante i suoi metodi.
I metodi definiti per la classe dell’esempio saranno ovviamente quelli
che consentono di assegnare un valore all’oggetto “variabile”, efffettuare
somme, sottrazioni, ecc.

I vantaggi di questo tipo di “astrazioni” sono molti ma occorrerebbe
molto spazio per presentarli in modo utile alla comprensione, mi limito
quindi a citare pochi altri concetti rimandando alla bibliografia citata
in fondo per gli approfondimenti.

Fra i concetti introdotti nei linguaggi OO sono importanti particolarmente:

  • Ereditarietà, ovvero i meccanismi per creare nuove
    classi a partire da quelle già definite. La classe derivata ha
    tutte le caratteristiche (strutture dati e metodi) della classe antenata,
    più altre aggiuntive. Questo meccanismo favorisce la riusabilità
    del codice perché consente di utilizzare funzionalità
    di una classe già definita per una nuova classe più “specializzata”.
  • Incapsulamento; un oggetto può basare il suo funzionamento
    su variabili interne (dette “private”) che in nessun caso possono essere
    modificate dal programma che utilizza l’oggetto se non tramite i metodi
    definiti. Questa funzionalità aumenta l’affidabilità dei
    programmi rispetto agli errori di programmazione.
  • Mascheratura dell’implementazione; Gli oggetti di una classe
    sono completamente ed esclusivamente definiti dalla definizione della
    classe. Non è necessario conoscere il modo in cui sono implementati
    (ovvero il codice che definisce i metodi e le variabili private) per
    poterli usare. Questa caratteristica facilita l’aggiornamento di alcune
    caratteristiche di una classe (ad esempio per aumentare l’efficienza)
    senza costringere a modificare il programma che usa la classe.

Non mi risulta che le tecniche di programmazione ad oggetti abbiano particolari
svantaggi. L’unico appunto che viene talvolta fatto riguarda la “verbosità”
dei linguaggi OO, ma si tratta di un aspetto che diviene sempre più
trascurabile all’aumentare della complessità dei programmi.

Bibliografia:

La bibliografia sull’argomento è sterminata. Riporto solo alcuni
titoli di testi e qualche URL con articoli di tipo “tutorial”, tutti in
italiano.

Libri:

  • Coad Peter; Nicola Jill. “OOP. Programmazione dei sistemi orientati
    agli oggetti”. Jackson Libri
  • Cox Brad Jeff. “Programmazione orientata agli oggetti”. Addison Wesley
    Longman Italia
  • Wu C. Thomas “Introduzione alla programmazione a oggetti in Java”.
    McGraw-Hill Libri Italia
  • Dorbolò Daniela; Frosini Graziano; Lazzerini Beatrice “Programmazione
    a oggetti con riferimento al C”. Franco Angeli

URL: