Nel seguente esempio il modulo “prodotto” esporta il tipo Prodotto sul quale sono fornite le funzionalità di inserimento e visualizzazione dei dati.
Mostra codice Mostra codice Mostra codiceIl modulo utente utilizza il tipo Prodotto e accede ai campi codice, descrizione e quantità mediante le funzionalità di inserimento e visualizzazione espostate all'interfaccia del modulo, ma nulla gli vieta di accedere e manipolare direttamente i singoli campi, come infatti viene fatto modificando e visualizzando il campo quantità del prodotto p1.
L’utente (cliente) fa uso delle funzionalità offerte per realizzare procedure di un’applicazione o per costruire operazioni su dati più complessi
Il progettista e l’implementatore devono realizzare le astrazioni e le funzionalità previste per il dato facendo uso di un linguaggio di programmazione o appoggiandosi sulle primitive di un altro tipo di dato già disponibile.
→ Un progettista o implementatore può essere il cliente di un altro tipo di dato astratto.
Al fine di poter incapsulare effettivamente una struttura dati il linguaggio di programmazione deve fornire opportuni meccanismi a supporto.
Il C++ fornisce meccanismi di incapsulamento a due diversi livelli:
Il primo meccanismo è stato introdotto per alleviare il problema che deriva da possibili conflitti tra nomi.
il secondo meccanismo è quello che consente di realizzare tipi di dati astratti, come definiti in questa lezione.
Studieremo entrambi i meccanismi di incapsulamento più avanti in questo corso.
In questa lezione. e nella prossima. vedremo invece come realizzare alcune strutture dati classiche adottando un opportuno stile di programmazione, così come abbiamo sviluppato il tipo “Prodotto” nell’esempio.
Facendo uso dei concetti di programmazione modulare già introdotti, realizzeremo tali strutture e le funzioni che ne consentono un corretto utilizzo
L’utente – pur potendo accedere alla struttura dati – “si impegna” ad utilizzare esclusivamente le funzionalità esportate dal modulo fornitogli.
Per “politica di accesso” intendiamo le eventuali restrizioni sulle modalità di accesso agli elementi:
Sulle liste considereremo qui le seguenti:
Le operazioni che vengono generalmente effettuate su una lista – compatibilmente con la politica di accesso su di essa eventualmente definita – sono:
Si noti che i controlli (lista piena e lista vuota) e la Ricerca sono necessari anche alla verifica delle opportune precondizioni: non è possibile infatti inserire un elemento in una lista a capacità limitata se la lista è piena, nè è possibile eliminare un elemento se la lista è vuota. Non è possibile eliminare un elemento specifico da una lista se l’elemento in questione non è presente nella lista.
Particolarizzando l’elenco ai diversi casi di modalità di accesso qui considerate, abbiamo la tabella mostrata in figura, che specifica le funzionalità generalmente offerte sulle strutture dati classiche (la casella vuota non indica una impossibilità).
Le operazioni di creazione e distruzione si riferiscono alla eventuale allocazione dinamica della memoria necessaria e alla sua relativa deallocazione. La loro necessità dipende quindi dalla modalità di rappresentazione della struttura dati.
Nella prossima lezione svilupperemo una esercitazione nella quale realizzeremo le strutture dati Pila e Coda.
La loro realizzazione verrà mostrata utilizzando le seguenti rappresentazioni:
Utilizzeremo ancora un approccio modulare ipotizzando -come si è già detto- una opportuna disciplina di programmazione da parte dell’utente, rimandando l’utilizzo dei meccanismi di incapsulamento alla parte del corso dedicata alla Programmazione Orientata agli Oggetti.
In una successiva lezione verranno introdotte le liste dinamiche rappresentate mediante catene di puntatori.
1. Strutture e typedef. Record in C/C++: Concetti Base
4. Puntatori a tipi di dato strutturati. Allocazione Dinamica
5. Puntatori: aspetti avanzati
7. Asserzioni
8. Gestione delle eccezioni. Concetti base
9. Programmazione modulare: concetti base
10. Programmazione Modulare: Meccanismi e Strumenti a supporto in C/C++
12. Esercitazione: Strutture Dati Pila e Coda
13. Esercitazione. Strutture Dati: Lista Concatenata
14. Meccanismi di Incapsulamento in C++ Namespaces
15. Programmazione orientata agli oggetti. Introduzione
Fondamenti di Informatica vol. II: parte prima, capitolo 2 (tutto).