Concetti Chiave
- L'evoluzione storica dei paradigmi di programmazione include l'organizzazione delle azioni negli anni '50 e l'astrazione procedurale negli anni '60, culminando negli oggetti negli anni '90 con la programmazione orientata agli oggetti (OOP).
- I principali paradigmi di programmazione trattati sono il paradigma imperativo, focalizzato sul comando, e il paradigma OOP, che enfatizza l'oggetto e i dati.
- I linguaggi di programmazione possono essere classificati secondo il loro utilizzo, il paradigma di programmazione supportato e il livello di astrazione, con una distinzione tra linguaggi di basso e alto livello.
- I moduli sono fondamentali nella costruzione di componenti software, fungendo da contenitori sicuri di informazioni e operazioni, e permettendo l'esportazione e l'importazione di risorse.
- Nella programmazione orientata agli oggetti, l'obiettivo ideale è garantire l'inaccessibilità della struttura dati tramite operazioni definite, assicurando separazione tra interfaccia e implementazione.
1.
Evoluzione delle astrazioni
Organizzazione delle azioni (lista istruzioni, anni '50, astrazione sul controllo, calcoli di funzioni matematiche).
2. Astrazione procedurale (sottopgm con parametri, anni '60, programmazione strutturata (Th.di Bohem e Jacopini (1966) e metodologia top-down).
3. Astrazione di dato (anni '70).
4. ADT (anni '80).
5. Oggetti (organizzazione dei dati, anni '90, OOP).
Paradigmi di programmazione
Paradigma imperativo: si basa sul concetto di comando (fa pensare alle azioni).
Paradigma OOP: si basa sul concetto di oggetto (fa pensare ai dati).
- Fortran 1954 - '57: Calcolo numerico Imperativo;
- Lisp 1958: Intelligenza artificiale Dichiarativo;
- Cobol 1959 - '61: Applicazioni gestionali Imperativo;
- Pascal 1970: General purpose Imperativo;
- Prolog 1972: Intelligenza artificiale Logico;
- C 1972 - '78: General purpose.
Smalltalk 1971 - '80: Applicazioni personali Ad oggetti;
C++ 1980 - '83: General purpose Ad oggetti;
Java 1995: General purpose Ad oggetti.
In base al loro utilizzo (cioè l’ambito applicativo per cui sono stati principalmente progettati).
In base al paradigma di programmazione che supportano.
In base al loro livello di astrazione (l. di basso livello (machine oriented) / l. di alto livello (problem oriented).
struct persona{
…i
nt altezza;
int peso;
};
void aggiornaPeso(persona & p, int peso)
{
p.peso = peso;
}
int main()
{
persona pietro;
aggiornaPeso(pietro,2329); //!!!!!!!!!!!
//pietro.peso=2329;
}
Uso dei moduli e protezione dei dati
Possiamo inserire controlli nella procedura aggiornaPeso().
Ma poi è comunque consentito scrivere: pietro.peso=2329;
E’ comunque possibile mantenere una certa disciplina nell’uso dei campi del record.
La OOP, vedremo, incoraggia un uso corretto delle “variabili” che fanno parte degli oggetti.
Il modulo è uno dei costrutti più usati per costruire componenti software. Esso costituisce un contenitore di informazioni
con proprietà di protezione dovute alla possibilità di esportare ed importare (nel senso di usare altri moduli) risorse (costanti, variabili, tipi, procedure/funzioni, ADT, …).
Il modulo in questo caso (libreria) rende visibili un insieme di procedure/funzioni che non fanno uso di variabili non-locali. In questo caso il modulo raccoglie una collezione di operazioni, cioè funge da
libreria. Il classico esempio è quello delle funzioni matematiche.
Il modulo rende visibili un insieme di procedure/funzioni che fanno uso di variabili non
visibili, locali al modulo. In questo caso un modulo realizza un singolo oggetto il cui stato interno (modificabile) è costituito dai dati locali (nascosti) del modulo e reso accessibile solo attraverso le operazioni (procedure/funzioni) definite nell’interfaccia.
Il modulo esporta un identificatore di tipo e un insieme di procedure/funzioni intese come insieme di operazioni eseguibili su oggetti del tipo esportato.
La rappresentazione concreta del tipo è nascosta all’interno del modulo. I clienti definiscono e controllano (il tempo di vita
de) le istanze del tipo che devono essere esplicitamente trasferite come parametro alle operazioni esportate dal modulo.
L’ideale sarebbe:
- garantire l’inaccessibilità alla struttura dati, se non attraverso le operazioni messe a disposizione;
- consentire al cliente di creare tanti oggetti quanti gliene occorrono garantendo inoltre:
1. separazione interfaccia/implementazione;
2. indipendenza dalla rappresentazione.
Soluzione: OOP (classe – oggetti)
Domande da interrogazione
- Qual è l'importanza dell'astrazione nelle diverse fasi dell'evoluzione della programmazione?
- Come si differenziano i paradigmi di programmazione imperativo e OOP?
- Qual è il ruolo dei moduli nella protezione dei dati in programmazione?
- Quali sono i vantaggi dell'uso della programmazione orientata agli oggetti (OOP)?
L'astrazione ha avuto un ruolo cruciale nell'evoluzione della programmazione, partendo dall'organizzazione delle azioni negli anni '50 fino all'oggettualità degli anni '90, permettendo una gestione più efficace e modulare del codice.
Il paradigma imperativo si basa sul concetto di comando e azioni, mentre il paradigma OOP si concentra sugli oggetti e sui dati, promuovendo una gestione più strutturata e modulare delle informazioni.
I moduli fungono da contenitori di informazioni con proprietà di protezione, consentendo di esportare e importare risorse e garantendo che l'accesso ai dati interni avvenga solo tramite operazioni definite nell'interfaccia.
L'OOP incoraggia un uso corretto delle variabili, garantisce l'inaccessibilità alla struttura dati attraverso operazioni definite e promuove la separazione tra interfaccia e implementazione, migliorando la modularità e la manutenibilità del codice.