|
|
|
|
Il materiale utilizzato per questa lezione è il
capitolo dell'Horstmann
intitolato "Progettazione Orientata agli
oggetti", scaricabile qui ProgOO_Java2.pdf.
Argomenti affrontati:
|
|
|
|
|
Tutte le esercitazioni che abbiamo svolto riguardavano la soluzione di
piccoli problemi mirati a fare acquisire dimestichezza con le
primitive del linguaggio e con un corretto stile di
programmazione. L'esercitazione vi vedeva occupati soprattutto a
digitare codice sorgente e correggere errori.
Per realizzare con successo un "vero" sistema software, oltre alla programmazione è indispensabile un certo impegno per la pianificazione, la progettazione e il collaudo, tutte fasi che finora abbiamo limitato o addirittura trascurato. Per esempio, nel caso di progetti di grandi dimensioni, la quantità di tempo dedicata alla pianificazione dovrebbe superare di gran lunga il tempo impiegato nella programmazione e per il collaudo: carta e penna al posto di video e tastiera. Anche in progetti di dimensioni minori (come quelli che verranno assegnati a conclusione del corso), procedendo in modo sistematico potreste evitare errori e risparmiare tempo prezioso. |
|
|
|
Molti ingegneri del software scompongono il processo di sviluppo nelle
seguenti cinque fasi (tralasciando le fasi di assistenza sul
prodotto e di ritiro dal mercato quando il prodotto diviene obsoleto):
La dipendenza causale tra queste fasi è evidente (modello a cascata), ma nella pratica difficilmente una fase può considerarsi del tutto chiusa prima di passare alla successiva: Per esempio, collaudi disastrosi potrebbero implicare la riprogettazione del sistema. Il modello a spirale sfrutta la costruzione di prototipi via via più completi e raffinati. |
|
|
|
|
Nella professione di programmatore (ma non solo) imparare a lavorare
bene in gruppo conta quasi quanto la competenza tecnica, perché
ogni progetto veramente importante trascende le capacità di
qualunque singolo programmatore.
Allo stesso modo, una buona progettazione è indispensabile per portare avanti un lavoro svolto da un team di programmatori. In questi casi anche l'aggiornamento costante di tutta la documentazione di riferimento e più in generale la comunicazione tra gli sviluppatori diviene cruciale. Supponiamo che un certo programmatore, Paolo Rossi, sia in grado di realizzare e collaudare 100 metodi al mese. (Questa è una stima parecchio generosa: sono pochi i programmatori così produttivi.) Supponiamo che un progetto di medie dimensioni richieda 10.000 metodi. Allora Paolo avrebbe bisogno di 100 mesi per portare a termine il lavoro (si parlerebbe di un progetto da 100 mesi/uomo). Ma attenzione! Il concetto di mese/uomo è un mito: Mesi e programmatori non sono intercambiabili. Cento programmatori non riuscirebbero a finire il lavoro in un solo mese per mancanza di conoscenza sulle attività degli altri colleghi. Anche solo dieci programmatori probabilmente non riuscirebbero a completarlo in 10 mesi:
|
|
|
|
Data una certa attività da
realizzare, il processo di progettazione orientato agli oggetti
comprende sostanzialmente le le seguenti operazioni:
Nella fase di implementazione ricordate anche di utilizzare da subito javadoc per documentare le vostre classi, anche se si tratta solo di prototipi. |
|
|
|
| Vediamo come sia possibile applicare questi concetti su un esempio specifico.
REQUISITI Questo programma ha lo scopo di stampare una fattura. Una fattura descrive la somma dovuta per un insieme di prodotti con le rispettive quantità. (Trascuriamo aspetti complessi quali le date, le imposte e i codici della fattura e dei clienti.) Il programma deve stampare l'indirizzo di chi deve pagare, l'elenco degli articoli e l'importo da pagare. Ciascuna linea che descrive un articolo ne contiene la descrizione e il prezzo unitario, nonché la quantità ordinata e il prezzo totale.
Per semplicità, non forniremo alcuna interfaccia utente, ma predisporremo un programma di prova che aggiunge articoli alla fattura e la stampa. |
|
|
|
| Come prima cosa dobbiamo individuare le classi utili.
Cerchiamo i sostantivi all'interno della formulazione del problema: REQUISITI Questo programma ha lo scopo di stampare una fattura. Una fattura descrive la somma dovuta per un insieme di prodotti con le rispettive quantità. (Trascuriamo aspetti complessi quali le date, le imposte e i codici della fattura e dei clienti.) Il programma deve stampare l'indirizzo di chi deve pagare, l'elenco degli articoli e l'importo da pagare. Ciascuna linea che descrive un articolo ne contiene la descrizione e il prezzo unitario, nonché la quantità ordinata e il prezzo totale. Per semplicità, non forniremo alcuna interfaccia utente, ma predisporremo un programma di prova che aggiunge articoli alla fattura e la stampa. Fattura, Indirizzo, Articolo (della fattura), Prodotto, Descrizione, Prezzo (unitario), Quantità, (prezzo) Totale, Somma (complessiva) |
|
|
|
|
Alcuni dei sostantivi rappresentano valori, non oggetti:
Fattura, Indirizzo, Articolo (della fattura), Prodotto, Descrizione, Prezzo (unitario), Quantità, (prezzo) Totale, Somma (complessiva) Restiamo con quattro candidati per le classi: Fattura, Indirizzo, Articolo (della fattura), Prodotto. Ciascuno di loro rappresenta un concetto utile, quindi facciamoli diventare tutti classi. |
|
|
|
|
Adesso dobbiamo determinare il comportamento di ciascuna classe.
Cerchiamo i verbi all'interno della formulazione del problema: REQUISITI Questo programma ha lo scopo di stampare una fattura. Una fattura descrive la somma dovuta per un insieme di prodotti con le rispettive quantità. (Trascuriamo aspetti complessi quali le date, le imposte e i codici della fattura e dei clienti.) Il programma deve stampare l'indirizzo di chi deve pagare, l'elenco degli articoli e l'importo da pagare. Ciascuna linea che descrive un articolo ne contiene la descrizione e il prezzo unitario, nonché la quantità ordinata e il prezzo totale. Per semplicità, non forniremo alcuna interfaccia utente, ma predisporremo un programma di prova che aggiunge articoli alla fattura e la stampa. Queste attività sono troppo astratte, dobbiamo raffinarle:
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
Le relazioni di dipendenza si ricavano dalla colonna delle
collaborazioni nelle schede CRC: Ciascuna classe dipende dalle
classi con le quali collabora.
Nel nostro esempio:
Ma come fa una fattura a conoscere l'indirizzo, gli articoli e i prodotti con cui collabora? Non è che queste dipendenze sono in realtà associazioni?
In questo esempio non emerge nessuna relazione di ereditarietà. Come esercizio, completate l'esempio della fattura implementando le classi prima di guardare la soluzione proposta da Horstmann. |