C++ – Esempi di gestione di file di testo su dischi: i file CSV
Come esempi di applicazione della manipolazione di dati su memorie di massa, viene proposto un programma per la conservazione di dati in un file di tipo CSV, e un programma che si occupa della lettura dei dati così conservati.
I file CSV (Comma Separated Values) sono file, di tipo testo, in cui in ogni riga c’è una registrazione, per esempio i dati di un libro. I dati di tipo stringa (titolo, autore, editore) sono racchiusi fra due caratteri doppio apice, i dati numerici (prezzo) non sono racchiusi fra due caratteri doppio apice. I vari dati del singolo libro sono separati dal carattere virgola, da cui il nome del tipo di file. L’importanza dei file di questo tipo dipende dal fatto che è comune che i programmi che si occupano di gestire dati (programmi di database, tabelloni elettronici) prevedano funzionalità di importa/esporta di dati in file formato CSV e quindi si può utilizzare un semplice programma in C++ per leggerli, elaborarli in qualsiasi modo e riscriverli in modo da poterli rileggere con un applicativo qualsiasi che preveda l’importazione di dati da un file CSV. Anche se l’applicativo che si utilizza non prevede l’elaborazione che serve, questa si può aggiungere scrivendo un opportuno programma in C++. …l’articolo continua »
C++ – Input/Output astratto
In ragione della volatilità della memoria centrale è comune l’esigenza di conservare dati su memorie permanenti e di poter avere la possibilità di rileggerli in futuro. Il sistema di I/O del C++ fornisce il concetto astratto di canale (lo stream). Con tale termine si intende un dispositivo logico indipendente dalla periferica fisica: chi scrive il programma si dovrà occupare dei dati che transitano per il canale prescindendo dalle specifiche del dispositivo fisico che sta usando (un lettore di dischi magnetici, la tastiera, il video). Il termine file si riferisce invece ad una astrazione che è applicata a qualsiasi tipo di dispositivo fisico. In poche parole, si potrebbe affermare che il file rappresenta il modo attraverso il quale l’utilizzatore vede sistemati i dati sul dispositivo di I/O, e che il canale, o flusso, è il modo con cui i dati sono accessibili per l’utilizzazione. …l’articolo continua »
C++ – Interfaccia e implementazione dei metodi di una classe
Negli esempi riportati tutta la definizione della classe è stata inserita in un unico file. In generale, però, il codice di una classe, una volta che questa è definita e testata, varia raramente. Cambiano invece molto spesso i programmi che utilizzano la classe. In progetti di grosse dimensioni ricompilare, ogni volta che si modifica qualcosa, anche parti di codice testate solo per il fatto di essere incluse, produce tempi lunghi di attesa. È per questo motivo che può essere conveniente scindere l’interfaccia della classe (quello che l’utilizzatore ha necessità di conoscere) dall’implementazione dei metodi della classe. …l’articolo continua »
C++ – Utilizzo delle classi template
Se si utilizza la nuova c_libreria4 le modifiche da apportare al programma di gestione prestiti sono molto limitate: …l’articolo continua »
C++ – Le classi modello: i template
Nella stesura dell’ultima versione del programma di gestione prestiti, si è avuta l’esigenza di adattare la classe libreria in modo da contenere oggetti di tipo libSocio e non più di tipo libro per come era stata definita originariamente. Il problema è stato risolto sostituendo brutalmente, nella classe, le ricorrenze di libro con libSocio. È però importante osservare che si trattava, come anche evidenziato, di una soluzione temporanea. La biblioteca potrebbe avere necessità di gestire oltre che libri anche, per esempio, riviste o altro da poter prestare ai propri soci.
In pratica si tratterebbe di avere la possibilità di gestire nello stesso modo cose diverse: aggiungi, estrai, aggiorna, vanno bene perché soddisfano le necessità di gestione dei servizi della biblioteca, ma, come nel mondo reale, questi servizi dovrebbero poter essere applicabili a tutti gli oggetti disponibili nella biblioteca. …l’articolo continua »
C++ – Rivisitazione del programma di gestione prestiti
Nel programma di gestione dei prestiti, per come presentato fino ad ora, si interagisce con oggetti della classe libro, che reagivano in un certo modo, definito dai metodi, ai messaggi inviati. Per esempio, volendo effettuare un prestito, si invia il messaggio prestito() ad un oggetto della classe e questo, risponde modificando un indicatore (il valore conservato nella variabile protetta presente).
Nella programmazione ad oggetti, così come con gli oggetti della vita reale quando si interagisce con essi, se si desidera un effetto diverso basta utilizzare un oggetto diverso. Per esempio se si utilizza una matita per scrivere, qualora si volesse un segno più duraturo, occorrerebbe utilizzare una penna. Parafrasando il modo di esprimersi della OOP, si direbbe che il messaggio inviato all’oggetto resta sempre lo stesso (si sta scrivendo); è l’oggetto che reagisce in modo diverso. Questo è quello che la OOP chiama polimorfismo: caratteristica che consente alle istanze di classi differenti di reagire allo stesso messaggio (una chiamata di funzione) in maniere diverse. …l’articolo continua »
C++ – Ereditarietà: da libro a libSocio
Una delle proprietà più potenti delle classi è la possibilità di definire una nuova classe (classe discendente, subclass) a partire da una classe esistente (classe antenata, superclass). La classe discendente ha tutte le proprietà della classe genitrice e, in più, può avere nuove proprietà o metodi specifici per la nuova classe o, addirittura, può ridefinire i metodi della classe genitrice. Questo meccanismo è quello a cui si fa riferimento quando si parla di ereditarietà.
Questo esposto brevemente è un meccanismo che permette, a partire da una classe generica, di derivare, mediante ereditarietà, classi via via sempre più specializzate: la classe figlia è una specializzazione della classe padre, i comportamenti generali della classe derivata sono quelli della classe genitrice a cui si aggiungono i comportamenti tipici degli oggetti della classe derivata stessa. Per portare un esempio intuitivo si potrebbe dire che la zanzara è un insetto (con tutte le caratteristiche tipiche degli insetti) che punge e succhia il sangue (caratteristiche tipiche della zanzara).
La classe libro, utilizzata precedentemente, definisce i comportamenti generici di un libro, contenuto in una libreria, che può essere prestato. Se però si pensa ad una biblioteca con soci iscritti che usufruiscono dei servizi, l’operazione di prestito, definita nella classe libro, è generica. Non basta, infatti, dire che il libro è in prestito, occorrerebbe, per esempio, avere anche informazioni sul socio che lo ha preso in prestito e l’operazione, per esempio di prestito, riguarda anche la registrazione dei dati del socio che ha preso in prestito il libro. …l’articolo continua »
C++ – Interazione fra oggetti
A questo punto si può riscrivere il programma per la gestione dei prestiti della biblioteca, nel quale interagiranno oggetti di tipo libro ed oggetti di tipo libreria, cominciando dalla funzione main: …l’articolo continua »
C++ – Classe aggregato
Nell’ultimo esempio l’oggetto libro interagiva con una tabella contenente i libri della biblioteca. In pratica la logica di scrittura del programma restava sempre la stessa e i nuovi elementi introdotti (classi ed oggetti) venivano inseriti in quel contesto. Tutto ciò limita fortemente i vantaggi dell’uso di questi nuovi strumenti.
L’esempio proposto aveva principalmente valenza didattica: si trattava di rendere più soft il passaggio ad una nuova concezione di progettazione e sviluppo dei programmi. In realtà il vantaggio maggiore degli oggetti, e la straordinaria diffusione che hanno avuto, è giustificato dal fatto che l’uso di queste nuove tecniche rende più semplice la scrittura dei programmi avvicinandola al nostro modo di risolvere i problemi: il mondo che ci circonda è fatto di oggetti che hanno delle proprie caratteristiche (comportamenti) e che interagiscono tra di loro scambiandosi messaggi (come li chiama la OOP). L’oggetto che riceve il messaggio si comporta in maniera coerente con le azioni legate al messaggio. …l’articolo continua »
C++ – Utilizzo della classe: vettori di oggetti
Il programma proposto, dopo aver caricato in un vettore i libri della biblioteca, visualizza un menù per mezzo del quale si possono gestire alcune operazioni sui libri: …l’articolo continua »
