Professional Documents
Culture Documents
Francesco Sisini
8 Marzo 2008
1
Indice
1 L’approccio ingegneristico 3
1.1 Il processo di sviluppo del software . . . . . . . . . . . . . . 5
1.2 Il piano del progetto . . . . . . . . . . . . . . . . . . . . . . . 5
4 Sviluppo 37
4.1 Requisiti statici . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.2 Requisiti dinamici . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.2.1 progettazione per prototipi . . . . . . . . . . . . . . . 38
4.2.2 Esempio pratico . . . . . . . . . . . . . . . . . . . . . . 39
4.3 Requisiti complessi . . . . . . . . . . . . . . . . . . . . . . . . 39
2
5 I Design Pattern 41
5.1 Il pattern Mode View Controller (MVC) . . . . . . . . . . . . 42
5.2 Le web application ed il MVC . . . . . . . . . . . . . . . . . . . 42
5.2.1 La struttura delle WEB application . . . . . . . . . . . 44
5.2.2 Il pattern MVC per il controllo delle web application 45
5.3 Il pattern MVC in ReadyReport . . . . . . . . . . . . . . . . . 46
5.3.1 Il Model . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.3.2 Controller . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.3.3 View . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6 Verifica e convalida 49
6.1 Cominciare bene . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6.2 Dopo la progettazione e dopo lo sviluppo . . . . . . . . . . . 50
6.3 I test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
7 Omissioni 52
3
Introduzione
Qual’ é la differenza tra la programmazione e lo sviluppo di un sofware? La
programmazione di una macchina consiste nella codifica in un linguaggio
artificiale di un dato algoritmo. Quando un programmatore si dedica al-
la programmazione ha normalmente giá chiaro l’algoritmo e la sua attivitá
si concentra nell’individuarne la migliore implementazione nel linguaggio
scelto. Si puó affermare che la programmazione ha lo scopo di trasformare
un algoritmo espresso in un qualche linguaggio informale o pseudoformale
in un algoritmo espresso in un linguaggio di programmazione per cui esista
un compilatore e che tale attivitá deve essere svolta tenendo conto di tutti
gli aspetti tecnologici che possono ottimizzare l’esecuzione del programma
e sono indipendenti dalla logica propria dell’algoritmo (programmazione
parallela, ottimizzazione dei cicli...).
Lo sviluppo del software consiste nella organizzazione di una serie proces-
si e attivit con lo scopo di scrivere, documentare ed installare un insieme di
programmi, scripts e configurazioni di sistema che costituiranno una parte
o il tutto di un sistema informatico.
La differenza fondamentale che esiste quindi tra la programmazione e lo
sviluppo del software é che mentre la prima porta il programmatore a rela-
zionarsi con un sistema formale (il modello logico da cui si tra l’algoritmo)
il secondo é centrato su capacitá organizzative e di coordinamento di atti-
vitá reali e non formali.
In alcune realtá industriali esiste una netta separazione tra i ruoli di ar-
chitetto, ingegnere e sviluppatore del software, in altre chi si occupa dello
sviluppo stabilisce anche l’architettura ma non segue il processo ingegne-
ristico, in altre ancora non esiste una netta separazione di questi ruoli ne a
livello formale ne concreto.
Nella realtá produttiva italiana si trovano spesso delle situazioni in cui il
processo di sviluppo del software é seguito direttamente dagli sviluppato-
ri che il piú delle volte si occupano anche della definizione dell’architettura.
L’obiettivo di questo corso é di offrire agli studenti l’occasione per focaliz-
zare l’attenzione sulla problematica dello sviluppo del software. Dal mo-
mento che questo corso viene tenuto in un ateneo italiano e che statistica-
mente ci si puó aspettare che la maggior parte degli studenti svolgeran-
no la loro futura attivitá in questo paese i concetti saranno presentati nel-
l’ottica che le tre figure sopra citate (ingegnere, architetto e sviluppatore)
coesistano in un unica figura.
1 L’approccio ingegneristico
Lo sviluppo/manutenzione di un software puó nascere per vari motivi, tra
i quali si hanno:
4
• commessa di un cliente
5
esse costituisce quindi un processo e considerate tutte insieme definiscono
il processo di sviluppo (del software).
Queste attivitá sono svolte, decise e guidate normalmente da esseri umani
e pertanto non sono controllabili con la stessa precisione con cui é possibile
controllare le attivitá svolte da una macchina, inoltre il risultato di queste
attivitá ha spesso un carattere intangibile e questo rende ancor piú com-
plesso il loro controllo ma anche il loro monitoraggio.
Altre branche dell’ingegneria debbono occuparsi della gestione di processi
ed attivitá guidati dall’uomo ma, come si avrá modo di capire, l’ingegneria
del software spicca per la particolare complessitá di questa gestione. Le ra-
gioni di questo sono probabilmente da ricercarsi sia nel fatto che il prodotto
di questo processo ingegneristico é qualcosa che sta a metá tra il prodotto
ed il servizio ed é comunque non tangibile quanto nel fatto che ancora sia
gli ingegneri che i clienti non hanno ancora maturato una vera esperienza
con questi processi in quanto l’ingegneria del software ha poco meno di
quarant’anni.
6
partenza.
Questo documento non deve descrivere i requisiti e l’architettura del pro-
getto, questi elementi infatti saranno chiariti e approfonditi nel corso del
progetto stesso, lo scopo di questo documento é quello di chiarire nella
mente dei soggetti che parteciperanno al progetto (clienti, utenti, finanzia-
tori, architetti, sviluppatori ed ingegneri) i punti seguenti:
Rischi del progetto : sono una serie di eventi e circostanze su cui non si ha
il controllo diretto. I rischi vengono spesso classificati come: tecnolo-
gici, del personale, organizzativi, strumentali, dei requisiti e di stima
(dei tempi e delle risorse).
7
I requisiti qualitá e funzionalitá che il software deve possedere e fornire per
essere considerato conforme ai propositi ed agli obiettivi che ne hanno de-
terminato lo sviluppo.
Nell’ambito dell’ingegneria del software la problematica dell’acquisizione,
dell’analisi e dalla documentazione dei requisiti é materia viva e tuttora in
discussione. Alcuni ingegneri professano la necessitá di applicare metodi
formali e procedure di qualitá per la gestione dei requisiti (metodi Hea-
vyweight o Monumental), altri hanno sviluppato delle metodologie leggere
che in linea di principio permettono di seguire l’ingegneria dei requisiti in
maniera snella e produttiva.
Il punto di vista di questo corso é che indipendentemente dalla metodolo-
gia che si intende usare per la documentazione dei requisiti, questi debbono
essere assolutamente ben noti a tutti gli attori che partecipano al progetto,
anche se ovviamente la prospettiva sotto cui questi saranno osservati di-
penderá ovviamente dal ruolo svolto dall’ attore.
8
La formulazione chiara dei requisiti utente e la loro presa di visione
da parte degli utenti finali e del cliente costituisce una ottima base per lo
sviluppo del progetto.
WEB 3.1
Action: showworklist
Input: mainmenu.jsp
processedby: dicombridge
model: wlEJB
success: worklist.jsp
error: dicomerror.jsp
Action: createexaminationcredential
input: worklist.jsp
processedby: securityman
model: wlEJB
success: worklist.jsp
error: secrity.jsp
9
1. Opzionalitá sui record da rendere accessibili all’utenza
RR 4.2
Il servizio di download deve essere garantito 7/7 giorni,
24/24 ore.
Il servizio deve essere attivo anche durante le operazioni
di manutenzione.
RR 4.2
Il servizio http realizzato installando una copia di server in cluster.
Sui server saranno virtualizzati gli ambienti web che consisteranno
in un Jboss 4.2/Tomcat/Mysql su piattaforma Linux.
10
In alcune metodologie il documento dei requisiti viene visto come una
adempimento formale privo di interesse pratico. Queste metodologie pro-
pongono che i requisiti siano raccolti in corso d’opera e gestiti in maniera
piú o meno diretta dagli sviluppatori.
Indipendentemente dal metodo di formalizzazione di cui si intende fare
uso é una buona norma pensare alla struttura che deve o dovrebbe avere il
documento dei requisiti:
Glossario : elenco e definizione dei termini tecnici presenti nel resto del
documento.
11
2.5 Raccolta e formalizzazione dei requisiti
La stesura del piano del progetto é il primo dei passi formali nella gestione
di un processo di sviluppo. Il processo continua con una prima raccol-
ta informale dei requisiti allo scopo di definire la fattibilitá del progetto.
L’analisi della fattibilitá deve tener conto sia di eventuali impedimenti tec-
nologici che della reale necessitá dello sviluppo del progetto. Va da se che
un progetto di cui nessuno sente realmente l’esigenza é con ogni probabi-
litá destinato a fallire, purché il progetto una volta realizzato non determini
nuove esigenze a cui esso puó rispondere.
L’analisi della fattibilitá produce il documento di fattibilitá e a condizio-
ne che esso sia positivo si procede con l’analisi e la raccolta dei requisiti.
Questi dopo essere stati raccolti vengono formalizzati nel documento dei
requisiti e quindi convalidati. Il processo puó essere schematizzato come
in figura 1. La raccolta dei requisiti é uno dei momenti fondamentali del
Presentazione
del progetto
Studio di
fattibilità
Raccolta dei
requisiti
Formalizzazione
dei requisiti
Convalida
12
der3 e cerca di trarre i requisiti utente e di sistema per mezzo di interviste.
L’impostazione delle interviste puó essere piú o meno formale ció che con-
ta é che l’analista riesca a focalizzare le esigenze dei propri interlocutori, le
loro aspettative e gli aspetti che maggiormente li preoccupano.
Non esiste un metodo universalmente valido per condurre le interviste. Di-
versamente da un magistrato infatti un analista non puó disporre dei propri
interlocutori come meglio crede ma deve (per amore o per forza) rispettare
la loro sensibilitá, disponibilitá al dialogo e capacitá espressiva.
La pratica dell’ingegneria del software ha portato nel tempo al consolidarsi
di metodologie per assistere tutte le fasi del processo. Per la raccolta dei
requisiti si fa ora largo uso di diagrammi che hanno lo scopo di contestua-
lizzare i requisiti in specifici scenari di utilizzo e di semplificare il corso
delle interviste e la loro successiva analisi. Questi diagrammi sono detti
diagrammi dei casi d’uso o use cases e fanno parte del linguaggio di modella-
zione UML. I casi d’uso di riferiscono ad uno scenario (a volte identificano
uno scenario) e descrivono graficamente l’interazione tra gli utenti ed il
sistema. L’utilitá di questi diagrammi é che sono molto intuitivi ed espli-
cativi e consentono di analizzare il sistema dal punto di vista dell’utente in
maniera grafica, quindi immediata e leggera.
13
si presenta in diagnostica e si posiziona per l’esame.
Il tecnico di diagnostica riceve i dati del paziente
da RIS. Esegue l’esame. Il sistema RR mostra il
record del paziente con il relativo numero della
prestazione.
Il tecnico seleziona il record per la pubblicazione
del referto sul web. Il tecnico stampa la username
e la password per il paziente e le consegna.
ReadyReport
Predispone l'esame
Tecnico per l'accesso dal
Diagnostica web
14
Tecnico prestazioni.jsp Controller EJB DB RIS
Diagnostica
lista prestazioni
lista prestazioni
lista prestazioni
SQL Query
Resultset
15
Contesto : i requisiti debbono riferirsi al sistema da sviluppare e non a
quanto gi presente. Bisogna pertanto evidenziare i confini tra il siste-
ma e l’ambiente.
Risulta che l’analisi dei requisiti di sistema passa per lo studio del contesto,
comportamento, architettura, classi e informazioni del sistema stesso e
quindi costituisce l’incipit (il principio)dell’analisi progettuale.
Lo studio dei punti visti sopra risulta notevolmente piú chiaro se condotto
per mezzo di diagrammi. L’uso dei diagrammi contribuisce alla definizione
dei modelli del sistema.
Nel paragrafo successivo verranno presentati alcuni diagrammi relativi al
progetto ReadyReport.
16
3.2.1 Flusso dei dati nel sistema informativo ospedaliero
Paziente
Dati Morfologia
Acquisizione
Accettazione Refertazione
immagine
Prenotazione prestazione
Immagine Immagine
Referto
PACS
RIS-DB
Figura 4: Diagramma di sequenza per lo scenario Flusso dei dati per l’esecuzione
di una prestazione radiologica.
17
Paziente
Dati
Morfologia
Referto Refertazione
Accettazione
Acquisizione
immagine
Prenotazione prestazione
RIS
Immagine
Immagine
RIS-DB
PACS
Figura 5: Diagramma di sequenza per lo scenario Flusso dei dati per l’esecuzione
di una prestazione radiologica. In evidenza il sottositema RIS.
18
Paziente
Dati Morfologia
Refertazione
Acquisizione
Accettazione
immagine
PACSImmagine
Immagine
Prenotazione prestazione
Referto
PACS
RIS-DB
Figura 6: Diagramma di sequenza per lo scenario Flusso dei dati per l’esecuzione
di una prestazione radiologica. In evidenza il sottosistema PACS.
19
che il sistema RR dovrá interagire con questi due sottosistemi e, come de-
dotto dall’oggetto stesso del progetto, con il WEB. Il diagramma del conte-
sto é riportato in figura 7.
Il contesto in cui si troverá ad operare un sistema, nel caso in questione
RR, non é sempre univocamente determinato dalle condizioni ambientali ma
puó essere modificato per adattarlo alle esigenze o ai vincoli di progetto.
Si supponga, a titolo di esempio, che il RIS presente presso una struttu-
ra sanitaria non presenti una interfaccia di comunicazione DICOM4 per lo
scambio dei dati con altre applicazioni. La comunicazione e lo scambio di
dati con questo sottosistema deve allora seguire una strada non standard e
potrebbe rivelarsi necessario interpellare il fornitore del sistema per richie-
dere le specifiche per l’integrazione.
Questo scenario complica il progetto iniziale, infatti viene inserito tra le
parti un nuovo elemento (il fornitore del RIS) con le proprie esigenze, obiet-
tivi, scadenze, disponibilitá e risorse. Il committente potrebbe temere que-
sto scenario e optare per una soluzione in cui le funzioni svolte dal RIS
siano ricoperte dal progetto RR.
RIS
READYREPORT WEB
PACS
20
3.2.3 Il flusso dei dati di ReadyReport
L’analisi dei requisiti di sistema per RR evidenzia che le funziono principali
che devono essere offerte dal sistema sono:
Esportazione dei referti sul web : i referti pronti debbono essere pubbli-
cati sul web.
3.2.4 Architettura
La descrizione dell’architettura di un sistema consiste nella scomposizione
del sistema in sottosistemi e nella loro identificazione con eventuali compo-
nenti fisici (Database, librerie, eseguibili, file di risorse). Come si é visto nei
paragrafi precedenti la definizione dei requisiti di sistema é semplificata
dalla definizione di sottosistemi. In questo modo la definizione dei requi-
siti porta alla definizione dell’architettura e viceversa. In fig 9 é riportata
l’architettura del sistema RR.
I processi (funzioni sui dati) visti nel diagramma del flusso dei dati vengo-
no riferiti ai sottosistemi identificati in questo diagramma.
3.2.5 Classificazione
I digrammi delle classi e degli oggetti sono tra i piú usati nelle metodologie
basate sul linguaggio UML. Questi diagrammi possono venire usati in tutte
le fasi del processo.
Nella fase di raccolta e formalizzazione dei requisiti questi modelli sono
spesso impiegati per fornire una rappresentazione razionale delle entitá
coinvolte nel progetto e solo successivamente, cioé nella fase di progetta-
zione, vengono impiegati per descrivere le classi (come costrutti di codice)
e le relazioni tra esse che saranno sviluppate.
In questo caso si impiegano questi diagrammi per dare una rappresenta-
zione della struttura (fig 11) e dell’organico (fig 10) di un servizio sanitario.
21
Tecnico
diagnostica
Generazione
user_name, password,
encription e decription
key
Referto
Referto Credenziali
Prestazione
RIS-DB
RR-DB
Download
Utente del
servizio
22
Gestione Prestazioni/credenziali
Gestione Referti
DB-RR
Dipendente
Nome
Cognome
IdDipendente
referta()
eseguiPrestazione()
Radiologo
refertaImmagine()
23
Figura 11: Descrizione della struttura sanitaria.
3.3 La progettazione
Un sistema informatico é sempre caratterizzato da una sua struttura statica
ed una dinamica. La struttura statica é descrivibile in termini di compo-
nenti hardware e di componenti software che sono disposti (schierati) nei
componenti hardware, mentre la struttura dinamica é l’organizzazione del
sistema in termini di processi e scambio di dati durante l’esecuzione del
programma.
La progettazione di un sistema informatico (software applicativo o sistema
informativo) consiste nella definizione (chiara e precisa) della struttura sta-
tica e dinamica del sistema.
Il concetto di struttura di un sistema rimane spesso oscuro e capita di im-
piegarlo in modo improprio o comunque ambiguo. Il termine struttura
deriva direttamente dal concetto di costruzione, cos quando ci si riferisce
alla struttura statica di un sistema si devono intendere i componenti con cui
24
Figura 12: Schema logico dei Database.
25
questo é stato costruito e le relazioni strutturali tra di essi, in altri termini
progettare la struttura (statica) di un sistema significa pensare al sistema in
termini di componenti che appunto lo compongono.
Spesso i componenti di un sistema hanno una propria struttura, si parla in
questo caso di sotto strutture.
La struttura dinamica deve considerare i processi attivi durante l’esecuzio-
ne del sistema e la comunicazione tra questi. É molto importante tenere in
considerazione che possono esistere delle differenze importanti tra la strut-
tura dinamica e quella statica. Alcuni aspetti della dinamica di un sistema
sono giá determinati dalla sua struttura (statica) altri invece sono defini-
ti solo a livello dinamico. Per fare un esempio se si considera un sistema
web-based a livello statico possiamo indicare la macro struttura come un
web-server ed un web-browser. É chiaro che durante l’esecuzione del si-
stema esisterá un istanza del web-server ed una del browser ed un traffico
di pacchetti TCP tra i due che si scambieranno dei messaggi e dei dati se-
condo il protocollo HTTP.
In una situazione reale peró piú browser potrebbero connettersi allo stesso
server e questi dovrá implementare una strategia di parallelismo per gestire
le connessioni.
Un sistema informatico puó essere sviluppato senza nessun progetto ma
esso avrá sempre una propria struttura statica e dinamica, con questo si
vuol sottolineare che l’attivitá della progettazione ha lo scopo di anticipa-
re, prevedere, guidare, proiettare, imporre o suggerire la struttura di un
sistema prima che questo venga costruito.
26
3.3.2 Vantaggi e svantaggi della progettazione
Si puó decidere di progettare perché si ama farlo o perché lo si ritiene ne-
cessario. Nella prima ipotesi é inutile distinguere vantaggi e svantaggi, in
quanto si sa che l’amore é cieco. Nella seconda ipotesi, visto che la pro-
gettazione é un attivitá dispendiosa, frustrante e mal retribuita é giusto
analizzare in maniera profonda l’effettiva necessitá di farlo e quali sono i
vantaggi che ci si aspetta.
Una regola semplice é la seguente: progettare bene aiuta molto, progettare male
danneggia moltissimo, non progettare per niente é assurdo.
3.4.1 I componenti
Un tempo la categoria di componente era limitata a unitá fisiche software
cioé sostanzialmente a oggetti gestibili dal filesystem. Il concetto di compo-
nente é stato peró esteso nel senso visto sopra.
Se si vuole analizzare una applicazione complessa scritta in linguaggio C,
un componente puó essere un modulo che espone un interfaccia, cioé una
collezione di funzioni e proprietá, o direttamente una funzione.
Il significato che attribuiamo alla categoria componente dipende fortemen-
te dal contesto e dal grado di astrazione dell’analisi.
Se si sta analizzando un complesso sistema distribuito in cui prendono par-
te anche alcuni eseguibili C, questi saranno visti come componenti mentre
la loro scomposizione funzionale rimarrá nascosta e non parteciperá alla
27
definizione dell’architettura, in questa prospettiva una funzione C non é
un componente.
3.4.2 I connettori
I connettori sono astrazioni dei metodi impiegati per scambiare i dati tra i
componenti:
Compilatore
Analizzatore Generatore di
Ottimizzatore
semantico codice
Analizzatore
sintattico
Analizzatore
lessicale
Repository
Editor
28
Software
Server
Kernel
3.5.1 Organizzazione
Si puó parlare di stile di organizzazione di un software quando questo rag-
giunge una certa complessitá tale da poter considerare il sistema come com-
posto da diversi sottosistemi.
L’organizzazione allora si riferisce alla scelta dei componenti e dei connet-
tori per la comunicazione tra i sottosistemi.
29
nicare con il componente Database, ma a questo livello questa comu-
nicazione é vista come un dettaglio. Un esempio di organizzazione a
repositry si ha negli ambenti di compilazione (vedi figura 13).
Modello client-server : bisogna anzi tutto notare che per sistemi comples-
si si ha spesso la presenza di diversi stili di organizzazione che colla-
borano alla definizione del sistema, cosı́ un sistema puó essere sia a
repositiry che client-server.
Nell’organizzazione client-server alcuni componenti detti server espon-
gono dei servizi che vengono consumati dai client.
I componenti si connettono per mezzo di RPC o di stream.
L’architettura Client-server puó essere stratificata in piú livelli e ora-
mi si parla di architetture distribuite.
3.5.3 Controllo
Un sistema software é composto da un insieme di componenti. Affiché si
possa parlare di sistema é necessario che tali componenti collaborino per
30
ottenere un certo comportamento o risultato. La logica con cui questi colla-
borano é definita in maniera esplicita dal sistema di controllo che regola
l’esecuzione dei componenti in base ad uno stato del sistema o ad eventi
che si presentano.
Se tutta la logica di controllo viene accentrata all’interno di un singolo com-
ponente si parla di controllo centralizzato, quando invece il controllo é sud-
diviso tra i vari componenti il controllo e decentralizzato. Un esempio di
controllo centralizzato si ha nei programmi C dove il controllo principale
del sistema risiede nella funzione main che chiama le altre funzioni per ese-
guire dei compiti specifici. I sistemi guidati da eventi come i sistemi basati
su un interfaccia grafica sono invece normalmente sistemi decentralizzati.
I sistemi software fanno comunque spesso uso simultaneamente di entram-
be queste tecniche di controllo e la loro categorizzazione é utile per saper
riconoscere lo stile di controllo di un determinato sottositema.
31
Il linguaggio di elezione per la produzione di questi diagrammi é l’UML.
Normalmente il processo di progettazione prende il la dal modello architet-
turale che viene definito durante l’analisi dei requisiti (fig. 9). A partire da
questo modello si identificano i principali componenti del sistema. Il pro-
gettista analizza i moduli individuati nella fase dei requisiti e comincia ad
ipotizzare uno stile organizzativo, di controllo e di modularizzazione per
il sistema. Spesso la suddivisione in macro componenti individuate nella
fase di ingegneria dei requisiti non é rispettata nella fase di progettazione.
Nella fase dei requisiti infatti la scomposizione del sistema in sottosistemi
riflette una esigenza di chiarezza logica e funzionale mentre nella fase di
progettazione si devono dividere o accorpare i componenti tenendo conto
degli obiettivi di performance, sicurezza, affidabilitá, scalabilitá e deploy-
ment.
Il primo diagramma che viene prodotto é normalmente un diagramma che
descriva i componenti principali quindi le classi che costituiscono questi
componenti, quindi é normale partire con una vista logica. Quando i com-
ponenti e le classi sono stati individuati si cerca di descriverne il loro com-
portamento in fase di esecuzione del sistema e si passa quindi alla vista del
processo. L’organizzazione delle classi in package ha lo scopo di rendere
piú semplice l’attivitá di sviluppo e di riutilizzo del codice, questa vista
viene prodotto di norma quando sono giá state individuate le classi del
sistema, ma non sarebbe sbagliato comunque anche far precedere questa
vista a quella logica.
La vista di schieramento (deployment) mostra come i vari componenti sa-
ranno distribuiti sui nodi del sistema. Questa vista é fondamentale per
rendersi conto delle caratteristiche di scalabilitá, performance e sicurezza
del sistema.
La quinta vista é normalmente meno formale. Il suo scopo é di collegare le
altre viste in un ottica di casi d’uso.
32
figura 15.
Dalla figura 15 si deduce che il la web-application ReadyReport comunica
con la Diagnostica per mezzo di un’architettura a repository. Il dettaglio
del componente MainController é illustrato in figura 18. Il core di questo
componente é una servlet Java a cui vengono dirette tutte le richieste http
provenienti dal browser. Le pagine HTML caricate sul browser sono gene-
rate dinamicamente dalle pagine jsp. L’insieme di queste pagine costituisce
i due componenti CredenzialiUtente ed ExportReferti. La comunicazione
tra le pagine jsp e la servelt avviene secondo una logica MVC. Questo é
documentato nel progetto tramite i contratti informali GestioneCredenziali
e GestioneReferti. Questi sono informali in quanto non sono verificabili a
compile time e si riferiscono al set di valori possibili che possono essere pas-
sati dalle pagine HTML alla servelt per il parametro op che stabilisce quale
azione debba essere intrapresa dalla servlet.
Il diagramma di deployment 19 infine evidenzia che le due web-application
saranno schierate su due server diversi (uno interno alla LAN e l’altro sulla
DMZ requisito non funzionale) per questioni di sicurezza.
33
Figura 16: Vista logica del progetto RR, diagramma delle classi.
34
Figura 17: Vista di development (packeging).
35
Figura 18: Vista del processo, dettaglio di una sequenza.
36
Figura 19: Vista di schieramento.
37
4 Sviluppo
Lo sviluppo del software consiste nella produzione di codice sorgente e nel-
la successiva compilazione e debug. Lo sviluppo del codice segue sempre la
fase di progettazione ma spesso lo sviluppo del codice é anche l’incipit per
una nuova fase di ingegneria dei requisiti e di progettazione.
La fase dello sviluppo comincia con la generazione automatica del codice
da parte degli strumenti CASE (Computer Aided Software Engineering) e
con il completamento del codice stesso da parte degli sviluppatori che ba-
sandosi sul progetto prodotto nella fase precedente implementano le fun-
zionalitá ed i requisiti di sistema basandosi sulle specifiche raccolte e for-
malizzare nella fase di ingegneria dei requisiti.
Ipotizzando che nella fase dei requisiti questi siano stati analizzati con com-
pletezza e correttamente, che nella fase di progettazione si sia delineato
correttamente il modello del sistema ed il progetto, segue per logica che la
fase di sviluppo, se condotta correttamente, debba portare ad una fase di
verifica e quindi completamento del progetto.
Purtroppo questo sillogismo é verificato in una bassa percentuale di casi.
In molti casi si ha che la fase dei requisiti é condotta solo approssimativa-
mente e quella di progettazione manca completamente. Questi casi non
sono neanche presi in considerazione in questo ragionamento. Un soft-
ware mal progettato se funziona é solo per pura fortuna e la fortuna nella
scienza non esiste. Il nostro interesse invece é per quelle situazioni in cui
le fasi dei requisiti e della progettazione sono condotte correttamente ma
dopo lo sviluppo al momento della messa in produzione del software ri-
sulta che questo non soddisfa i requisiti attesi. La domanda a cui si cerca di
rispondere é cosa accada in questi casi.
38
correttamente senza voli di fantasia.
I progetti condotti in queste condizioni possono seguire la sequenza Analisi
→ Progettazione → Sviluppo → Verifica con successo.
39
a compromessi sulla qualitá del software.
Affinché questo approccio sia conveniente é necessario alleggerire anche la
fase della progettazione. Nella pratica si é dimostrato che un buon approc-
cio alla protitipizzazione sia ha cercando di unificare la fase di progetta-
zione e di sviluppo. Questo non significa non progettare, anzi progettare
molto ma realizzare subito quanto progettato. Seguendo lo sviluppo per
prototipi la produzione delle quattro viste ad ogni ciclo diventa eccessivo.
Al termine dei cicli di retroazione, cioé quando i requisiti si stabilizzano di-
venta fondamentale riscrivere il codice secondo le regole della buona qua-
litá. Per evitare di dover riscrivere interamente il codice al termine dei cicli
di sviluppo si puó ricorrere alla tecnica di refactoring che consiste nel dedi-
care con costanza qualche ora alla settimana al rivedere il codice scritto in
precedenza per renderlo adeguato alla produzione.
40
Analisi di parte
dei requisiti
Formalizzazione
dei requsiti
Progettazione di
parte del sistema
Sviluppo
Installazione
41
lo sviluppo in evoluzione. L’idea alla base di questa metodologia é quella di
far crescere il software per funzionalitá, via via che queste vengono chiarite
nel rapporto con gli stackholder (fig. 20)
Il razionale di questo approccio non é immediato ma é molto importante.
L’ostacolo principale in questi progetti é ovviamente la raccolta dei requisi-
ti. Questi potrebbero essere raccolti in forma completa e definitiva prima di
iniziare la fase di progettazione e quindi di sviluppo, allora perché si pro-
fessa lo sviluppo evolutivo? La risposta é un po’ psicologica, gli stackholder
infatti dopo qualche incontro iniziale si stancano di aver intorno analisti
che fanno delle domande e questo mina alla base il processo di ingegneria
dei requisiti, per questo lo stratagemma di fornire una base (funzionante e
ben testata) di requisiti ma non completa incita gli stackholder a continuare
il processi dei requsiti per arrivare alla conclusione.
5 I Design Pattern
Un Design Pattern é un modello architetturale ben definito per ottenere un
preciso risultato.
L’idea dei design pattern nasce direttamente dall’architettura civile dove se
ne fa comunemente uso. Si pensi ad esempio alla necessitá di introdurre un
accesso per persone deambulanti con carrozzina in una scuola. La risposta
moderna é l’inserimento di una rampa liscia a fianco delle scale.
Uno dei vantaggi dei design pattern é che costituiscono una piattaforma
comune di dialogo tra progettista e sviluppatore, esattamente come accade
nell’ingegneria civile.
I Design Pattern sono caratterizzati da:
42
5.1 Il pattern Mode View Controller (MVC)
In questo paragrafo sará brevemente introdotto il pattern MVC. Nel pa-
ragrafo successivo si analizzerá la presenza di questo pattern all’interno
dell’architettura del progetto ReadyReport.
Partecipanti :
43
Model
Controller
Seleziona la vista
View
44
Lo stile di controllo di una web application é sostanzialmente implementato
nella logica con cui si costruiscono i collegamenti tra i vari moduli della web
application.
Home.jsp
Home.js
p
ModelloLogico ListaPrestazioni.jsp
produciListaPrestazioni()
copiaImmaginiDalPacs()
esportaRefertiSulWEB()
ListaPrestazioni.js
produciListaWeb()
p
CopiaImmagini.jsp
CopiaImmagini.js
p
Figura 22: Relazioni tra i moduli di una web application e le pagine generate.
45
Home.jsp ListaWeb.jsp
ListaWeb.jsp
Home.jsp
Export.jsp ListaPrestazioni.jsp
Export.jsp ListaPrestazioni.jsp
CopiaImmagini.jsp
CopiaImmagini.jsp
Figura 23: Collegamenti esistenti tra le pagine web generate dalla web
application.
46
ListaWeb.jsp Export.jsp
ListaWeb.jsp Export.jsp
<<Servlet>>
Controller CopiaImmagini.jsp
CopiaImmagini.jsp
ModelloLogico
produciListaPrestazioni()
copiaImmaginiDalPacs()
esportaRefertiSulWEB()
produciListaWeb()
stato applicativo che deve essere mostrato dal viewer, per esempio i record
di una tabella o per il progetto RR la lista delle prestazioni eseguite.
In java queste classi sono tipicamente dei javabeans. Queste classi sono
prodotte dal ModelloLogico sotto sollecitazione del Controller e sono re-
se disponibili ai viewers (fig. 25) per esempio ponendole visibili a livello di
Session.
Infine si puó notare che nelle web application java il model é spesso
realizzato come un EnterpriseJavaBean (EJB).
47
ListaWeb.jsp Export.jsp CopiaImmagini.jsp
<<bean>> <<bean>>
ListaWeb Risultato
ModelloLogico
produciListaPrestazioni() <<Servlet>>
copiaImmaginiDalPacs() Controller
esportaRefertiSulWEB()
produciListaWeb()
5.3.1 Il Model
Il Model per il progetto ReadyReport é implementato nel componente AccessoDB
(figura 18). In questo componente sono presenti le classi che hanno la re-
sponsabilitá di eseguire le operazioni sui dati. In particolare in questo com-
ponente sono presenti anche le classi che che contengono il codice SQL spe-
cifico per la gestione dei dati nel DB, questo peró (l’accesso al DB) é mediato
dai driver jdbc.
Sebbene non sia necessario disporre Il componente AccessoDB nel container
che offre l’interfaccia HTTP alla web application, si é deciso di sviluppare
questo componente come un EJB (Enterprise Java Bean) e quindi di dispor-
lo dentro un container per sfruttare i servizi che il container offre per la
gestione delle transazioni.
5.3.2 Controller
Il controller é stato implementato come una classe Servlet, cioé una classe
Java che implementa l’interfaccia Servlet.
Il nucleo di base del controller consiste in un costrutto Switch-case (o
if-else if-else) in cui i vari case corrispondono con un possibile in-
sieme dei valori che sono passati dai viewer al controller per mezzo del
parametro op.
48
if(op.equalsIgnoreCase("addpatient"))
{
b=deployPatientResource(request.getParameter("name"),
request.getParameter("fname"),
request.getParameter("nhc"),request.getParameter("dicomid"));
RequestDispatcher rd=
this.getServletContext().getRequestDispatcher("/importadcm.jsp");
if(b)
{
request.setAttribute("deployed",b);
request.setAttribute("message",message);
rd.forward(request,response);
}
}
else if(op.equalsIgnoreCase("addresource"))
{
request.setAttribute("performanceid","");
b=deployIndexedResource(
request.getParameter("performanceid"),
request.getParameter("NationalHealthNumber"));
RequestDispatcher rd=
this.getServletContext().getRequestDispatcher("/importadcm.jsp");
if(b) request.setAttribute("deployed","Operazione riuscita");
else request.setAttribute("deployed","Operazione NON riuscita");
request.setAttribute("performanceid",
request.getParameter("performanceid"));
rd.forward(request,response);
}else if(op.equalsIgnoreCase("performancelist"))
{
//Data
String idscanner=request.getParameter("idscanner");
logger.debug("idscanner="+idscanner);
if(idscanner=="")idscanner=request.getParameter("ids");
...
request.getSession().setAttribute("performancelist",
getPerformanceList(idscanner, new Integer( year).intValue(),
...
}
else if(op.equalsIgnoreCase("plist"))
{
RequestDispatcher rd=
49
this.getServletContext().getRequestDispatcher("/performancelist.jsp");
rd.forward(request,response);
5.3.3 View
I componenti viewer sono implementati come pagine jsp. Questi si inter-
facciano al controller tramite l’interfaccia lasca definita dall’insieme di va-
lori definiti nello switch-case del controller cioé le stringhe addpatient,
addresource, performancelist, plist....É importante notare che que-
sta interfaccia non definisce un vero tipo ma é solo un contratto tra i viewer
ed il controller.
6 Verifica e convalida
La quarta fase del processo software consiste nella verifica e convalida dei
requisiti funzionali e non funzionali.
In genere con verifica si intende la fase in cui ci si accerta che il software
lavori come stabilito nelle specifiche. Le specifiche sono peró solo una rap-
presentazione scritta delle aspettative di chi userá il software e quindi po-
trebbero (come giá ampiamente discusso nei paragrafi precedenti) differire
dalle reali esigenze dei committenti. Per questo prima di rilasciare un soft-
ware si procede anche con la fase di convalida in cui si verifica se le speci-
fiche implementate sono proprio ció che ci si attendeva.
Al termine di una fase di sviluppo7 si dispone di un prodotto/prototipo le
cui caratteristiche possono essere osservate e testate similmente a quanto si
fa per un manufatto.
Le caratteristiche di ogni buon prodotto software devono essere:
Efficienza : il software deve fare un uso razionale delle risorse del sistema.
50
6.1 Cominciare bene
La fase di verifica di un sistema puó essere lunga e difficile e spesso alcune
difformitá dai requisiti risultano solo dopo diverso tempo che il software
é giá in esercizio. Per questo motivo é meglio condurre l’intero ciclo di
sviluppo seguendo un principio di qualitá e non riversare tutta la respon-
sabilitá alla singola fase della verifica.
É bene notare che questo approccio di qualitá non é in contrasto con la meto-
dologia di sviluppo prototipale a patto che ad ogni ciclo di sviluppo segua
una fase di refactoring8 .
Un metodo per produrre codice di qualitá e quello di seguire delle Best
Pratics:
Utilizzo di pattern : l’utilizzo di design pattern consiste nell’impiegare de-
gli schemi noti e giá testati per ottenere un dato risultato. Impiegare
i design pattern evita di introdurre potenziali errori in un prodot-
to e velocizza le fasi di test in quanto le strutture del codice sono
immediatamente riconoscibili.
Scelta dei linguaggi : la scelta del linguaggio con cui sviluppare il soft-
ware puó influenzare la capacitá effettiva degli sviluppatori di pro-
durre codice corretto e robusto.
51
condotta permette di risparmiare molto tempo nelle successive fasi di veri-
fica del prodotto (cioé il sistema sviluppato).
Molti sistemi peró vengono sviluppati seguendo dei processi di sviluppo
prototipale e tipicamente questa metodologia di processo impone l’uso di
progetti a basso livello di dettaglio. Pertanto l’ispezione dei progetti il piú
delle volte permette di verificare la presenza di errori evidenti di sistema
e architettonici ma piú difficilmente potrá mettere in luce delle difformitá
dalle specifiche funzionali. Buona parte della fase di verifica deve essere
quindi condotta direttamente sul codice.
6.3 I test
La fase culminale del processo di verifica e di quello di convalida é la fase
dei test. In questa fase si verifica sperimentalmente se il sistema risponde
agli input come ci si aspetta.
La fase di test é divisa in tre momenti:
Sviluppo dei test : si decide quali funzionalit testare e come testarle.
Test : si testa sperimentalmente il sistema.
Documentazione dei risultati (Repots) : si documentano i risultati dei te-
st.
Lo sviluppo dei test é una fase critica, infatti se si dispone di un buon piano
di test é probabile che la maggior parte degli eventuali difetti del sistema
sia evidenziato in questi test, se invece il piano é incompleto la fase di test
fornisce una falsa sensazione di tranquillitá.
Un buon piano dei test deve portare alla verifica del 100% del codice e di
tutti i possibili input del sistema.
La documentazione della fase di test é importante e costituisce un elemento
fondamentale nella gestione della qualitá del progetto.
Tipicamente un documento di test dovrá riportare le seguenti informazioni:
52
7 Omissioni
Queste dispense sono state scritte in itinere durante il primo anno in cui
l’autore ha tenuto il corso di Ingegneria del Software presso l’Ateneo di
Ferrara.
Buona parte del lavoro dovrá essere completata e limata. In particolare sono
stati saltati alcuni argomenti importanti che per ragioni di tempo e di orga-
nizzazione non hanno trovato spazio all’interno di questa prima versione
del corso. Di seguito si riportano la lista degli argomenti piú importanti
che lo studente interessato ai temi dell’ingegneria del software dovrebbe
completare autonomamente:
Specifiche formali
Gli argomenti elencati si trovano nei libri comunemente usati per i corsi di
Ingegneria del Software.
53