Prendiamo come esempio una applicazione classica: quella che permette di scrivere un documento di testo. Cerchiamo di descrivere i passi che costituiscono tale applicazione.
Supponiamo che si stia digitando un documento di testo, utilizzando qualche famoso editor di testi, come Microsoft Word, ad esempio. L'utente ha due possibilità iniziali:
- Cominciare a scrivere un nuovo documento
- Aprire un documento esistente
Il testo da scrivere, ovviamente, verrà digitato tramite l'utilizzo della tastiera.
Ogni documento è composto di svariate pagine, e ogni pagina, a sua volta, è composta da una testata, dal corpo del documento e da un piè di pagina. Nella intestazione e nel piè di pagina è possibile aggiungere la data, l'ora, il numero di pagina, la collocazione del file, ecc.
Il corpo del documento è formato da frasi. Le frasi, a loro volta, sono composte da parole e segni di punteggiatura. Le parole sono formate da lettere, numeri e/o caratteri speciali. Inoltre,. Vi è la possibilità di aggiungere delle immagini e delle tabelle nel documento. Le tabelle sono costituite da righe e colonne ed ogni cella di una tabella può contenere del testo o delle immagini.
Dopo aver terminato il documento, l'utente può scegliere di salvarlo o stamparlo.
Abbiamo in tal modo descritto, in maniera semplificata ma congruente, il processo di creazione di un documento tramite Microsoft Word. Rifacendoci a quanto già detto nella guida circa l'intervista con il cliente, siamo in grado, allora, di estrarre la seguente lista di parole chiave:
documento
, editor di documenti, Microsoft Word, testo
, tastiera, intestazione, piè pagina, corpo del documento, data, ora, numero di pagina, collocazione del file, pagina, frase, parola, segno di punteggiatura, lettera, numero, carattere speciale, immagine, tabella, riga, colonna, cella, utente.
Potremmo dire che le parole chiave evidenziate in blu sono sicuramente candidate a diventare classi o attributi per il modello da sviluppare.
Come è possibile osservare, nell'esempio descritto l'oggetto attorno a cui ruoto un po' tutto il discorso è il Documento. Per tale ragione, sarà una buona idea identificare nel Documento la classe centrale del nostro Class Diagram.
Un documento, come detto, può avere svariate pagine e, quindi, potremo definire un attributo: numeroDiPagine che descrive tale caratteristica. Invece, per le operazioni, sarà bene definire i metodi:
Apri( ), Salva( ), Stampa( ),Nuovo( ).
Si è detto, poi, che ogni documento è composto di pagine. La Pagina sarà, dunque, un buon candidato per essere una classe del nostro diagramma.
La Classe Pagina conterrà un attributo : numeroDiPagina, che identificherà il numero della pagina dell'oggetto, e le seguenti operazioni: nuovaPagina(), nascondiIntestazione() e nascondiPièdiPagina().
I metodi per la testata e il piè di pagina ci fanno intendere che è bene definire altre due classi: Intestazione e PiePagina.
Tali classi hanno i seguenti attributi in comune: data, ora, numeroDiPagina e pathFile. Tali attributi sono opzionali per ogni intestazione o pie' di pagina e l'utente potrà configurarli a suo piacimento.
La somiglianza tra Intestazione e PièPagina ci spinge a definire ancora una nuova classe che sia in comune alle due appena descritte. è qui che utilizziamo il concetto di ereditarietà che abbiamo definito in precedenza.
La classe padre sarà BottomUp (questo nome è scelto perché le intestazioni e i piè di pagina appaiono, rispettivamente, nella parte alta e bassa di ogni pagina del documento) e conterrà gli attributi che sono in comune alle classi Intestazione e PiePagina oltre alle operazioni (anch'esse in comune) : visualizza(), modifica() e nascondi().
Le classi Intestazione e PiePagina (figlie di BottomUp) avranno la necessità, quindi, di definire, rispettivamente, soltanto le operazioni: nuovaIntestazione() e nuovoPiePagina().
Prima di passare ad esaminare il corpo del documento o il testo, diamo uno sguardo alla definizione dei componenti di un testo. Come detto, il testo del documento è composto di frasi. Le frasi, a loro volta, sono composte di parole e le parole sono formate da caratteri. Se le parole sono, dunque, array di caratteri e le frasi sono identificabili come array di parole, allora una frase è anche (per una sorta di proprietà transitiva) un array di caratteri.
Quindi, il corpo di un documento può essere descritto come un array di caratteri. Per tale ragione, per descrivere il testo di un documento faremo uso della classe Carattere con alcune sottoclassi.
La classe Carattere avrà gli attributi: codiceASCII e tipo (il tipo ci informa sulla tipologia di carattere, ovvero se esso è in formato normale, corsivo, grassetto o sottolineato) e definirà le operazioni: Normale(), Corsivo(), Grassetto() e Sottolineato().
Come discendenti della classe Carattere definiremo poi: Lettera, SegnoDiPunteggiatura, CarattereSpeciale e Numero.
Inoltre, nel corpo del documento, come detto, possono comparire tabelle o immagini. Entrambe costituiranno altre due nuove classi nel nostro diagramma.
La Classe Tabella contiene gli attributi numeroDiRighe e numeroDiColonne e definisce le operazioni inserisciRiga( ) e inserisciColonna( ).
Ogni tabella consiste di una o più celle e, come già detto, in ogni cella è possibile che compaiano testo o immagini.
Dovremmo essere ad un buon punto per iniziare a mettere insieme tutti i tasselli finora definiti. Utilizzando le associazioni tra le classi che abbiamo descritto otterremo dunque il seguente Class Diagram che descrive il nostro esempio:
è importante rendersi conto che il diagramma precedente non costituisce la massima descrizione in dettaglio per un processo di scrittura di un documento di testo.
Il modello descritto potrà essere specializzato sempre di più e, quindi, crescere in modo appropriato per poter consentire un appropriato lavoro di analisi e disegno.