Sei sulla pagina 1di 68

ED I T O R I A L E online.infomedia.

it
n. 62 - marzo/aprile 2005
bimestrale - anno undicesimo

Direttore Responsabile
Marialetizia Mari (mmari@infomedia.it)
Direttore Esecutivo
Il fascino delle Francesco Balena (fbalena@infomedia.it)
Managing Editor

coding guidelines
Renzo Boni (rboni@infomedia.it)
Collaboratori
Marco Aldrovandi
Gionata Aladino Canova
Dino Esposito, Andrea Ferendeles

D i recente ho scritto un libro sull’uso delle linee guida e best


practice nella scrittura di applicazioni .NET. Non voglio
approfittare di questo spazio per fare pubblicità al libro (e
quindi ometterò di menzionarne il titolo...) però avendo dedicato
così tanto tempo a questo argomento ho pensato di condividere
Ignazio Licata, Gianluca Masina
Davide Mauri, Paolo Pialorsi
Francesco Quaratino, Ingo Rammer
Alberto Rosotti, Lorenzo Vandoni

qualche riflessione con i lettori di Visual Basic & .NET Journal.


Anche se i termini guideline e best practice sono spesso usati in
modo intercambiabile, i due termini si riferiscono a concetti diffe-
renti. Le linee guida sono regole a cui occorrerebbe attenersi quando
si scrive codice, quando si assegna un nome a una classe o metodo,
quando si organizzano le varie parti di un progetto, e così via. Il loro obiettivo è rendere il
codice più leggibile e ordinato, manutenibile, riutilizzabile, e auto-documentante.
Direzione
Per best practice, invece, di solito si intende una raccomandazione sull’uso corretto del Natale Fino (nfino@infomedia.it)
linguaggio e delle classi del .NET Framework, allo scopo di creare programmi più sicuri,
performanti, scalabili, e robusti. Secondo questa distinzione, ad esempio, l’uso di comandi
Marketing & Advertising
Segreteria: 0587/736460
ADO.NET parametrizzati è una best practice (e non una guideline) perché riduce la probabilità marketing@infomedia.it
di riuscita di un attacco di tipo “SQL injection”. Ovviamente sia le linee guida che le best
Amministrazione
practice non sono da intendersi come verità assolute, e ci sono casi in cui è conveniente o Sara Mattei
addirittura necessario infrangere le regole. (amministrazione@infomedia.it)
Già da questa descrizione sommaria si può intuire che in genere le best practice sono recepite Grafica
più facilmente dagli sviluppatori delle guideline, perché offrono un vantaggio immediato e Manola Greco (mgreco@infomedia.it)
tangibile: codice più sicuro, più veloce, e così via. Al contrario, utilizzare una coding guideline
Technical Book
richiede molta disciplina e attenzione e sembra offrire molto poco in cambio: codice più
Lisa Vanni (book@infomedia.it)
ordinato e pulito, ma non necessariamente più veloce. Ma questa è una percezione decisa-
mente errata. Alcune guideline riguardanti i linguaggi .NET possono considerarsi “ufficiali”, Segreteria
Enrica Nassi
in quanto promulgate direttamente da Microsoft: ad esempio, i nomi delle classi eccezioni (info@infomedia.it)
devono terminare con “Exception”, il nome dei metodi e dei campi pubblici deve essere in
PascalCase (ossia, le varie parole che lo compongono devono cominciare con una lettera
maiuscola), e così via. Le guideline ufficiali Microsoft non coprono davvero tutti i possibili Stampa
casi, ed è un bene perché linee guida troppo pignole e invasive andrebbero a scontrarsi con TIPOLITOGRAFIA PETRUZZI
Citta’ di Castello (PG)
lo stile di programmazione che ciascun programmatore ha sviluppato nel corso degli anni.
Però questa non è una buona scusa per non adottare nessuno stile di codifica: una guideline
Ufficio Abbonamenti
qualsiasi è sempre meglio di nessuna guideline. Quando due o più sviluppatori lavorano Tel. 0587/736460 - Fax 0587/732232
sullo stesso progetto, diventa importante mettersi d’accordo su uno stile di codifica il più e-mail: abbonamenti@infomedia.it
uniforme possibile, in modo da poter facilmente intervenire sul codice scritto dai propri www.infomedia.it
colleghi, oppure rivedere il codice a mesi o anni di distanza. Chiunque abbia la responsabilità Gruppo Editoriale Infomedia srl
di coordinare un gruppo (anche piccolo) di sviluppatori dovrebbe sentire una forte esigenza Via Valdera P., 116 - 56038 Ponsacco (PI) Italia
di uniformare il codice prodotto, per ridurre le spese di manutenzione, non dipendere troppo Tel. 0587/736460 - Fax 0587/732232
red_vbj@infomedia.it
dal turnover delle persone, e avere la possibilità di spostare più facilmente uno sviluppatore Sito Web www.infomedia.it
da un progetto all’altro. Ovviamente non basta accordarsi sullo stile di codifica per rendere gli
sviluppatori realmente interscambiabili, visto che ognuno ha le sue particolari competenze
(database, grafica, Web, ecc.), però è un passo nella direzione giusta. Manoscritti e foto originali anche se non pubblicati,
non si restituiscono. È vietata la riproduzione
anche parziale di testi e immagini.
Francesco Balena
fbalena@codearchitects.com Si prega di inviare i comunicati stampa e gli inviti stampa per
la redazione all’indirizzo: comunicatistampa@infomedia.it
Visual Basic Journal è una rivista di
Gruppo Editoriale Infomedia S.r.l. Via Valdera P, 116 Ponsacco - Pisa.
Registrazione presso il Tribunale di Pisa n. 20/1999
4 VBJ N. 62 - Marzo/Aprile 2005
Prima pensa in grande. Poi costruisci.
Con Visual Studio .NET 2003 puoi realizzare applicazioni Web aziendali
scrivendo meno codice: le tue idee diventano realtà più velocemente di

© 2004 Microsoft. Tutti i diritti riservati. Tutti i marchi registrati citati sono di proprietà delle rispettive società.
quanto tu possa immaginare. Lo stile RAD delle Web Form ti permette di
creare rapidamente applicazioni per qualsiasi browser e piattaforma. In
più, l’utilizzo della tecnologia IntelliSense all’interno del migliorato editor
HTML ti aiuta a velocizzare la scrittura dei tag. Tutto ciò significa che
puoi diventare più produttivo e più abile nel concretizzare le tue idee.
Misco Italy S.p.A, fornitore di prodotti per informatica e ufficio, ha
realizzato in ASP.NET un nuovo sito per offrire servizi completi ai propri
clienti. L’utilizzo di Visual Studio .NET e del debugger integrato, l’uso
dei controlli Web di ASP.NET e il nuovo linguaggio C# hanno garantito
tempi di sviluppo e di test senza precedenti.
microsoft.com/italy/vstudio/value/

205X275_VISUALBASIC_Mi#553CA.VS 1 2-12-2004, 17:19:09


SOMMARIO
M A R Z O / A P R I L E

N.62
SPECIALE

Scrivere add-in per Microsoft Access 8


Automatizzare i compiti ripetitivi riduce la possibilità di commettere errori, migliora l’efficienza e rende
il programmatore più sorridente.
di Gionata Aladino Canova

Stored Procedure sotto controllo 15


L’architettura a due livelli è tuttora il tipo di architettura più comune nelle applicazioni multi-utente,
e le stored procedure sono lo strumento favorito nella sua implementazione fisica. L’uso di stored
procedure solleva necessariamente delle problematiche legate alla consistenza dei dati e alla gestione
degli errori con T-SQL.
di Francesco Quaratino

Logica applicativa in programmi VB.NET (prima puntata) 19


Ogni gruppo di sviluppo che si occupi della realizzazione di applicazioni gestionali ha prima o poi sentito
l’esigenza di razionalizzare il proprio metodo di lavoro
di Lorenzo Vandoni

TDO Typed Data Object 23


TDO è l’acronimo di Typed Data Object (“oggetto dati tipizzato”), un insieme di strumenti e metodolo-
gie di supporto per lo sviluppo di applicazioni basate su piattaforma Microsoft .NET. In questo articolo
scopriremo come funziona e quali sono i vantaggi per lo sviluppatore.
di Andrea Ferendeles

ENTERPRISE
SOA e il .NET Framework (seconda puntata) 31
Aspetti pratici della Service Oriented Architecture per gli sviluppatori .NET
di Paolo Pialorsi

SOFTWARE ENGINEERING
I design pattern più famosi implementati in VB .NET (prima puntata) 36
In questa breve serie di articoli vedremo alcuni esempi di implementazione dei design pattern più noti
di Lorenzo Vandoni

6 VBJ N. 62 - Marzo/Aprile 2005


RUBRICHE

Editoriale 4
.NET Tools 60
a cura di Davide Mauri

Recensione libri 65

INTELLIGENZA ARTIFICIALE
Oracoli di Turing e Sistemi Logicamente Aperti 41
In questo articolo, anteprima assoluta, parliamo di Nuove Frontiere della Computazione: “frontiere” che hanno a che fare
con il concetto stesso di computazione oltre il limite di Turing. In particolare sono illustrate due teorie della computazione,
unite da un mix di idee nuove, tra cui la ricerca sui “sistemi logicamente aperti”.
di Ignazio Licata
ARCHITECT'S CORNER
Un cluster in 15 clic 46
Specialità del giorno. Soluzioni pratiche invece della teoria.
di Ingo Rammer
PRIMO PIANO
Verso la sanità elettronica 51
di Alberto Rosotti

I MITI
Configurazione e deployment in ASP.NET 56
Vediamo come ASP.NET risolve molte delle limitazioni che affliggevano ASP.
di Dino Esposito

Codice allegato
All’indirizzo ftp.infomedia.it/pub/VBJ sono liberamente scaricabili tutti i listati relativi agli articoli pubblicati.
La presenza di questa immagine indica l’ulteriore disponibilità, allo stesso indirizzo, di un progetto software
relativo all’articolo in cui l’immagine è inserita. Il nome identifica la cartella sul sito ftp.

N. 62 - Marzo/Aprile 2005 VBJ 7


ACCESSO AI DATI

Scrivere add-in per


Microsoft Access
Automatizzare i compiti ripetitivi riduce la possibilità di commettere errori,
Addin
migliora l’efficienza e rende il programmatore più sorridente.

di Gionata Aladino Canova

I
l programmatore è un animale particolare, general- base autocomposizioni che creano
mente pigro ma dotato di molta inventiva. Chi ha let- piccole applicazioni già funzionan-
to “Gli uomini vengono da Marte e le donne da Ve- ti; esistono poi una vasta gamma
nere”, capisce facilmente che, per le sue caratteristi- di wizard che aiutano l’utente nei
che, il programmatore è quasi sempre maschio. Date compiti più disparati.
un problema ad un programmatore ed esso ve lo risol- Il limite di questi strumenti sta nel-
verà. Affidate allo stesso individuo un compito ripetiti- l’essere stati creati per acconten-
vo: dopo poche iterazioni vi svilupperà un sistema che tare il massimo numero possibile
faccia il lavoro al posto suo; questo succede anche se, di utenti (si tratta cioè di strumenti
in termini di lavoro complessivo, la seconda soluzione orizzontali). Quando, nel creare le
dovesse essere più onerosa! Tralasciando le conside- nostre applicazioni, ci troviamo di
razioni filosofiche, tutte le volte che si automatizza un fronte ad un compito ripetitivo per
processo ripetitivo, si produce più in fretta e si riduce cui non esiste nessuno strumento
la possibilità di commettere errori. In questo articolo ve- in Access, probabilmente abbia-
dremo come sviluppare uno strumento atto allo scopo, mo un’esigenza verticale. Il primo
che funziona dal lato Access, mentre in un prossimo passo per creare la nostra cassetta
appuntamento vedremo come sviluppare una ulteriore degli attrezzi sarà un’attenta analisi
aggiunta per l’editor VBE. Il codice è disponibile come di quello di cui avremo veramente
sempre al sito FTP di Infomedia ed il suo utilizzo è gra- bisogno. Appena scoperto cosa si
tuito; è fornito completo di sorgenti che possono esse- può fare con una semplice toolbar,
re modificati e ridistribuiti a condizione di non rimuove- è facile cadere nella tentazione di
re le indicazioni sull’autore. Per la comprensione del- aggiungerci tutto quello che ci vie-
l’articolo serve una discreta padronanza dell’ambiente ne in mente. Selezioniamo invece
di Access e la conoscenza del VBA; i concetti esposti ciò che ci è realmente utile e svi-
sono validi da Microsoft Access 2000 in poi. luppiamolo al meglio.

Motivi per estendere le funzionalità Tipi di aggiunte


di Microsoft Access Le funzionalità di Microsoft Ac-
Microsoft Access ha avuto un buon successo poiché cess possono essere estese in di-
unisce la potenza di un database relazionale alla facilità versi modi. Per lavorare con Mi-
di utilizzo tipica dei prodotti Microsoft. Sono fornite di crosoft Access è necessario avere
aperto un database.
Per i nostri scopi, consideriamo di
Gionata Aladino Canova programma dai bei tempi del Sinclair
avere aperto il database VBJ.mdb.
Spectrum. Laureato in Informatica, è titolare della Aladino Infor-
matica e socio di TDE Informatica srl. Sviluppa con Microsoft Possiamo scrivere una routine VBA
Access, VB.NET e realizza siti in ASP/ASP .NET. Può essere che colori tutte le maschere del da-
contattato tramite e-mail all’indirizzo info@aladinoinformatica.it tabase con un colore specifico, sal-

8 VBJ N. 62 - Marzo/Aprile 2005


ACCESSO AI DATI

varla dentro VBJ.mdb stesso


e richiamarla dalla finestra di
debug. Oppure possiamo sal-
vare la routine in un database
di libreria ed agganciarlo dal-
l’editor VBE tramite l’opzio-
ne Strumenti\Riferimenti. Lo
svantaggio di questi approc-
ci è che le routine sono inclu-
se nell’applicazione e che ser-
ve una certa conoscenza per
utilizzarle.
Il primo limite si avverte par-
ticolarmente quando le ap-
plicazioni gestite sono mol-
te, mentre il dover conoscere
bene uno strumento per poter-
lo utilizzare è controproducen-
te nell’ambito di un gruppo, in
quanto potrebbe portare alcu-
ne persone a non servirsene. I
wizard, oltre a velocizzare il la-
voro, aiutano ad osservare de- Figura 1 La barra degli strumenti “Aladino Developer Wizard Toolbar”
terminati standard, sia di inter-
faccia grafica che di codifica.
Le aggiunte vere e proprie, o
add-in, si classificano in • Titolo: “Il nostro primo add-in”
• Società: “VBJ”
• Menu componenti aggiuntivi: forniscono pul- • Commenti: “Versione 1.0 rilasciata il 1 marzo
santi o menu per funzionalità aggiuntive e si 2005”
trovano sotto Strumenti\Componenti aggiun-
tivi; Impostiamo una tabella con i campi revisione di
• Creazioni guidate: vengono lanciate creando tipo testo e descrizione di tipo memo. Salviamola
degli oggetti, come le maschere; con il nome “tblHistory” e lasciamo che Microsoft
• Creazioni guidate di controlli: sono gli aiuti lan- Access imposti per noi un campo contatore. Ades-
ciati automaticamente alla creazione di un nuo- so creiamo su questa tabella, tramite l’autocompo-
vo controllo; sizione, una maschera standard. Salviamola con il
• Generatori: vengono lanciati dal pulsante “Ge- nome “frmHistory”. Creiamo un modulo in cui inse-
nera” presente sul foglio delle proprietà di un riamo il codice riportato nel Listato 1.
oggetto ed aiutano ad impostare la proprietà Salviamo il modulo con il nome “modStart”. Tra-
a cui appartengono. mite Strumenti\Proprietà di Access<numero versio-
ne>, impostiamo il nome del progetto a “VBJWi-
Inoltre si possono utilizzare aggiunte anche per zard”. Creiamo una toolbar chiamandola “VBJTool-
l’editor VBE. Vediamo adesso come costruire una bar”. Aggiungiamo dalla sezione Comandi\Categorie\
barra degli strumenti come menu componente ag- Struttura Maschera\Report il pulsante “Allinea a sini-
giuntivo. Per maggiori dettagli e per gli altri tipi di stra”. Duplichiamo il pulsante e impostiamo sul du-
aggiunte, si veda [1]. plicato, tramite tasto destro, Proprietà:

Creare ed utilizzare un add-in • Didascalia: “Visualizza la data”


Il processo per creare un menu componente ag- • Azione: =VBJWizMiaFunzione()
giuntivo è poco più complicato di quello che ser-
ve per generare un’applicazione. Creiamo il data- Volendo, possiamo cambiarne l’icona. Chiudiamo
base VBJWiz.mdb. Tramite il menu File/Proprietà il database e rinominiamo il file in “VBJWiz.mda”,
scriviamo nei campi che è l’estensione standard per le aggiunte.

N. 62 - Marzo/Aprile 2005 VBJ 9


ACCESSO AI DATI

giunto, l’add-in sarà disponibile


Listato 1 Il codice da inserire nel modulo dell'add-in
solo per i database .mdb.
Se il valore del campo value
è impostato a 1, l’add-in sarà
Option Compare Database disponibile solo per i databa-
Option Explicit se .mdb; 2 per rendere dispo-
nibile l’add-in per i file di pro-
Function VBJWizStart()
DoCmd.OpenForm «frmHistory» getto .adp; 3 rende disponibi-
MsgBox “Il Wizard è partito!”, vbInformation, “VBJ Wizard” le l’add-in per entrambi i tipi
End Function di file. In realtà la tabella USy-
sRegInfo consente molte altre
Function VBJWizMiaFunzione()
Dim str As String possibilità: per maggiori det-
Select Case Application.CurrentProject.ProjectType tagli vedere [2]. Copiamo il file
Case acADP VBJWiz.mda in C:\Documents
str = “Il wizard sta lavorando per un file .adp.”
Case acMDB
and Settings\<nome utente>\
str = “Il wizard sta lavorando per un file .mdb.” Dati applicazioni\Microsoft\
Case Else AddIns. È ovviamente possibile
str “Impossibile determinare il tipo di progetto.” creare il database già nella car-
End Select
MsgBox str & vbCrLf & “Oggi è il “ & Date, vbInformation, “VBJ Wizard” tella di destinazione, ma convie-
End Function ne copiarvi solo le versioni del-
l’add-in già collaudate e lasciare
quelle in sviluppo in una cartella
Adesso dobbiamo creare una tabella che con- separata. Creiamo ora un data-
senta ad Access di recuperare le informazioni di base che si chiama “VBJ.mdb”. Tramite il menu
installazione della nostra aggiunta. Tramite il menu Strumenti\Componenti aggiuntivi\Gestione Com-
Strumenti\Opzioni\Visualizzazione, abilitare l’op- ponenti aggiuntivi, troverete tra le altre eventuali
zione “Oggetti di sistema” che consente la visua- aggiunte, quella appena creata. Fatevi un doppio
lizzazione degli oggetti di sistema. Creiamo una click. Se non succede nulla, allora è tutto a posto
tabella con i seguenti campi: :-). Aprite nuovamente Strumenti\Componenti ag-
giuntivi e selezionate la nuova opzione VBJ Tool-
• Subkey (testo -255 caratteri) bar. Ecco il vostro Wizard che vi saluta. Aggiungen-
• Type (Intero lungo) do alla funzione VBJWizStart come prima riga
• ValName (testo -255 caratteri)
• Value (testo -255 caratteri) Function VBJWizStart()
CommandBars(“VBJToolbar”).Visible = True
Salviamo la tabella con il nome “UsysRegInfo” MsgBox “Il Wizard è partito!”, vbInformation, “VBJ
ed aggiungiamo quattro record con le informazio- Wizard”
ni riportate in Tabella 1. End Function
Il campo SubKey è uguale per tutti e quattro i
record; se utilizzate Access 2003 il valore giusto e riavviando il wizard dal database VBJ.mdb, no-
è 11.0, per Access XP è 10.0 e per Access 2000 terete che compare la toolbar creata nell’add-in:
è 9.0. Nel campo value del se-
condo record è riportata la fun-
zione che verrà lanciata al cari-
camento dell’aggiunta e nel ter-
zo record il nome del file conte-
nente la nostra aggiunta.
Come si nota, l’aggiunta po-
trebbe essere memorizzata in
qualsiasi cartella, sarebbe suf-
ficiente sostituire la keyword
ACCDIR con il percorso com- Figura 2 I pulsanti della “Aladino Developer Wizard Toolbar”
pleto. Il quarto record è in real-
tà opzionale: se non viene ag-

10 VBJ N. 62 - Marzo/Aprile 2005


ACCESSO AI DATI

lavorando su una qualsiasi form,


adesso avrete a portata di mano
un pulsante per allineare i con-
trolli, interamente gestito da Ac-
cess ed uno per vedere l’ora, alla
cui pressione viene lanciato il vo-
stro codice.

Accedere agli oggetti da


modificare
Un add-in è un database utiliz-
zato da un altro database. En-
trambi hanno, ad esempio, l’in-
sieme delle maschere.
Per far riferimento agli ogget-
ti del database in sviluppo, uti-
lizzeremo CurrentProject, men-
tre con CodeProject accedere-
mo a quello dell’add-in. Apria-
mo VBJ.mdb e lanciamo il no-
stro add-in: dalla finestra di de-
Figura 3 Compilare del codice basato sui campi di una tabella diventa
bug possiamo scrivere velocissimo

?codeproject.AllForms(0).Name
si lavora; come si può intuire, le potenzialità sono
ed otterremo frmHistory, che è il nome della sola enormi. Per avere un’idea di cosa è possibile fare,
maschera contenuta nel file VBJWiz.mda. è sufficiente considerare che i wizard di Access
L’add-in può lavorare sulla maschera seleziona- sono realizzati in Access e VBA!
ta tramite le istruzioni Per progettare un add-in, è bene considerare i
seguenti passi:
Screen.ActiveForm.SetFocus
Set frm = Screen.ActiveForm • Identificare quali sono le funzioni desiderate
• Dividere le funzioni già fornite da Access da
Ovviamente, una volta che si è impostato il rife- quelle da creare; ad esempio, allineare a de-
rimento alla maschera, si può iterare sull’insieme stra i controlli è una funzione già inclusa
dei controlli o navigarne il modello a oggetti. • Realizzare le funzioni non incluse nel databa-
E se volessimo aggiungere del codice che ge- se dell’add-in e collaudarle
stisce un evento? Il modello ad oggetti di Access • Realizzare nell’add-in una toolbar o un menu
ci aiuta: il codice descritto nel Listato 2 aggiun- che richiami tutte le funzioni volute
ge l’evento Click alla form selezionata in quel mo- • Pubblicare l’add-in
mento. Un particolare degno di nota è il metodo
CreateEventProc, che crea automaticamente la Una menzione speciale merita la denomina-
dichiarazione della funzione con i parametri ne- zione degli oggetti. Conviene cercare un prefis-
cessari e la posiziona al giusto posto nel modulo so inusuale sia per gli oggetti di database che
associato alla maschera. per le funzioni.
In pratica, una volta creato il riferimento al mo- Access è abbastanza intelligente da tenere
dulo associato alla maschera, è sufficiente dichia- separati gli spazi dei nomi; infatti, creando nel
rare l’evento da creare e poi inserirvi le righe di database VBJ.mdb una funzione che si chia-
codice volute. ma “VBJWizMiaFunzione”, ossia uguale a quel-
la presente nell’add-in, il pulsante della toolbar
Progettare un add-in continuerà a richiamare quella giusta. Comunque,
L’esempio appena visto consente di capire che esplorando il progetto può essere utile ricono-
si possono costruire tabelle, form e codice che scere al volo dove una certa funzione sia stata
stanno in un database separato da quello su cui implementata, grazie al suo nome.

N. 62 - Marzo/Aprile 2005 VBJ 11


ACCESSO AI DATI

Tabella 1 Informazioni da inserire nella tabella USysRegInfo

Subkey Type ValName Value

HKEY_LOCAL_MACHINE\Software\Microsoft\Office\
0
11.0\Access\Menu Add-Ins\&VBJ Toolbar
HKEY_LOCAL_MACHINE\Software\Microsoft\Office\
1 Expression =VBJWizStart()
11.0\Access\Menu Add-Ins\& VBJ Toolbar
HKEY_LOCAL_MACHINE\Software\Microsoft\Office\ |ACCDIR\
1 Library
11.0\Access\Menu Add-Ins\& VBJ Toolbar VBJWiz.mda
HKEY_LOCAL_MACHINE\Software\Microsoft\Office\
4 Version 3
11.0\Access\Menu Add-Ins\& VBJ Toolbar

Per distribuire un add-in senza fornire l’accesso Un caso reale


ai sorgenti, ci sono due possibilità: proteggere Per stuzzicare l’appetito, ho corredato quest’arti-
il progetto dalla visualizzazione tramite una pas- colo dell’add-in che utilizzo per programmare, vi-
sword, oppure convertire il database in formato sibile in Figura 1. Sia perché ci sono delle funzio-
.MDE. Il file MDE impedisce l’accesso ai sorgen- ni a mio parere utili, sia perché è possibile trovare
ti, che sono stati fisicamente rimossi, ed anche più materiale da analizzare che in un esempio di-
alla struttura della maggior parte degli oggetti. I dattico. Partiamo dalla password per visualizzare
wizard di Access sono (purtroppo) generati pro- il progetto che è “VBJ” (maiuscolo!). La password
prio con questa tecnica. In alcuni casi, con le ver- è utile per evitare che, lavorando sul database di
sioni per sviluppatori di Access, essi sono sta- applicazione, ci si trovi aperta ed espansa nell’al-
ti rilasciati anche in formato sorgente e, per chi bero del progetto anche la sezione relativa all’add-
vuole studiare determinati meccanismi, si tratta in. Nella tabella nascosta USysRegInfo, i record
di una vera manna. sono 9 invece che 3, per permettere all’add-in di
essere utilizzato sotto Access
2000/2002/2003.
Listato 2 Codice che aggiunge l'evento Click
I moduli sono divisi per fun-
zionalità. In modInizializza ci
sono le funzioni di inizializ-
Function VBJWizAggiungiEvento() zazione e di richiamo delle
Dim frm As Form maschere. Il modulo modAg-
Dim ctl As Control giungiAMenu contiene il codi-
Dim mdl As Module
Dim lng As Long ce per realizzare il menu a ten-
Dim strCode As String dina che compare premendo
il pulsante Dim della toolbar,
Screen.ActiveForm.SetFocus mentre in modAladinoWizard
Set frm = Screen.ActiveForm
si trovano le routine di auto-
Set mdl = frm.Module mazione.
L’ultimo modulo, modAPI,
‘ Aggiunge la procedura evento.
contiene il codice basato su
lng = mdl.CreateEventProc(“Click”, Replace(“Corpo”, “ “, “_”))
API per ridimensionare la fi-
‘ Cancella una riga vuota nestra di Access.
mdl.DeleteLines lng + 1, 1 Il wizard è utilizzabile a fini
strCode = vbTab & “’ Evento aggiunto dal Wizard” & vbNewLine & vbTab &
didattici o per lo sviluppo di
“MsgBox “”Evento On_Click””, VbInformation” applicazioni. Le migliorie pos-
sibili sono molte.
‘ Inserisce il corpo della procedura. Per esempio, il wizard non
mdl.InsertLines lng + 1, strCode
lavora correttamente, in alcu-
End Function ni casi, selezionando una sot-
tomaschera. Oppure, talvolta,

12 VBJ N. 62 - Marzo/Aprile 2005


ACCESSO AI DATI

richiede che sia abilitata la visualizzazione dell’in- pi di tipo data. Se la provate, non funzionerà, sem-
testazione e del pié di pagina maschera. plicemente perché il codice

Le funzioni app.SelezionaData Screen.ActiveControl, Me.hwnd ‘ Apre il


In Figura 2 è rappresentata la toolbar dell’Aladi- calendario
no Wizard con dei numeri per identificare ogni pul-
sante. I numeri 1,2,4,5,6,7,8,9,10 sono le comuni fa riferimento ad una routine di una mia libreria.
funzioni di formattazione di Access, riportate nella Ho ritenuto opportuno includerla perché mostra
barra per praticità. Il pulsante 3 risolve il problema come si possa automatizzare lo sviluppo di ap-
di centrare più controlli tra loro. plicazioni, definendo alcune routine all’interno di
Tramite il pulsante 11, si imposta l’ordine di ta- una libreria ed applicandole facendo uso di un wi-
bulazione dei soli controlli selezionati. Ad esempio, zard. Le opzioni 19 e 20 colorano un campo con il
se si sta realizzando una maschera con due co- colore predefinito per il collegamento. Nello stan-
lonne, si seleziona la prima colonna di controlli e dard che ho adottato, ogni campo dove funziona il
si preme il pulsante. Al termine, viene comunque doppio click è colorato con un giallo chiaro. Con
visualizzata la finestra standard per l’ordine di ta- il tasto 21 viene generato il codice che apre una
bulazione di Access. maschera con determinati criteri. Ad esempio, in
Le opzioni 12, 13 e 14 sono utili nel realizzare ma- un ordine ho l’IDAnagrafica: volendo aprire la ma-
schere tabulari. Per vederle in azione, creare una schera frmAnagrafica selezionando l’IDAnagrafica
maschera standard a colonne, poi premere 13: il che ho nel codice, il wizard scrive il codice giu-
wizard sposterà tutte le etichette nell’intestazione. sto. Il tasto 22 offre una funzione carina. Permet-
Dopo aver impostato i campi alla larghezza voluta, te infatti di scegliere tra le migliaia di icone fornite
premere 12: il wizard formatterà la maschera per con Access. Ogni icona ha un ID: una volta saputo
voi. Selezionando un campo e premendo 14 ver- l’ID, con poche righe di codice la si può imposta-
rà creato, nel pié di pagina, un campo con origi- re. Tutte le icone della toolbar sono state scelte
ne =Somma(<nomecampo>). La differenza rispet- in questo modo. Un esempio è la Figura 4. Nella
to a quelle create da Access sta nel poter modifi- maschera è riportato anche lo schema di codice
care la larghezza di un singolo campo e riformat- utile per raggiungere il controllo di cui cambiare
tare correttamente tutta la maschera premendo l’icona. L’opzione 23 consente di dimensionare
un solo tasto. la finestra di Access in formati standard. Si rive-
Il 15 serve nelle maschere continue o in quelle la utile per collaudare un’applicazione all’effetti-
visualizzate in modalità a foglio dati. Introduce del va risoluzione alla quale verrà utilizzata, per evita-
codice che intercetta la pressione
della freccia in basso ed in alto
e le trasforma in un movimento
in avanti o indietro di un record.
Il codice associato a questo pul-
sante dimostra come sia facile in-
serire del codice associato ad un
controllo nel nostro progetto. Il
tasto 16 associa a tutti i cam-
pi percentuale una routine che,
se il valore inserito è maggiore o
uguale di 1, lo divide per 100. In
pratica, scrivendo 20 nel campo,
la routine lo trasformerà in 0,20,
che Access vede come 20%.
Il tasto 17 apre una maschera
che permette di creare del codi-
ce basato sui campi di una ta-
bella del database locale, come
si vede nella Figura 3. Il tasto 18 Figura 4 Uno strumento per scegliere tra le migliaia di icone presenti in
aggiunge una routine che visua- Access
lizza un calendario, utile sui cam-

N. 62 - Marzo/Aprile 2005 VBJ 13


ACCESSO AI DATI

con righe nel mezzo, ma se vo-


Listato 3 Codice per creare il menu a discesa nella barra degli strumenti
lessi commercializzare il wizard,
dovrei eliminare anomalie simili.
Quando si lavora su maschere,
Public Sub InsertDropDownx() è necessario discriminare se il
Dim ctlCombo As CommandBarComboBox controllo selezionato dall’uten-
Set ctlCombo = CommandBars(“Aladino Developer Wizard Toolbar”).Controls.
te si trovi su una maschera o su
Add(msoControlDropdown)
With ctlCombo una sottomaschera, impostando
.BeginGroup = True correttamente i riferimenti.
.AddItem (“640x480”) La gestione degli errori riveste
.AddItem (“800x600”)
una parte fondamentale; inter-
.AddItem (“1024x768”)
.AddItem (“1280x1024”) cettare correttamente un erro-
.AddItem (“Massimizza”) re e identificare la routine dove
.BeginGroup = True esso si è verificato è fondamen-
.AddItem (“Dimensione massima”)
.Caption = “Dimensione finestra di Access”
tale per motivi diversi, sia in fase
.Tag = “DimensioneFinestraAccess” di sviluppo che in produzione.
.Width = 120 Durante il collaudo dell’add-in,
End With è importante identificare la parte
End Sub
di codice che produce l’errore,
poiché può essere già comples-
re che maschere sviluppate magari a 1280x1024 so riprodurre la situazione in cui esso si verifica.
non entrino nello schermo dell’utente che – sic – Si consideri un ambiguo messaggio tipo “Impos-
lavora ancora a 800x600. Per creare il menu a di- sibile trovare il nome di funzione immesso nel-
scesa nella barra degli strumenti viene utilizzata la l’espressione”. Senza altre indicazioni, può trat-
routine descritta nel Listato 3, che dimostra an- tarsi del fatto che Access non riesce a richiamare
cora una volta la versatilità delle toolbar e la ma- la funzione specificata nel pulsante, oppure può
neggevolezza delle stesse, fornita dal modello ad trattarsi di un errore generato nella funzione richia-
oggetti. L’opzione 24 disattiva la clessidra, rima- mata. Gestire un errore in produzione, consente
sta attiva dopo un blocco del programma. Infine probabilmente di proseguire il lavoro senza pro-
le opzioni 25 e 26 visualizzano rispettivamente le blemi. Se l’errore non è gestito, l’utente potrebbe
opzioni e le informazioni sul wizard. interrompere l’esecuzione del codice distruggen-
do così eventuali variabili globali. A quel punto, il
Trucchi e problemi wizard dovrebbe essere rilanciato.
La parte più complessa nella realizzazione di un
wizard, consiste nel prevedere tutti i possibili am- Conclusioni
bienti in cui esso verrà impiegato. Una differenza Se sviluppate spesso applicazioni in Access e
rilevante è tra lavorare su un database (file .mdb) non avete mai creato un add-in, è il momento buo-
o su un progetto (file .adp); potrebbe essere ne- no per farlo. Create il minimo indispensabile ed
cessario, ad esempio, generare codice SQL di- usatelo: in breve comincerete ad arricchirlo di fun-
verso nei due casi, anche solo variando i carat- zioni. L’add-in allegato è un buon punto di parten-
teri jolly che sono l’asterisco per l’mdb e la per- za. Inoltre, se sviluppate in un gruppo, l’adozione
centuale per l’adp. Possiamo dotare il wizard della di un add-in comune a tutti i programmatori aiuta
capacità di discernere su quale tipo di file sta la- a mantenere degli standard di programmazione.
vorando. Nella funzione VBJWizMiaFunzione vie- Invito chiunque abbia qualche buona idea da svi-
ne stampato un messaggio che evidenzia il tipo luppare a contattare me o la redazione.
di file correntemente aperto, grazie alla proprietà
Application.CurrentProject.ProjectType. Bibliografia & Riferimenti
Se si effettua un ciclo sull’insieme dei controlli, [1] Ken Getz, Paul Litwin, Mike Gilbert - “Ac-
è necessario assicurarsi di trattare correttamente i cess 2000 Manuale di programmazione”, Jack-
diversi tipi di oggetti. Ad esempio, nel mio wizard, son Libri, 2000
se in una maschera aggiungete una riga e prova- [2] “Creating the USysRegInfo Table for
te la funzione 12, otterrete l’errore di “Proprietà o a Microsoft Access 2000 Add-In “, http://
metodo non supportati dall’oggetto”. Ovviamente msdn.microsoft.com/library/default.asp?url=/
non ho mai la necessità di formattare maschere library/en-us/dnacc2k/html/usysregacc2k.asp

14 VBJ N. 62 - Marzo/Aprile 2005


ACCESSO AI DATI

Stored Procedure
sotto controllo
L’architettura a due livelli è tuttora il tipo di architettura più comune nelle applicazioni
multi-utente, e le stored procedure sono lo strumento favorito nella sua implementazione
fisica. L’uso di stored procedure solleva necessariamente delle problematiche legate alla
consistenza dei dati e alla gestione degli errori con T-SQL.

di Francesco Quaratino

L'
introduzione delle stored procedure (SP) ha evitando così l’interazione impro-
permesso di spostare buona parte della lo- pria con i dati da parte degli utenti
gica dell’applicazione nel DBMS, apportan- non autorizzati. Infatti, è possibile
do notevoli benefici nello sviluppo e nella manuten- concedere ad un utente di data-
zione dell’applicazione stessa. base il diritto d’esecuzione di una
L’aspetto forse più evidente delle stored procedure è SP indipendentemente dai diritti
quello prestazionale, poiché il codice in esso conte- d’accesso alle tabelle interessate,
nuto è compilato ed ottimizzato dal DBMS e lo stes- assegnati allo stesso utente. SQL
so piano d’esecuzione della SP è riusato da altre ses- Server permette di avere fino a 32
sioni concorrenti. livelli di nidificazione (nesting) di
L’impiego più efficiente della rete rende le architettu- SP che consentono di incapsulare
re basate su SP notevolmente scalabili. Infatti, al mo- in ogni procedura singole opera-
mento della richiesta di esecuzione di una SP, il client zioni secondo i dettami della pro-
invia al server unicamente i parametri di input della gettazione strutturata.
SP piuttosto che l’intera istruzione T-SQL, producen- È molto meglio scrivere N pro-
do in tal modo un traffico di rete minore. Dal punto cedure articolate in una struttu-
di vista ingegneristico, le SP garantiscono una forte ra “chiamante/chiamato” piutto-
centralizzazione della manutenzione della logica del- sto che scrivere un’unica proce-
l’applicazione e una distribuzione degli aggiornamen- dura che racchiude in sé l’intero
ti a dir poco immediata, dal momento che modificare codice T-SQL.
il codice di una SP non richiede alcun intervento sul La prima soluzione è più vantag-
client, il quale si aspetta soltanto di trovare lo stesso giosa per la creazione, il test e la
nome di procedura e stessi nomi e tipi di parametri manutenzione e garantisce il riu-
nel database a cui è connesso. so più oculato dei piani di esecu-
Attraverso le SP è possibile anche implementare un zione da parte del DBMS.
meccanismo di sicurezza dei dati – incapsulando de- Ad ogni modo occorre fare suf-
finitivamente la logica racchiusa nel codice delle SP – ficiente attenzione alla consisten-
za dei dati trattati nella SP, poiché
al di là dei vincoli d’integrità refe-
renziale applicati nel database, un
Francesco Quaratino è consulente in ambito di progettazione
controllo superficiale degli erro-
e amministrazione di database OLTP e OLAP, oltre che di
applicazioni software orientati ai dati. È certificato MCDBA e ri generati nell’esecuzione di una
sviluppa in VB6, ASP, VB.NET e ASP.NET. Può essere contatto stored procedure può dar luogo a
all’indirizzo e-mail: fquaratino@infomedia.it transazioni non consistenti.

N. 62 - Marzo/Aprile 2005 VBJ 15


ACCESSO AI DATI

ni multiple che la logica dell’applicazione vuole


Listato 1 Esempio dell’uso di XACT_ABORT ON
che siano completate tutte insieme.
per causare il roll back automatico del-
la transazione al verificarsi di un errore Le transazioni esplicite devono essere dichia-
rate esplicitamente, racchiudendo le istruzioni
coinvolte nella transazione tra un’istruzione di
SET XACT_ABORT ON BEGIN TRAN[SACTION] (che ne determina l’ini-
zio) e una COMMIT TRAN[SACTION] o ROLL-
BEGIN TRAN
BACK TRAN[SACTION] a seconda che si voglia
/*Istruzione 1*/ rispettivamente dare effetto o meno a tutte le
INSERT INTO authors (au_id, au_lname, au_fname, istruzioni precedenti che seguono l’istruzione di
phone, contract)
BEGIN TRAN.
VALUES (‘000-00-0000’,’Alberto’,’Grossi’,’801
826-0752’,1) Ad eccezione degli errori di sistema (system
failure) che causano un rollback della transa-
/*Istruzione 2*/ zione (sia essa implicita che esplicita), il DBA
INSERT INTO authors (au_id, au_lname, au_fname,
dovrà preoccuparsi di controllare il verificarsi
phone, contract)
VALUES (‘000-00-0000’,’Franco’,’Cirri’,’800 800- dell’errore sollevato durante una qualsiasi del-
0751’,1) le istruzioni contenute nella transazione esplici-
ta, per ordinarne il rollback; altrimenti sarà stato
COMMIT TRAN
del tutto inutile aver esplicitato la transazione,
/*Istruzione 3*/ poiché l’esecuzione del codice T-SQL seguen-
UPDATE authors SET contract=0 te continuerà ad essere processato.
GO In altre parole, nell’ambito di un batch o di una
transazione, un errore non di sistema causa il
fallimento della sola istruzione che genera l’er-
rore senza condizionare le altre istruzioni.
Lo scopo del presente articolo è analizzare gli Anche le SP non si sottraggono a questo aspet-
strumenti a disposizione di un DBA SQL Ser- to spesso frainteso: il fatto che la transazione
ver per la gestione degli errori in T-SQL, fino a sia per definizione una singola unità di lavoro
giungere a un modello efficace di gestione e lato server, non vuol dire che un errore gene-
diagnostica degli errori nelle SP. rato da un’istruzione causi il rollback automati-
co della transazione.
Transazioni e consistenza dei dati
Nel trattare il concetto di consistenza dei dati
di un database, il pensiero va innanzitutto alla
definizione dei vincoli di integrità referenziale e Un controllo superficiale
in secondo luogo alla salvaguardia delle tran- degli errori nelle stored
sazioni implicite ed esplicite.
Quelle implicite sono rappresentate dalle singo- procedure può dar luogo a
le istruzioni di modifica dei dati (INSERT, UPDA-
TE, DELETE). In presenza di transazione implici-
transazioni non consistenti
ta, al verificarsi di un errore, sia esso dell’utente
(ad esempio violazione di vincoli) o del sistema
(ad esempio indisponibilità del sever), il DBMS si Tuttavia, impostando a ON la variabile XACT_
preoccupa di fare il rollback dell’istruzione, ov- ABORT, si ottiene questo comportamento da
vero riportare lo stato dei dati all’istante imme- SQL Server (vedi Listato 1).
diatamente precedente all’esecuzione non riu- Attenzione, però, ai batch che includono più
scita, mentre se non ci sono intoppi sarà ese- transazioni, in quanto XACT_ABORT influenza
guito il commit della transazione. l’intero batch interrompendo l’esecuzione del
In caso di transazione implicita, la gestione batch al verificarsi del primo errore.
della transazione viene delegata al DBMS ed Di conseguenza ogni altra transazione che se-
essa avviene in modo del tutto trasparente al- guisse quella al cui interno è stato generato l’er-
l’utente, mentre attraverso le transazioni espli- rore non sarebbe mai eseguita.
cite il DBA può creare un’unica unità di lavo- Nell’esempio del Listato 1, supponendo che
ro (atomic unit of work) composta da istruzio- l’Istruzione_2 violi un vincolo di chiave prima-

16 VBJ N. 62 - Marzo/Aprile 2005


ACCESSO AI DATI

ria, ne risulterebbe che non solo l’Istruzione 1 esterne – che altimenti solleverebbero un errore
non avrebbe effetto, ma anche che l’Istruzione numero 3903 (che denota appunto l’assenza di
3 non sarebbe processata. una transazione aperta).
Allo scopo di rendere più leggibile una struttu-
ra di transazioni nidificate, è buona norma dare
un nome a ciascuna transazione.
Con le transazioni esplicite Se si sceglie di seguire questa norma, sarà
il DBA può creare delle ato- bene ricordare che è possibile specificare il
nome della transazione per ogni BEGIN e COM-
mic unit of work composte MIT TRAN e solo per il ROLLBACK TRAN più
esterno, altrimenti verrà generato un errore nu-
da istruzioni multiple mero 6401.

Un modello di gestione degli errori


Un’alternativa più laboriosa ed effi cace a
Se a prima vista XACT_ABORT può sembra- XACT_ABORT ON è rappresentata dall’uso con-
re una soluzione veloce ed efficace da imple-
mentare nelle nostre SP, essa non è la miglio-
re, poiché non consente un controllo dell’erro-
re e quindi non dà la possibilità di specificare Listato 2 Esempio di gestione degli errori nelle
una reazione a un errore specifico. stored procedure nidificate
Inoltre, tale impostazione non ha effetto sugli
errori di sintassi generati a run-time dall’esecu-
/* Procedura chiamata */
zione di una stringa costruita dinamicamente at- CREATE PROC sp_B
traverso il comando EXECUTE (‘Stringa_Sql’). AS
Si noti come tali errori sfuggano al control- DECLARE @ERROR int
lo sintattico e si verifichino unicamente duran- BEGIN
BEGIN TRAN B
te l’esecuzione. INSERT INTO …
SET @ERROR = @@ERROR
Nested Transaction IF @ERROR <> 0
GOTO ERRORS
Ogni SP può contenere infinite chiamate ad
COMMIT TRAN B
altre SP, mentre può chiamare sé stessa ricor- RETURN 0
sivamente fino a raggiungere 32 livelli di nidi- ERRORS:
ficazione. RAISERROR (‘Procedure sp_B failed’,16,1) WITH LOG
COMMIT TRAN B
Anche le transazioni possono essere nidifica- RETURN @ERROR
te, sia attraverso SP nidificate che in un’unica END
sequenza di istruzioni T-SQL inclusa in uno o GO
più batch.
/* Procedura chiamante */
Un qualsiasi ROLLBACK TRAN provoca il roll CREATE PROC sp_A
back a tutti i livelli della struttura delle transazio- AS
ni nidificate, mentre soltanto il COMMIT TRAN DECLARE @ERROR int
del blocco più esterno dà valore a tutti i com- BEGIN
BEGIN TRAN A
mit di qualsiasi livello. EXEC @ERROR = sp_B
Per tenere sotto controllo i livelli di transazio- IF @ERROR <> 0
ne è possibile interrogare la funzione di sistema GOTO ERRORS
@@TRANCOUNT che viene incrementata ad ogni EXEC @ERROR = sp_C
IF @ERROR <> 0
BEGIN TRAN e decrementata da ogni COMMIT GOTO ERRORS
o ROLLBACK TRAN. COMMIT TRAN A
Si noti che solo quando @@TRANCOUNT è RETURN 0
ERRORS:
uguale a 1 ha effetto il commit. Dopo un ROL-
ROLLBACK TRAN A
LBACK TRAN sarà indispensabile controllare RAISERROR (‘Procedure sp_A failed’,16,1) WITH LOG
che il valore restituito da @@TRANCOUNT sia RETURN @ERROR
diverso da 0, per evitare di effettuare ulteriori END
GO
COMMIT o ROLLBACK TRAN delle transazione

N. 62 - Marzo/Aprile 2005 VBJ 17


ACCESSO AI DATI

giunto della funzione @@ERROR e delle istru- Quindi, sia il roll back che il commit sono de-
zioni RETURN, GOTO e RAISERROR. legati alla sp_A più esterna, dove il flusso di
La funzione di sistema @@ERROR ha lo sco- esecuzione giunge per mezzo dei due RETURN
po di catturare il numero dell’errore intercorso presenti nelle procedure chiamate. Inoltre, i RE-
nell’esecuzione di un’istruzione T-SQL. Se il va- TURN comunicano il numero di errore a sp_A,
lore restituito è uguale a 0, significa che è an- che è quindi in grado di decidere la sorte della
dato tutto liscio. transazione dell’intera struttura nidificata.
Nel valutare il valore restituito da @@ERROR Si noti il modo in cui viene recuperato il valo-
occorre fare attenzione al fatto che il suo valore re restituito dal RETURN durante l’esecuzione
viene alterato dall’esecuzione di una qualsiasi delle procedure interne – che avviene attraver-
altra istruzione T-SQL che la segue (per inten- so il comando EXEC[UTE].
derci anche un IF). In presenza di un errore, RAISERROR consen-
Ne consegue che è buona norma assegnarne te la comunicazione al client di un messaggio
sempre il valore a una variabile, in modo da po- ad-hoc, definito dall’utente, e la registrazio-
terne valutare il contenuto anche in seguito, e ne dello stesso nel log degli eventi, attraverso
soprattutto interrogare la funzione subito dopo l’opzione WITH OPTION.
ogni istruzione di interazione col database: In questo modo fornisce al DBA uno stru-
mento di diagnostica veloce e facile da im-
INSERT INTO … plementare.
SELECT @ERROR = @@ERROR
IF @ERROR <> 0 Conclusioni
ROLLBACK TRAN L’inerzia della conoscenza è uno dei mali in-
curabili dell’informatica.
RETURN ordina l’uscita incondizionata da un In altre parole, quanto più consolidata è una
batch e restituisce alla procedura chiamante il tecnologia, tanto più difficile risulta modificar-
numero intero specificato (esempio RETURN 1). la, anche quando i benefici della neo-tecnolo-
GOTO fa saltare il flusso d’esecuzione ad un’eti- gia sono palesi e evidenti anche alle menti più
chetta specificata, mentre RAISERROR restitui- conservatrici.
sce al client un messaggio d’errore definito dal- L’architettura a due livelli è una dimostrazione
l’utente, con la possibilità di registrarlo nel log esemplare di tale fenomeno, tenuto conto che è
degli eventi del sistema. sicuramente il tipo di architettura software più
Supponiamo di avere una procedura sp_A che comune nelle applicazioni multi-utente orienta-
chiama in ordine sp_B e sp_C. Per semplicità te ai dati.
le procedure chiamate si intendono identiche Sovente le stored procedure non vengo-
(vedi Listato 2). no sfruttate appieno ma relegate ad assolve-
re funzioni particolarmente laboriose e lunghe
senza poterne sfruttare le qualità prestaziona-
li, ad esempio ignorando la possibilità di nidi-
XACT_ABORT ON causa ficazione.
il roll back automatico Inoltre, laddove si fa un uso considerevole di
SP, è bene non sottovalutare il controllo de-
della transazione al gli errori che potrebbero causare gravi incon-
sistenze dei dati e che sarebbero difficilmen-
verificarsi di un errore te rintracciabili senza un metodo di diagnosti-
ca efficace.

Il modello di gestione errori proposto presen- Bibliografia


ta, dal punto di vista delle transazioni, una tran- [1] K. Delaney – “Inside Microsoft SQL Server
sazione esplicita in ciascuna delle tre SP ed un 2000”, Mondadori Informatica, 2000
solo ROLLBACK TRAN nella sp_A più ester- [2] L. Braidi – “Database Design”, Tecniche Nuo-
na, mentre le sp_B e sp_C interne eseguono ve, 2004
in ogni caso un COMMIT TRAN, che sortirà il [3] G. Drapers – “IF Statements and Stored Pro-
solo effetto di decrementare il numero di tran- cedures Performance”, SQL Server Magazine/
sazioni attive. January 2005 – InstantDoc ID 44717

18 VBJ N. 62 - Marzo/Aprile 2005


ACCESSO AI DATI

Logica applicativa
in programmi VB.NET
Prima puntata

Ogni gruppo di sviluppo che si occupi della realizzazione di applicazioni gestionali ha


prima o poi sentito l’esigenza di razionalizzare il proprio metodo di lavoro

di Lorenzo Vandoni

Considerazioni preliminari

.N
ET fornisce molti strumenti per scrive-
re programmi con funzionalità di acces- In [3], prendendo spunto da
so ai dati, ma non offre un vero e pro- una discussione relativa ai pa-
prio framework per la realizzazione di applicazio- radigmi di accesso ai dati tipici
ni gestionali. dei linguaggi di programmazio-
Lo stesso vale per tutti gli altri strumenti di svilup- ne object-oriented, si era arriva-
po più diffusi, come Java e Delphi, prova ne sia la ti a ipotizzare la realizzazione di
proliferazione di strumenti CASE o framework spe- un’estensione ad ADO.NET per
cifici, come ad esempio [1] e [2]. creare delle classi polimorfiche
Chi sviluppa abitualmente applicazioni gestionali che facilitassero lo sviluppo di
è abituato a dover implementare spesso funziona- funzionalità lato server.
lità simili tra loro, come classi per la gestione del- Riassumo nei punti seguenti le
la logica applicativa, finestre per l’inserimento dei conclusioni a cui si era giunti:
dati, o report riassuntivi.
Quasi tutte le software house che lavorano in que- • il problema dell’impedance
sto ambito hanno creato insiemi di componenti, più mismatch, tipico delle ap-
o meno evoluti, allo scopo di generalizzare queste plicazioni object-oriented,
funzionalità e diminuire quindi il tempo necessario consiste nel fatto che ogget-
per sviluppare programmi simili. ti intrinsecamente comples-
In questo articolo, che può essere considerato si, come ad esempio il mo-
come l’ideale continuazione di [3], verrà discus- dello di un’automobile in un
sa una possibile soluzione per la realizzazione di programma CAD, debbano
classi .NET che implementino la logica applicativa essere rappresentati in me-
del programma. moria utilizzando strutture
dati diverse da quelle usate
per rappresentare gli stessi
oggetti in un DBMS relazio-
nale, con la conseguente ne-
Lorenzo Vandoni è laureato in Informatica, ed è uno spe- cessità di scrivere algoritmi
cialista di progettazione e sviluppo con tecniche e linguaggi
di traduzione per convertire
object-oriented. Ha collaborato alla realizzazione di framework,
strumenti di sviluppo e software commerciali in C++, Java e la rappresentazione di uno
Visual Basic. Può essere contattato tramite e-mail all’indirizzo stesso oggetto tra due for-
vandoni@infomedia.it. mati differenti;

N. 62 - Marzo/Aprile 2005 VBJ 19


ACCESSO AI DATI

Questo approccio è di fatto quello adottato


da ADO e ADO.NET, sia pure con modali-
tà diverse, ma risolve il problema dell’impe-
dance mismatch, perché obbliga a inserire di
volta in volta i comandi SQL che implemen-
tano le operazioni di caricamento e salvatag-
gio dei dati.

Considerando pregi e difetti di ciascuna so-


luzione, si era infine ipotizzata l’adozione di un
approccio intermedio, che permettesse di com-
portarsi in modo diverso a seconda del livello
Figura 1 Architettura delle classi necessarie per di complessità dell’oggetto rappresentato, uti-
implementare la logica applicativa lizzando una classe base Tabella nei casi più
semplici, e creando delle classi specifiche nei
casi più complessi.

• il modo migliore per affrontare il problema Considerazioni progettuali


– supponendo che la scelta del DBMS rela- L’obiettivo che ci poniamo è quello di proget-
zionale sia vincolante, e tralasciando, quin- tare una valida struttura per la realizzazione di
di, l’ipotesi di adottare strumenti di tipo di- classi .NET che implementino la logica applica-
verso per gestire la persistenza dei dati – è tiva di un programma, indipendentemente dal
quello di incapsularlo in uno strato softwa- fatto che si tratti di un’applicazione Windows
re omogeneo (middleware), che si preoccupi o Web, evitando di scrivere codice ripetitivo e
di convertire i dati da una rappresentazione ridondante.
object-oriented al modello relazionale, e vi- Il fatto di limitare la trattazione alla sola logi-
ceversa; ca applicativa significa che il discorso che se-
gue non prenderà in considerazione gli aspet-
• questo strato di software può essere realizzato ti relativi all’interfaccia grafica o all’interazione
implementando un insieme di classi, come ad con l’utente.
esempio Automobile (Listato 1), che fornisca-
no tutti i metodi necessari per espletare tutte
le operazioni necessarie per il reperimento, il
salvataggio e la ricerca dei dati; Chi sviluppa abitual-
• questa soluzione ha il vantaggio di fornire un
mente applicazioni
corretto incapsulamento del problema relati- gestionali è abituato a
vo all’accesso ai dati, e viene spesso citata,
in alcuni testi rivolti ai programmatori VB6, dover implementare
come “il” motivo principale per cui può ave- spesso funzionalità
re senso creare delle proprie classi, in appli-
cazioni di tipo gestionale. D’altra parte, que- simili tra loro
sta soluzione provoca la creazione di un nu-
mero eccessivo di classi del tutto simili tra
loro, che in molti casi, soprattutto nel caso
di dati strutturalmente semplici come quelli Considerando il classico paradigma MVC (Mo-
relativi a clienti e fatture, richiedono un’im- del-View-Controller), questo significa che pren-
plementazione del tutto banale e ripetitiva; deremo in esame solo la realizzazione del mo-
dello.
• una possibile alternativa consiste nella crea- La trattazione che segue sarà inoltre molto
zione di un’unica classe Tabella, che possa .NET-oriented.
essere genericamente utilizzata per accede- La progettazione cioè prenderà in considerazio-
re al contenuto di qualsiasi tabella sul data- ne l’attuale struttura delle classi del framework,
base. e in particolare quella di ADO.NET.

20 VBJ N. 62 - Marzo/Aprile 2005


ACCESSO AI DATI

Questo non significa però che le stesse con- gi e Ruota non è assimilabile ad un DataSet,
siderazioni non possano essere riportate su al- che rappresenta una collezione di tabelle, ma
tri linguaggi e librerie. piuttosto ad un DataRow, cioè ad una singo-
la riga di una tabella.
Architettura di ADO.NET Per questo motivo, la classe Automobile ver-
L’architettura di ADO.NET è molto più ricca rispet- rà creata come sottoclasse di DataRow;
to a quella di ADO, grazie anche alla disponibilità di
meccanismi come ereditarietà e il polimorfismo. • un DataSet costituisce una rappresentazione
Questo rende possibile progettare le nostre clas- in memoria di una struttura relazione costituita
si applicative come estensioni delle classi del fra- da un insieme di tabelle e dalle loro relazioni.
mework, ereditandone tutte le funzionalità di base. Per questo motivo, è il candidato ideale per
Potremo quindi cercare all’interno del framework definire il mapping tra le due rappresentazio-
una classe che costituisca un’astrazione del con- ni dei dati, relazionale ed object oriented. La
cetto di tabella, e utilizzarla come classe base classe AutomobileSet viene definita come sot-
per le classi applicative più specifiche, come ad toclasse di DataSet, per implementare questo
esempio Automobile. mapping nel caso specifico;
La struttura gerarchica delle classi di ADO.NET,
però, prevede anche una separazione di re- • un Data Adapter viene incapsulato all’interno
sponsabilità fra le classi dedicate al reperi- della classe AutomobileSet, ed utilizzato per
mento dei dati, che fanno parte dei managed accedere ai dati sul DBMS.
provider, come ad esempio DataReader e Da- L’obiettivo progettuale, in questo caso, è quel-
taAdapter, e le classi dedicate al mantenimen- lo di incapsulare all’interno di un’unica classe
to degli stessi dati in memoria, come DataTa- la logica di mapping, invece di lasciare all’ap-
ble e DataSet. plicazione client il compito di creare il Data
Questa struttura rende meno ovvie alcune scel- Adapter necessario per accedere ai dati;
te di progettazione.
Tornando a considerare il Listato 1, possiamo • la rappresentazione in memoria dei dati può
vedere come l’ipotesi di partenza fosse quella essere costituita da altri oggetti collegati al
di creare delle classi che fornissero sia dei me- disegno dell’automobile, come ad esempio
todi generici per permettere l’accesso ai dati, Carrozzeria e Motore.
come Leggi e Salva, sia dei metodi specifici, La rappresentazione object-oriented di questi
come Capovolgi e Ruota. In questa ipotesi, si oggetti potrà essere diversa dalla corrispon-
era sfruttata la possibilità di definire dei metodi dente rappresentazione sul DBMS.
Shared – o statici – per implementare le opera-
zioni che dovevano essere applicati all’insieme
di oggetti, e non al singolo oggetto (per esem- Listato 1 Scheletro di una classe che maschera
pio, il metodo Trova applica una condizione al- l’accesso ai dati mantenuti in una tabella
l’insieme delle automobili per estrarre un’uni-
ca automobile).
La decisione di cercare di sfruttare ed esten- Class Automobile
‘metodi specifici dell’oggetto
dere ADO.NET, piuttosto che creare una ge- Public Sub Ruota(nGradi As Integer)
rarchia di classi ad-hoc, ci costringe a rivede- ...
re questa ipotesi. Public Sub Capovolgi()
La nostra classe Automobile, cioè, dovrà es- ...
Public Sub Stampa()
sere costruita in modo da adattarsi all’architet- ...
tura sottostante. ‘metodi per la gestione del DBMS
Public Sub Salva()
Progettazione ...
Public Shared Sub Leggi(nObjId As Long)
La soluzione proposta è schematizzata in Figu- As Automobile
ra 1. L’idea è la seguente: ...
Public Shared Sub Trova(sCondition As String) As
• l’oggetto che rappresenta il disegno di un’au-
...
Automobile
tomobile, al quale devono poter essere ap- End Class
plicate operazioni specifiche quali Capovol-

N. 62 - Marzo/Aprile 2005 VBJ 21


ACCESSO AI DATI

Vantaggi e svantaggi Come sempre accade, i benefi ci effetti di


Questo tipo di soluzione, senza pretendere di un’architettura più ordinata si faranno senti-
essere ottimale, offre diversi vantaggi. Anzitutto, re nel tempo.
si appoggia sull’architettura di ADO.NET invece
di costruire una gerarchia di classi separate. Conclusioni
Questo consente di continuare a sfruttare tutti La creazione di un insieme di classi che forni-
gli automatismi forniti da ambienti di sviluppo e scano una gestione completa della logica appli-
classi di libreria, tra cui la generazione automa- cativa può essere molto utile anche per la sud-
tica del codice, e la possibilità di visualizzare i divisione del programma in più strati, o tier, e
dati in griglie e altri dispositivi di interfaccia, e può semplificare il riuso di queste classi in ap-
permette anche di non creare classi specifiche, plicazioni diverse.
utilizzando al loro posto le classi base DataSet In questo articolo abbiamo esaminato dal pun-
e DataRow, in tutti i casi in cui gli oggetti sia- to di vista progettuale una possibile soluzione
no strutturalmente semplici. Inoltre, consente a questo problema.
di separare la logica applicativa dalla gestio- Nel prossimo articolo parleremo delle pro-
ne dell’interfaccia utente, permettendo di crea- blematiche di implementazione, discutendo un
re delle classi che risultino facilmente riusabili esempio completo.
in progetti Windows e Web. Infine, permette di
risolvere il problema dell’impedance mismatch, Bibliografia
incapsulando la logica di mapping in un’unica [1] S.Visconti, “Realizzare una Web Application
classe. Sicuramente, progettare e sviluppare un con il framework Struts”, DEV n. 108, Giu-
insieme di classi di questo tipo richiede più tem- gno 2003
po rispetto ad un approccio più diretto e pro- [2] L.Vandoni, “BLOBJ Business Logic Objects”,
totipale, come quello di implementare la logica CP n.125, Giugno 2003
di accesso ai dati direttamente all’interno delle [3] L.Vandoni, “L’accesso ai dati nei linguaggi
form o pagine di interfaccia. object-oriented”, VBJ n.60, Novembre 2004

22 VBJ N. 62 - Marzo/Aprile 2005


ACCESSO AI DATI

TDO
Typed Data Object
TDO è l’acronimo di Typed Data Object (“oggetto dati tipizzato”), un insieme di strumenti e
metodologie di supporto per lo sviluppo di applicazioni basate su piattaforma Microsoft .NET.
In questo articolo scopriremo come funziona e quali sono i vantaggi per lo sviluppatore.

di Andrea Ferendeles

Da dove nasce l’idea TDO

T
DO è l’acronimo di Typed Data Object (“oggetto
dati tipizzato”), un insieme di strumenti e meto- “Ogni qual volta si deve realizza-
dologie di supporto per lo sviluppo di applica- re un’applicazione a n livelli, che
zioni basate su piattaforma Microsoft .NET. TDO con- fa uso di una base dati, occorre
sente agli sviluppatori di applicazioni basate sul Fra- scrivere codice per utilizzare que-
mework Microsoft.NET (v. 1.0 e v. 1.1) di produrre, in sti dati.”
modo completamente automatico, tutto il codice sor- Tale codice, in un’ottica Object
gente necessario (in C#), per la gestione di una base Oriented e in applicazioni ad n
dati Microsoft SQL Server 7.0 e 2000. TDO è basa- strati, viene modellato in classi
to su ADO.NET ed è un generatore di codice sorgen- e incapsulato nello strato Data
te Visual C# .NET. e successivamente utilizzato nel-
“Anziché scrivere a priori codice generico per una ge- lo strato Business. Chiameremo
nerica base dati ed a posteriori codice specifico per d’ora in avanti “Data Object” il
la base dati specifica (operazione che richiede tempi codice necessario alle operazio-
non indifferenti rispetto all’intero ciclo di vita del sof- ni di accesso ai dati.
tware), dotiamoci a priori di uno strumento che scriva Dalle osservazioni fatte durante
all’occorrenza il codice per quella base dati specifica”. il processo di sviluppo di una ap-
Questo si fa con TDOCodeGenerator.exe. plicazione, si osserva che:
Inoltre è facile osservare come, nonostante ogni base
dati abbia la propria struttura e le proprie caratteristiche, • il codice nello strato Business
su tutte sia possibile compiere le stesse operazioni in è sempre il frutto della logi-
modo parametrico (ricerca, inserimento, ecc…). ca delle esigenze del Cliente
Se in aggiunta riusciamo ad ottimizzare tale codice (Business Requirements), e tali
ed a renderlo robusto, grazie anche alle caratteristi- esigenze sono diverse di volta
che intrinseche dei prodotti specifici utilizzati (MS SQL in volta;
Server 2000 e .NET), allora possiamo portare a fattor
comune tali accorgimenti e “usufruirne” ogni volta dal • il codice nello strato Data, è
codice scritto automaticamente per la nostra base dati sempre il frutto delle operazio-
specifica, tramite System.Data.TDO.dll. ni che si compiono sui dati, e
tali operazioni sono sempre
concettualmente le stesse (ri-
Andrea Ferendeles ha iniziato ad appassionarsi di informatica
cerca, inserimento, modifica,
dai tempi del VIC20. Ha sviluppato in BASIC, Logo, Turbo
Pascal, C, C++, Visual Basic, fino ad arrivare ai linguaggi
ecc…);
.NET, quali VB.NET e C#. È certificato MCP, MCAD, MSF,
MCSD (.NET), MCDBA, MCT. Può essere contattato via email: • la struttura della base dati vie-
aferendeles@infomedia.it. ne invece creata ad hoc per

N. 62 - Marzo/Aprile 2005 VBJ 23


ACCESSO AI DATI

supportare indirettamente le esigenze del Di cosa si compone TDO


Cliente e direttamente le esigenze dell’ap- TDO è composto da 2 elementi:
plicazione e quindi anch’essa cambia di vol-
ta in volta; System.Data.TDO.dll: una libreria, contenen-
te Interfacce, Classi astratte, struct, eccetera,
Se focalizziamo ora l’attenzione sullo strato che inglobano le caratteristiche a fattor comune
dati, si osserva che tutto il codice che si ren- di accesso di una base dati MS SQL Server 7.0 e
derà necessario scrivere, per consentire l’acces- 2000. Tale libreria implementa al suo interno, tut-
so a questi dati (Data Object) non risulta più es- te quelle ottimizzazioni e accorgimenti che vanno
sere legato direttamente alle esigenze del Clien- necessariamente tenuti in considerazioni ogni vol-
te ma bensì risulta essere profondamente lega- ta che si accede ai dati, come ad esempio pro-
to alla struttura della base dati stessa.Tale le- blematiche di SQL Injection, ottimizzazione delle
game ci impone ogni volta di riscrivere il Data query, performance e scalabilità.
Object, per accedere a quella particolare base
dati anziché ad un’altra. TDOCodeGenerator.exe: un’applicazione, uti-
Per ridurre i tempi di sviluppo, ci si è dunque lizzabile sia a linea di comando che in modalità
dotati nel tempo di “facilitatori” e/o porzioni grafica, per la scrittura di un file C#, contenente
di codice “riusabile”, che comunque necessi- codice sorgente specifico per una base dati MS
tano di volta in volta di una inevitabile perso- SQL Server 2000.
nalizzazione, dovuta proprio alla “tipicità” del- Una volta eseguito TDOCodeGenerator su di
la base dati. una base dati specifica, viene prodotto un unico
La nostra modesta esperienza ci ha insegna- file di testo, contente codice C# con le seguen-
to negli anni che tali porzioni di codice riusabi- ti caratteristiche:
le, risultano spesso essere “asettiche”, a volte
poco performanti oppure molto astratte e dun- • tutto il DataBase viene esposto, secondo il mo-
que poco usabili (perché devono tenere in con- dello Object Oriented, attraverso una classe
siderazioni diverse possibilità di utilizzo in fu- (tdohelperclass): il database è un oggetto che
turo). quindi può avere attributi ed operazioni;

• attributi: ogni entità del


database (Tabella, Vi-
sta) viene esposta come
una classe C# che esten-
de una classe base im-
plementata nella libreria
System.Data.TDO.dll; ogni
entità avrà a sua volta at-
tributi ed operazioni; at-
tributi: ogni campo della
tabella/vista viene espo-
sto attraverso una pro-
perty tipizzata; operazio-
ni: ogni operazione pos-
sibile sull’entità (select, in-
sert, update, delete) viene
esposta come metodo.

• operazioni: ogni stored


procedure, user function,
table function e in-line ta-
ble function viene espo-
Figura 1 Architettura System.Data.TDO.dll sta come una operazione
(funzione C#) della classe
tdohelperclass.

24 VBJ N. 62 - Marzo/Aprile 2005


ACCESSO AI DATI

I Punti di forza di TDO no per “p”; se dobbiamo invocare una SP con


1 parametro, in ADO.NET dovrei scrivere circa
Tutto è tipizzato: tutti i campi delle tabelle e vi- 8 righe di codice (dichiarazione del Command,
ste e tutti i parametri delle funzioni e stored pro- CommandType, CommandText, Connection uti-
cedure hanno nella base dati un proprio “tipo” lizzata, Nome del Parametro, Tipo del Parame-
(int, char, binary, ecc…). tro, Direzione e Valore) mentre in TDO basta una
Tali tipi vengono riesposti da TDO negli equi- riga di codice per richiamare la funzione adibi-
valenti tipi disponibili nel Framework .NET (int, ta alla SP (nella classe tdohelperclass) passan-
string, byte[]). do come parametro (della funzione) il parame-
tro della SP.
Riduzione degli errori: essendo gli attributi del Tutte le operazioni necessarie all’esecuzio-
database tipizzati nella classe tdohelperclass, (e ne della SP sono già state implementate da
quindi non “object”) i controlli sui tipi vengono TDOCodeGenerator nella funzione della clas-
fatti a compile-time dal compilatore .NET del se tdohelperclass.
linguaggio in uso.
Ciò consente una scoperta degli errori ed una Un solo linguaggio: Gli statement T-SQL si
conseguente eliminazione già in fase di stesu- possono scrivere in C# (o VB.NET o altro lin-
ra del codice e non più a run-time. Ad esem- guaggio), evitando così allo sviluppatore di uti-
pio, se dobbiamo modificare un campo di tipo lizzare un ulteriore linguaggio durante la stesu-
“char” di un record in una tabella del database, ra del codice:
potremo assegnare a tale campo solo un valo-
re di tipo “string”; se dobbiamo richiamare una WHERE (Firstname = ‘Nancy’ AND LastName LIKE ‘%davolio%’)
stored procedure che si aspetta un parametro
di tipo “tinyint“, potremo passare a tale meto- con TDO si scrive
do della classe tdohelperclass solo un valore di
tipo “byte”, ecc… Clause.Where
(tdo.tEmployees.Firstname==“Nancy” & tdo.tEmployees.
Facilità e velocità d’uso: TDO è facile ed estre- Lastname%”%davolio%”)
mamente veloce da
usare anche per chi
lo utilizza per la pri-
ma volta, perché ha
una struttura chiara ed
inequivocabile. Inoltre
rispetto alla canonica
stesura di codice che
utilizza solo ADO.NET,
si ha un risparmio di
circa il 70% in termi-
ni di codice da scri-
vere con conseguen-
te risparmio sui costi e
tempi di sviluppo.
Ad esempio, tutte le
classi che espongono
tabelle del database
iniziano per “t”; tutte
le classi che espon-
gono viste iniziano
per “v”; tutti i metodi
che espongono user-
function iniziano per Figura 2 I parametri che è possibile passare a TDOCodeGenerator.exe
“f”; tutti i metodi che
espongono SP inizia-

N. 62 - Marzo/Aprile 2005 VBJ 25


ACCESSO AI DATI

caratteristica di oc-
cupazione della me-
moria RAM “al primo
utilizzo”, consenten-
do così l’uso seletti-
vo delle classi TDO.

Adattamento ai cam-
biamenti: a fronte di
cambiamenti nella
struttura della base dati
(cambiamenti della base
dati in corso d’opera/
manutenzione evolutiva)
è sufficiente rieseguire
TDOCodeGenerator.exe
sul database ed in po-
Figura 3 TDOCodeGenerator.exe in azione sul Database Northwind chi secondi tutte le clas-
si sono rigenerate. Ad
esempio, l’esecuzione
di TDOCodeGenerator
Documentazione automatica del codice: tutta sul database Northwind ha generato 16.590 ri-
la documentazione “tecnica” delle classi prodot- ghe di codice C#, per un totale di 720 Kb di co-
te da TDOCodeGenerator è automaticamente dice sorgente, 192 Kb di codice compilato MSIL
scritta attraverso XML Documentation, per ogni e 25 Kb di spazio occupato in RAM; il tutto in
classe, property, function, ecc… Questa carat- soli 8 secondi.
teristica unitamente alle funzionalità di VS.NET,
consente allo sviluppatore di produrre automati- Bindable: TDO può essere utilizzato per ope-
camente tutta la documentazione tecnica neces- razioni di data binding (simple e complex); inol-
saria (in formato HTML) per il Data Object. tre implementando l’interfaccia IComponent può
essere utilizzato come componente .NET.
Basato su ADO.NET connesso e/o disconnes-
so: TDO può essere utilizzato sia in modalità Serializable: tutte le classi TDO sono mar-
connessa che in modalità disconnessa, proprio cate con l’attributo [Serializable] e sono dun-
perché utilizza e si integra appieno con la parte que serializzabili sia in formato binario che
connessa (Connection, Command, ecc…) e la in formato XML; in virtù di questa feature
parte disconnessa (DataSet) di ADO.NET. TDO non è stato costruito con il namespace
System.Data.SqlTypes, che contiene tutte clas-
Performance: le performance di TDO sono del si non Serializzabili.
45% migliori rispetto alla parte disconnessa di
ADO.NET (DataAdapter); del 5% rispetto a sta- COM Interoperability: TDO può essere utilizzato
tement T-SQL non parametrici della parte con- da applicazioni basate su COM (ad esempio ap-
nessa (Command). plicazioni scritte in Microsoft Visual Basic 6.0).
Tali performance sono ottenute adottando al-
cuni accorgimenti noti per l’ottimizzazione del- Esempi di utilizzo
le query su MS SQL Server 2000 (es. caching
execution plan). Creare una istanza della classe TDOHelperClass
di TDO:
Scalabilità: TDO risulta molto scalabile in quan-
to tutti gli statement lanciati dallo sviluppatore • Creare un nuovo Progetto in C#.NET
attraverso TDO vengono resi parametrici prima (qualsiasi template)
di essere inviati a SQL Server 2000, sfruttan- • Aggiungere un riferimento a System.Data.TDO.dll
do dunque la scalabilità delle query parametri- • Aggiungere il file di classi generato da TDO
che di SQL Server 2000. Inoltre TDO offre una per il Vs. Database MS SQL Server 7.0/2000

26 VBJ N. 62 - Marzo/Aprile 2005


ACCESSO AI DATI

//select * from Employees


dt = tdo.tEmployees.SelectDataTable();
tdo.CloseConnection();

Oppure …
DataTable dt;
tdo.OpenConnection();
//select * from Employees
// where
// Lastname=’Davolio’
// AND
// FirstName=’Nancy’
dt=tdo.tEmployees.SelectDataTable
(
Clause.Where
(
tdo.tEmployees.Lastname==”Davolio”
&&
Figura 2 TDOCodeGenerator.exe /Interactive - La gestione diventa tdo.tEmployees.Firstname==”Nancy”
più semplice tramite una finestra Windows. In modalità
Interactive è addirittura possibile scegliere per quali ope- )
razioni TDO dovrà generare codice per ogni db object );
tdo.CloseConnection();

• Aggiungere le clausole using System.Data.TDO Oppure …


e using TDO.MyDatabase
• Creare un Istanza della class TDOHelper- DataTable dt;
Class tdo.OpenConnection();
//select EmployeeID, BirthDate
using System.Data.TDO; // from Employees
using TDO.MyDatabase; // where
... // Lastname=’Davolio’
private void button1_Click(object sender, System. // AND
EventArgs e) // FirstName=’Nancy’
{ dt=tdo.tEmployees.SelectDataTable
string connectionstring=”Data Source=(local);Initial (
Catalog=MyDatabase;userid=sa;password=password;”; Clause.Where
TDOHelperClass tdo=new TDOHelperClass(connectionstring); (
tdo.OpenConnection(); tdo.tEmployees.Lastname==”Davolio”
//do something with TDO ... &&
tdo.CloseConnection(); tdo.tEmployees.Firstname==”Nancy”
} ),
tdo.tEmployees.Employeeid,
Effettuare una select da una Tabella del Data- tdo.tEmployees.Birthdate,
base: );
tdo.CloseConnection();
• Aprire la connessione al Database (opzionale)
• Utilizzare il metodo SelectDataTable più ap- Oppure …
propriato. Tutte le Tabelle hanno come pre-
fisso ‘t’ (se la connessione è chiusa il metodo DataTable dt;
SelectDataTable la apre automaticamente) tdo.OpenConnection();
• Chiudere la connessione //select EmployeeID, BirthDate from Employees
// where
DataTable dt; // Lastname LIKE ‘%avol%’
tdo.OpenConnection(); // order by

N. 62 - Marzo/Aprile 2005 VBJ 27


ACCESSO AI DATI

// BirthDate ASC //Insert(...,false ). In questo modo la query di Insert


dt=tdo.tEmployees.SelectDataTable viene “Preparata” al primo utilizzo
( //e riutilizzata nei successivi inserimento, aumentando
Clause.Where(tdo.tEmployees.Lastname%”%avol%”) così le performance.
+ tdo.CloseConnection();
Clause.OrderBy(tdo.tEmployees.Birthdate,Clause.Asc)
, Modificare un Record in una Tabella del Da-
tdo.tEmployees.Employeeid, tabase:
tdo.tEmployees.Birthdate
); • Aprire la connessione al database
tdo.CloseConnection(); • Utilizzare il metodo BeginEdit() della Tabella
sulla quale si vuole modificare il Record
Inserire un Record in una Tabella del Database: • Assegnare i valori alle proprietà della Tabella
(.Value)
• Aprire la connessione al database • Invocare il metodo EndEdit() della Tabella
• Utilizzare il metodo BeginEdit() della Tabella • Invocare il metodo Update()
sulla quale si vuole inserire il Record • Chiudere la connessione al database
• Assegnare i valori alle proprietà della Tabella
(.Value) //UPDATE Employees SET FirstName=”John”, LastName=”Doe”
• Invocare il metodo EndEdit() della Tabella // WHERE EmployeeID=1
• Invocare il metodo Insert() tdo.OpenConnection();
• Chiudere la connessione al database tdo.tEmployees.BeginEdit();
tdo.tEmployees.Firstname.Value=”John”;
//INSERT INTO Employees (FirstName, LastName) VALUES tdo.tEmployees.Lastname.Value=”Doe”;
(‘John’, ‘Doe’) tdo.tEmployees.EndEdit();
tdo.OpenConnection(); tdo.tEmployees.Update(Clause.Where(tdo.tEmployees.
EmployeeID==1));
tdo.tEmployees.BeginEdit(); tdo.CloseConnection();
tdo.tEmployees.Firstname.Value=”John”;
tdo.tEmployees.Lastname.Value=”Doe”; Eliminare un Record da una Tabella del Database:
tdo.tEmployees.EndEdit();
tdo.tEmployees.Insert(); o Aprire la connessione al Database
//Se si devono inserire più Record sequenzialmente o Utilizzare il metodo Delete() della Tabella dalla
//utilizzare Insert(true ) solo al primo inserimento e quale si vuole eliminare il/i Record(s)
successivamente o Chiudere la connessione al Database
//Insert(false ). In questo modo la query di Insert viene
“Preparata” al primo utilizzo //DELETE From Employees WHERE Photo ISNULL
//e riutilizzata nei successivi inserimento, aumentando tdo.OpenConnection();
così le performance. tdo.tEmployees.Delete(Clause.Where(tdo.tEmployees.Photo==
tdo.CloseConnection(); DBNull.Value));
tdo.CloseConnection();
In alternativa è possibile utilizzare direttamente
il metodo Insert(....), passando direttamente i va- Eseguire una Stored Procedure:
lori dei campi
o Aprire la connessione al database
//INSERT INTO Employees (FirstName, LastName) VALUES o Tutte le Stored Procedure hanno come prefisso
(‘John’, ‘Doe’) ‘p’. Utilizzare il metodo pNomeStoredProcedu-
tdo.OpenConnection(); re passando direttamente i parametri tipizzati
DBNull n=DBNull.Value; o Il metodo pNomeStoredProcedure restituisce
tdo.tEmployees.Insert(“John”,”Doe”,n,n,n,n,n,n,n,n,n,n,n, sempre un oggetto System.Data.DataTable
n,n,n,n,true ); o Chiudere la connessione al database
//Se si devono inserire più Record sequenzialmente
//utilizzare Insert(...,true ) solo al primo inserimento //EXEC Employee Sales by Country(‘01-01-1999’, ‘12-31-
e successivamente 1999’)

28 VBJ N. 62 - Marzo/Aprile 2005


ACCESSO AI DATI

tdo.OpenConnection(); • Le User Functions restiuiscono sempre il loro


DataTable myresults=tdo.tEmployees.pEmployeesalesbycountry( tipo dichiarato, Le Table Functions un ogget-
new DateTime(1999,01,01), new DateTime(1999,12,31)); to System.Data.DataTable
tdo.CloseConnection();
// create this function on Northwind DB
Effettuare una Select da una Vista del database: // ******************************
// CREATE FUNCTION dbo.MySum(@a INT, @b INT)
o Aprire la connessione al database (opzionale) // RETURNS INT as
o Utilizzare il metodo SelectDataTable più ap- // BEGIN
propriato. Tutte le Viste hanno come prefisso // RETURN (@a, @b)
‘v’ (se la connessione è chiusa il metodo Se- // END
lectDataTable la apre automaticamente) // ******************************
o Chiudere la connessione al database tdo.OpenConnection();
o Sulle viste non sono presenti i metodi di In- int results=tdo.fMysum(3,5); // results=8
sert(), Update() e Delete(). tdo.CloseConnection();

//Select * FROM [Alphabetical List of Products] Effettuare una Select con la clausola WHE-
tdo.OpenConnection(); //Opzionale RE ... IN:
DataTable myproducts=tdo.vAlphabeticallistofproducts.
SelectDataTable(); • Aprire la connessione al Database
tdo.CloseConnection(); //Opzionale • Utilizzare il metodo SelectXXXXX più appro-
priato.
Eseguire una User/Table Function: • Nella Clause.Where utilizzare la classe
TDOWhereSetOfValues.
• Aprire la connessione al database
• Utilizzare il metodo fNomeFunzione più appro- //Select * FROM Employees WHERE EmployeeID IN (1,3,5)
priato. Tutte le Functions hanno come prefis- tdo.OpenConnection();
so ‘f’. DataTable myEmployees=tdo.tEmployees.SelectDataTable(
• Chiudere la connessione al database Clause.Where(tdo.tEmployees.Employeeid==new TDOWhereSetO
fValues(1,3,5)));
tdo.CloseConnection();

Effettuare una Select


con la clausola WHERE
... BETWEEN:

• Aprire la connessione al
Database
• Utilizzare il metodo Se-
lectXXXXX più appropria-
to.
• Nella Clause.Where uti-
lizzare la classe TDOWhe-
reRange.

//Select * FROM Employees WHERE


EmployeeID BETWEEN 2 AND 6
tdo.OpenConnection();
DataTable myEmployees=tdo.
tEmployees.SelectDataTable(
Clause.Where(tdo.tEmployees.
Figura 5 Ecco come la classe TDOHelperClass per Northwind si Employeeid==new TDOWhereRange
presenta in Visual Studio .NET (2,6)));
tdo.CloseConnection();

N. 62 - Marzo/Aprile 2005 VBJ 29


ACCESSO AI DATI

Effettuare operazioni di Aggregazione Select la classe tEmployeesClass (che espone metodi


COUNT, GROUP BY, ecc.: ed attributi della Tabella Employees):

La filosofia di TDO è molto semplice: qualsia- using System;


si operazione di Aggregazione deve essere in- using System.Data.SqlClient;
termediata da Viste, Stored Procedure e User/ using System.Data.TDO;
Table Function e non può essere effettuata di- using System.Data.TDO.TDOTypes;
rettamente dalla classe TDOHelperClass. using TDO.Northwind;
Nelle classe TDOHelperClass, vengono co- using TDO.Northwind.Entities;
munque forniti 4 metodi accessori (Fill, Execu-
teReader, ExecuteNonQuery, ExecuteScalar) namespace TDONorthwindExtended
per eseguire statement T-SQL “liberi”. Questi {
metodi sono marcati come [Obsolete] in modo namespace Entities
che il compilatore generi un Warning a compi- {
le-time. Ciò ne consente una rapida individua- public class tEmployeesExtendedClass : tEmployeesClass,
zione in caso di necessità. Se si dovesse ren- ITDOTable
dere necessario l’uso di questi metodi è comun- {
que possibile adottare alcuni accorgimenti, per public tEmployeesExtendedClass(TDOHelperClass tdohelper-
impattare minimamente sulla manutenibilità del class) : base(tdohelperclass)
codice. Tale scelta progettuale, spinge l’uten- { }
te a fare uso di strumenti più consoni e perfor- public string MyNewEmployeesMethod()
manti ad un DB relazionale. Attraverso lo stru- {
mento TDOCodeGenerator (esposto attraverso //Do something
TDO Service on-line), l’utilizzo di Viste, SP e UF //...
create nel database è immediato. return “MyNewEmployeesMethod of tEmployeesExtendedClass”;
È sufficiente infatti creare tali Oggetti sul data- }
base e rilanciare il generatore di codice. In po- public new void Insert(bool preparethiscommand)
chi secondi la classe TDOHelperClass prodot- {
ta riespone tutti i nuovi oggetti. base.Insert(preparethiscommand);
//Do something else
//Metodi [Obsolete] //...
tdo.OpenConnection(); }
DataTable myDataTable=tdo.Fill(“select count(“+ }
tdo.tEmployees.FirstName.ColumnName +”) TOT From “ + }
tdo.tEmployees.TableName + “ Group By “ + tdo.tEmployees. public class TDONortwindExtendedClass : TDOHelperClass,
FirstName.ColumnName); ITDOHelper
tdo.CloseConnection(); {
public new Entities.tEmployeesExtendedClass tEmployees;
Modificare il codice TDO per implementare al- public TDONortwindExtendedClass(string connectionstring)
cune funzionalità “Custom”: : base(connectionstring)
{
Anche in questo caso la filosofia di TDO è mol- this.tEmployees=new TDONorthwindExtended.Entities.
to semplice. Ragioniamo in OOP: se avete ne- tEmployeesExtendedClass(this);
cessità di aggiungere nuove feature alle vostre }
classi TDO, estendete le classi esistenti, trami- public string MyNewMethod()
te meccanismi di ereditarietà. Il codice sorgen- {
te TDO non dovrebbe essere mai modificato, in // Do something
quanto una rigenerazione (a fronte di modifiche return “MyNewMethod of TDONorthwindExtendedClass”;
sul database), farebbe perdere tali modifiche. }
Se invece avete esteso le classi TDO e con- }
centrato qui l’aggiunta di nuove classi/metodi, }
tali modifiche verranno ovviamente preservate.
Qui di seguito è riportato un esempio di esten- Riferimenti
sione sia della classe TDOHelperClass che del- [1] TDO Evaluation copy – www.eidosis.com/tdo

30 VBJ N. 62 - Marzo/Aprile 2005


ENTERPRISE

SOA e il .NET
Framework SOA2

Aspetti pratici della Service Oriented Architecture per gli sviluppatori .NET

di Paolo Pialorsi Seconda puntata

N
el precedente articolo a proposito della Servi- re lo schema di una struttura dati
ce Oriented Architecture abbiamo visto quali che estraggo da un database. Vi-
sono gli aspetti chiave e gli obiettivi di questa sual Studio .NET consente infatti di
nuova architettura del software. Affrontiamo ora alcu- trascinare (drag’n’drop), all’interno
ni aspetti pratici dello sviluppo SOA, rivolgendo la no- dell’area di disegno di un XSD, le
stra attenzione agli strumenti e alle tecniche da adot- tabelle di una base dati, converten-
tare per lavorare con il .NET Framework e con Visual do in schema la loro struttura.
Studio .NET 2003. Esistono poi sul mercato decine di
programmi in grado di fornire editor
Strumenti per disegnare i messaggi evoluti di XSD. Il più famoso di que-
Come abbiamo già visto, una delle fasi più importanti sti è certamente XMLSpy della Al-
di un progetto SOA è il disegno dei messaggi, ad oggi tova [2]. A prescindere dal tool che
sotto forma di documenti XSD. Benché la sintassi di XML utilizziamo per definire lo schema
Schema non sia eccessivamente complessa, consenten- XSD, avremo l’esigenza di trattar-
doci di prendere in considerazione un qualsiasi editor lo da codice. Se stiamo lavorando
testuale (persino il Blocco Note di Windows), conviene con il Framework .NET possiamo
comunque appoggiarsi a qualche software che ci aiuti utilizzare un ulteriore tool, questa
nella definizione dei messaggi. Sicuramente uno stru- volta a riga di comando, di nome
mento comodo e che tutti noi dovremmo avere a dispo- XSD.EXE, che è in grado di leggere
sizione è Visual Studio .NET. Con esso possiamo infatti un XSD e crearne una rappresenta-
creare dei documenti XSD sia utilizzando un designer zione equivalente sotto forma di lin-
grafico (Figura 1), che sfruttando un comodo editor te- guaggio .NET (C#, VB.NET, J#).
stuale, dotato di intellisense sulla grammatica di XSD Pensiamo quindi a questo sem-
(Figura 2). Personalmente utilizzo nella maggioranza dei plice schema:
casi l’editor testuale, perchè ritengo che avendo un mi-
nimo di padronanza del linguaggio XSD si riesca ad es- XSD
sere molto più rapidi, quindi anche più produttivi, che <?xml version=”1.0” encoding=”utf-8”?>
non lavorando con il mouse e il designer grafico. Que- <xsd:schema targetNamespace=”http:
st’ultimo lo utilizzo generalmente quando devo defini- //schemas.devleap.com/Product”
elementFormDefault=”qualified”xmlns=”http:
//schemas.devleap.com/Product” xmlns:
xsd=”http://www.w3.org/2001/XMLSchema”>

<xsd:element name=”product”>
Paolo Pialorsi è un consulente e autore specializzato nello
<xsd:complexType>
sviluppo di Web Service e soluzioni Web con il Framework
.NET di Microsoft. Lavora nell’omonima società Pialorsi Sistemi <xsd:sequence>
S.r.l. e fa parte del gruppo DevLeap. Può essere contattato <xsd:element name=”description”
via email: paolo@devleap.it. type=”xsd:string” />

N. 62 - Marzo/Aprile 2005 VBJ 31


ENTERPRISE

<xsd:any minOccurs=”0” maxOccurs=”unbounded” [XmlTypeAttribute(Namespace=”http://schemas.devleap.com/


processContents=”lax” /> Product”)]
</xsd:sequence> [XmlRootAttribute(Namespace=”http://schemas.devleap.com/
<xsd:attribute name=”id” type=”xsd:int” Product”, IsNullable=false)]
use=”required” /> public class product {
<xsd:attribute name=”euroPrice” type=”xsd:decimal”
use=”required” /> public string description;
<xsd:anyAttribute processContents=”lax” />
</xsd:complexType> [XmlAnyElementAttribute()]
</xsd:element> public System.Xml.XmlElement[] Any;

</xsd:schema> [XmlAttributeAttribute()]
public int id;
Ipotizzando che il file XSD si chiami product.xsd,
possiamo invocare XSD.EXE nel modo seguente: [XmlAttributeAttribute()]
public System.Decimal euroPrice;
Command Line
XSD.EXE /c /n:DevLeap.Entities product.xsd [XmlAnyAttributeAttribute()]
public System.Xml.XmlAttribute[] AnyAttr;
Dove il parametro /c indica che vogliamo ge- }
nerare una o più classi, corrispondenti alle entità }
descritte nello schema. Il parametro /n comunica
invece quale deve essere il namespace del codi- Siamo a questo punto pronti per includere il file
ce autogenerato. Il terzo parametro è ovviamen- di codice nei nostri progetti e utilizzarlo. Ciò che
te il file XSD sorgente. per noi sarà un’istanza della classe product, per
Il risultato sarà simile al seguente: chi si interfaccerà con noi e per i nostri stessi ser-
vizi sarà un messaggio strutturato come definito
C# in product.xsd. Chi ci garantisce tutto questo è la
using System.Xml.Serialization; presenza nel codice di una serie di attributi, relativi
namespace DevLeap.Entities { al namespace System.Xml.Serialization che sono
finalizzati proprio a dire a XmlSerializer, il motore di
serializzazione dei messaggi, che tipo
di struttura XML deve generare.
Per esempio XmlAttributeAttribute
dice al serializzatore di generare un
attributo XML al cui interno inserire il
valore della proprietà id.

L’approccio “Contract First”


Ipotizziamo di aver definito tutti i
messaggi da utilizzare nei nostri ser-
vizi. Ora dobbiamo definire i contrat-
ti di quei servizi, proprio secondo un
approccio “Contract First”, cioè defi-
nendo prima i contratti e poi i servizi
che li implementano e non il contrario.
I contratti abbiamo già visto essere dei
file WSDL, cioè dei file XML che de-
scrivono: servizi, binding, porte, mes-
saggi, tipi. Vediamoli e definiamoli uno
per uno. La sezione relativa ai servizi
Figura 1 Designer di uno schema XSD in Visual Studio .NET descrive l’esistenza di uno o più ser-
vizi, la URL alla quale sono raggiungi-
bili e il binding per utilizzarli:

32 VBJ N. 62 - Marzo/Aprile 2005


ENTERPRISE

<soap:body use=”literal” />


</output>
</operation>
</binding>

In questa sezione è importante notare


che, per essere compatibili con le re-
gole di WS-I [5], dobbiamo descrive-
re i messaggi con formato document/
literal [2].
Serve inoltre dichiarare le singole
operazioni che vogliamo esporre con
il servizio.
Ogni operazione potrà essere costitui-
ta da un messaggio in ingresso (input)
e un messaggio in uscita (output).
I messaggi passeranno attraverso
una porta:

Figura 2 Editor di uno schema XSD in Visual Studio .NET WSDL


<portType name=”productServiceSoap”>
<operation name=”GetProduct”>
<input message=”svc:GetProductSoapIn” />
<output message=”svc:GetProductSoapOut” />
WSDL </operation>
<service name=”productService”> </portType>
<port name=”productService” binding=”svc:productService
Binding”> La porta dichiarerà il proprio nome e, per ciascu-
<soap:address location=”http://localhost/ na operazione, la corrispondenza tra i messaggi e
ProductService.asmx” /> l’operazione stessa. Per definire i messaggi dovre-
</port> mo utilizzare l’apposita sezione del WSDL:
</service>
WSDL
Generalmente è sufficiente scegliere un nome <message name=”GetProductSoapIn”>
per il servizio, per la relativa porta e per il bin- <part name=”parameter” element=”svc:getProduct” />
ding al protocollo, quindi indicare una URL. La </message>
sezione relativi ai servizi non è obbligatoria in un <message name=”GetProductSoapOut”>
approccio “Contract First”, in quanto potremmo <part name=”parameter” element=”p:product” />
decidere a posteriori come e dove implementa- </message>
re il contratto.
Dobbiamo invece definire il binding al proto- Si noti che ogni messaggio può essere fatto di N
collo: parti. Dal punto di vista della specifica WS-I Ba-
sic Profile 1.1, che detta le regole fondamentali
WSDL per la interoperabilità dei servizi SOAP, un mes-
<binding name=”productServiceBinding” type=”svc:product saggio può però essere costituito al più da una
ServiceSoap”> parte, quindi o zero o una parte.
<soap:binding style=”document” transport=”http:// Le singole parti poi referenziano la sezione dei
schemas.xmlsoap.org/soap/http” /> tipi di WSDL, per descrivere la loro struttura:
<operation name=”GetProduct”>
<soap:operation soapAction=”urn:GetProduct” /> WSDL
<input> <types>
<soap:body use=”literal” /> <xsd:schema elementFormDefault=”qualified”
</input> targetNamespace=”http://schemas.devleap.com/
<output> ProductService”>

N. 62 - Marzo/Aprile 2005 VBJ 33


ENTERPRISE

<xsd:import namespace=”http://schemas.devleap.com/
Product”
schemaLocation=”http://localhost/Product.xsd” />
<xsd:element name=”getProduct” type=”xsd:string” />
</xsd:schema>
</types>

In questo caso definiamo come è strutturato il


messaggio getProduct, mentre importiamo da
un file esterno (il nostro product.xsd) la defini-
zione dello schema del prodotto.
Si noti che l’importazione dello schema ester-
no, per essere ancora una volta compatibili con
WS-I BP1.1, deve avvenire all’interno della sezio-
ne dei tipi, cioè nello schema, e non può essere
eseguita a livello di intero contratto WSDL.
La specifica di WSDL 1.1 prevede infatti un tag
wsdl:import che però dovrebbe essere utilizza-
to solo per importare altri file WSDL.
Purtroppo anche il .NET Framework, quando
definite dei Web Service che restituiscono dei
typed DataSet [3] inserisce nel WSDL autogene-
rato (quello che ottenete chiamando nel brow-
ser servizio.asmx?wsdl) un tag wsdl:import che
importa lo schema del typed DataSet a livello di
WSDL, anzichè a livello di schema XSD, renden- Figura 3 WSContractFirst
do il risultato non compatibile con WS-I BP1.1.
In ogni caso noi stiamo costruendo manualmen-
te il nostro documento WSDL proprio per essere
sicuri che il risultato sia corretto e compatibile zio, possiamo basarci sul WSDL, che prescin-
con tutte le specifiche oggi esistenti. Noi ragio- de dalla piattaforma di sviluppo, dedicandoci
niamo con l’approccio “Contract First”! allo sviluppo reale del servizio e/o del client,
L’attività di disegno del WSDL può essere detto anche proxy, con un qualsiasi ambien-
svolta utilizzando Notepad, Visual Studio .NET te di sviluppo.
o altri tool di terze parti. Per esempio anche in Nei più diffusi ambienti di sviluppo (.NET e
questo caso XmlSpy fornisce un designer gra- Java in primis) esistono strumenti per la ge-
fico per la definizione di WSDL. Se per il dise- nerazione automatica del codice lato client e
gno di un XSD trovo superfluo appoggiarsi a lato server, rispetto alla struttura di un docu-
designer esterni, per la definizione di un WSDL mento WSDL. Con il .NET Framework questo
può invece risultare molto più comodo sfrutta- si ottiene utilizzando il programma WSDL.EXE
re strumenti come XmlSpy. Consiglio altrimenti nel modo seguente:
di conservare un file WSDL di base, semplice
ma completo, da utilizzare sempre come pun- Command Line
to di partenza per qualsiasi WSDL che si deb- WSDL.EXE /server /n:DevLeap.Services productService.WSDL
ba definire.
Dove /server indica che vogliamo generare il co-
Implementare i servizi server-side dice lato server, il parametro /n al solito indica il
Ora che abbiamo definito il contratto sotto for- namespace .NET del codice da generare e l’ulti-
ma di WSDL possiamo innanzitutto “sottoscri- mo parametro sarà la URL del nostro file WSDL,
verlo” con i nostri partner, cioè verificare che ri- quello che abbiamo creato manualmente.
sponda ai requisiti, per poi fornirlo a chi si deve Il codice generato conterrà la definizione di una
interfacciare con i servizi che descrive. classe astratta che rappresenta le caratteristiche
Sia noi, che sviluppiamo il servizio, che i no- del WSDL sotto forma di Web Service ASP.NET.
stri clienti/partner, cioè i “consumer” del servi- Nel nostro caso avremo, in forma abbreviata:

34 VBJ N. 62 - Marzo/Aprile 2005


ENTERPRISE

C# Verificare la bontà del risultato


// Definizione della classe astratta del servizio Leggendo queste due puntate sullo sviluppo
[WebServiceBindingAttribute(Name=”productServiceBinding”, SOA dovrebbe essere emerso in modo chiaro il
Namespace=”http://schemas.devleap.com/ProductService”)] fatto che sviluppare in architettura SOA oggi non
public abstract class productService : System.Web.Services. è banale e non è a costo zero.
WebService { Dovrebbe però anche essere chiaro che svilup-
pare architetture SOA, quando effettivamente è
// Definizione della operazione GetProduct come WebMethod necessario essere interoperabili, indipendenti dal-
[System.Web.Services.WebMethodAttribute()] la piattaforma e disaccoppiati, è la scelta corret-
[System.Web.Services.Protocols.SoapDocumentMethodAttribute ta. Sarebbe però paradossale, oltre che svilente,
(“urn:GetProduct”, Use=System.Web.Services.Description. dedicare tempo e risorse allo sviluppo di un’ar-
SoapBindingUse.Literal, ParameterStyle=System.Web. chitettura SOA, per poi scoprire che non siamo
Services.Protocols.SoapParameterStyle.Bare)] realmente interoperabili con le altre piattaforme,
[return: System.Xml.Serialization.XmlElementAttribute nel momento in cui dovesse servirci realmente di
(“product”, Namespace=”http://schemas.devleap.com/Product”)] esserlo. La garanzia di interoperabilità vera oggi
public abstract product GetProduct( non c’è. Abbiamo però una garanzia di intero-
[System.Xml.Serialization.XmlElementAttribute(Namespace= perabilità ad oggi sicuramente teorica e andan-
”http://schemas.devleap.com/ProductService”)] string do avanti nel tempo anche pratica e per tutte le
getProduct); piattaforme: WS-I Basic Profile 1.1.
} Per avere la certezza del fatto che i nostri ser-
vizi sono compatibili con WS-I BP1.1 possiamo
Si può subito notare che la classe generata è utilizzare degli strumenti che il consorzio WS-
molto ricca di meta-informazioni, sotto forma di Interoperability stesso ci mette a disposizione
attributi .NET. Si tratta di attributi che comunica- come download dal sito di WS-I [5].
no al motore dei Web Service di ASP.NET come Mi riferisco ai WS-I Test Tools che prevedono
saranno strutturati i messaggi SOAP in ingresso un Monitor e un Analyzer che rispettivamente
e in uscita. Per utilizzare questa classe dovremo tracciano e analizzano il traffico SOAP, verifican-
creare una nostra classe, da essa derivata, co- do se i messaggi, gli schema e i contratti corri-
piare tutti gli attributi .NET presenti sulla classe spondono alle regole di BP1.1 o meno.
base e sui suoi metodi, perchè gli attributi .NET Se i nostri servizi non dovessero essere com-
non vengono derivati dalle classi figlie e quindi patibili con BP1.1 l’Analyzer ci dirà non solo che
implementare il codice dei singoli metodi. il test è fallito, ma ci segnalerà anche puntual-
Nel nostro caso dovremo implementare solo il mente i “difetti” del servizio, in modo da poterli
metodo GetProduct, che restituisce un oggetto correggere tempestivamente.
di tipo product, definito secondo lo schema XSD Il mio consiglio è di utilizzare sempre questi
da noi costruito. Negli esempi associati all’arti- tool per verificare la correttezza delle implemen-
colo trovate un esempio completo di tutto que- tazioni SOA.
sto procedimento.
Esiste un add-in per Visual Studio .NET di nome Bibliografia e Riferimenti
WSContractFirst (Figura 3), creato da Christian [1] J. Hasan – “Expert Service-Oriented Architec-
Weyer [8], che consente di svolgere queste ope- ture in C#: Using the Web Services Enhance-
razioni senza abbandonare l’ambiente di svilup- ments 2.0”, APress, 2004
po di Visual Studio .NET. [2] P. Pialorsi – “XML & Web Services .NET Full
Inoltre sempre questo tool genera già la classe Contact”, Mondadori Informatica, 2003
derivata, pronta da implementare e consente di [3] P. Pialorsi – “Accesso ai dati tramite Web Ser-
aggiungere alcune caratteristiche interessanti al vice”, Visual Basic Journal n° 55
codice autogenerato. Per esempio si può chiede- [4] http://www.altova.com/
re a WSContractFirst di convertire eventuali array [5] http://www.ws-i.org/
di oggetti in collezioni, per poterli meglio gestire [6] http://msdn.microsoft.com/architecture/soa/
da codice. Inoltre consente di attivare lato server [7] http://www.w3.org/TR/xml-infoset/
una SOAP Extension [9] che esegue la validazio- [8] http://www.thinktecture.com/Resources/
ne XSD dei messaggi, per verificare che in input Software/WSContractFirst/
ai nostri servizi arrivino solo documenti validi, ri- [9] http://www.devleap.com/SchedaArticolo.aspx
spetto agli schema creati. ?IdArticolo=10450

N. 62 - Marzo/Aprile 2005 VBJ 35


SOFTWARE ENGINEERING

I design pattern DP1

più famosi
implementati in VB .NET Prima puntata

In questa breve serie di articoli vedremo alcuni esempi di implementazione dei design
pattern più noti

di Lorenzo Vandoni

I
l movimento dei pattern, nato nel 1993 a seguito È più corretto quindi parlare di
della pubblicazione del libro “Design Pattern” di esempi, anche se nessuno vi vie-
Gamma, Helm, Johnson e Vlissides (soprannomi- terà di utilizzare il codice propo-
nati gang of four, o GoF), costituisce una delle più sto come base per un’analoga im-
significative novità dell’ultimo decennio nel campo plementazione all’interno di una
dell’ingegneria del software. vostra applicazione.
Un pattern è una soluzione generalizzata per un
determinato problema, valida nell’ambito di un con- Descrizione di un design
testo. pattern
Per capire di cosa si tratta, basta fare un parallelo La descrizione di un pattern è
con una ricetta di cucina. Il problema è il piatto da principalmente testuale, ma deve
preparare, la soluzione è la ricetta, e il contesto sono essere strutturata in modo da evi-
gli ingredienti disponibili. denziare alcune proprietà che han-
Un pattern, di per sé, è quindi semplicemente un no lo scopo di descrivere sepa-
approccio alla risoluzione di problemi, del tutto in- ratamente il problema, i vincoli e
terdisciplinare. la soluzione, nonché evidenziare i
Quando si parla di “design pattern”, invece, si in- possibili legami di questo con al-
tende l’applicazione di questo approccio alla proget- tri pattern.
tazione del software. Queste proprietà non sono esat-
In questa serie di articoli verranno mostrati degli tamente identiche in tutte le pub-
esempi di implementazione di alcuni pattern, utiliz- blicazioni. Utilizzando come rife-
zando il linguaggio Visual Basic.NET. Parlare di “im- rimento il libro “Design Pattern”,
plementazione” di un design pattern è di per sé scor- possiamo citare, tra le proprietà
retto, perché la soluzione di un pattern di questo tipo principali:
è di tipo progettuale, e può essere implementata in
molti modi diversi. • Intent, una breve descrizione
dell’obiettivo del pattern;

Lorenzo Vandoni è laureato in Informatica, ed è uno


specialista di progettazione e sviluppo con tecniche e
• Motivation, un’ampia descrizio-
ne delle motivazioni che stanno
linguaggi object-oriented. Ha collaborato alla realizzazione
di framework, strumenti di sviluppo e software commerciali alla base dell’utilizzo del pattern.
in C++, Java e Visual Basic. Può essere contattato tramite Questa proprietà è la più impor-
e-mail all’indirizzovandoni@infomedia.it. tante, perché espone il proble-

36 VBJ N. 62 - Marzo/Aprile 2005


SOFTWARE ENGINEERING

ma che il pattern intende risolvere ed eventuali • Consequences, possibili conseguenze prati-


vincoli da prendere in considerazione; che relative alla soluzione adottata;

• Applicability, alcuni possibili usi concreti del • Known uses, un elenco di usi noti del pattern.
pattern; Va notato che questi possono essere antece-
denti alla pubblicazione dello stesso pattern.
• Structure, il diagramma UML delle classi coin- In questo caso il pattern costituisce semplice-
volte; mente la formalizzazione di un procedimento
già noto e applicato in vari contesti.
• Participants, una descrizione più dettagliata Non per questo ne viene diminuita l’utilità.
delle responsabilità delle classi coinvolte; Anzi, descrivere in modo preciso una buo-
na pratica di programmazione può essere il
• Collaborations, eventuali possibili interazioni modo migliore per incentivarne l’utilizzo an-
con altri pattern; che in altri progetti.

Listato 1 Implementazione del pattern Iterator in VB.NET

Namespace Iterator Public Function NextItem() As Boolean


‘’’’’’’’’’’’’’’’’’’’’’’’’’’’ Implements Iterator.NextItem
‘’’ Interfaccia Iterator ‘’’ NextItem = False
‘’’’’’’’’’’’’’’’’’’’’’’’’’’’ If miCurrent < moCollection.Count
Public Interface Iterator Then
Function FirstItem() As Boolean miCurrent = miCurrent + 1
Function NextItem() As Boolean NextItem = True
Function CurrentItem() As Object End If
End Interface End Function
End Class
‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’
‘’’ Interfaccia Collection ‘’’ ‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’
‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’ ‘’’ Classe ConcreteCollection ‘’’
Public Interface Collection ‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’
Function CreateIterator() As Iterator Public Class ConcreteCollection
Function AddItem(ByVal oItem As Object) Implements Collection
As Boolean Friend moItems(10) As Object
Function Count() As Integer Private miCount As Integer = 0
End Interface Public Function CreateIterator() As
Iterator
‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’ Implements Collection.CreateIterator
‘’’ Classe ConcreteIterator ‘’’ Return New ConcreteIterator(Me)
‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’ End Function
Public Class ConcreteIterator Public Function AddItem(ByVal oItem As
Implements Iterator Object) As Boolean
Private miCurrent As Integer = 0 Implements Collection.AddItem
Private moCollection As ConcreteCollection AddItem = False
Public Sub New(ByVal oCollection As Collection) If miCount < 10 Then
moCollection = oCollection moItems(miCount) = oItem
End Sub miCount = miCount + 1
Public Function CurrentItem() As Object AddItem = True
Implements Iterator.CurrentItem End If
Return moCollection.moItems(miCurrent) End Function
End Function Public Function Count() As Integer
Public Function FirstItem() As Boolean Implements Collection.Count
Implements Iterator.FirstItem Return miCount
miCurrent = 0 End Function
Return IIf(moCollection.Count > 0, End Class
True, False) End Namespace
End Function

N. 62 - Marzo/Aprile 2005 VBJ 37


SOFTWARE ENGINEERING

Al di là di queste proprietà, è piuttosto comu- • Motivation. L’idea di separare l’implementa-


ne che venga fornita anche una implementazione zione di una collezione, come ad esempio una
di esempio, utilizzando principalmente linguaggi lista o uno stack, dall’implementazione degli
object-oriented come C++ o Java. algoritmi necessari per accedere ai suoi ele-
menti, e di includerli all’interno di uno o più
Uso di un design pattern oggetti iterator, porta con sé diversi vantag-
Il compito più difficile per un progettista che vo- gi: anzitutto, come già detto, permette di non
glia applicare un determinato pattern ad un pro- esporre la struttura interna della lista; inoltre,
prio progetto, sta nella scelta di quale pattern uti- apre la possibilità di accedere agli elementi
lizzare. Questa affermazione può sembrare para- della collezione in vari modi (sequenzialmen-
dossale, ma è estremamente realistica. te, con accesso diretto, in modo ordinato,
Il problema, anzi, può essere ancora più a mon- ecc…), semplicemente definendo per ognu-
te. La ricerca di un pattern, infatti, implica perlo- na di queste modalità un diverso tipo di ite-
meno l’avere maturato la sensazione di avere un ratore; infine, consente di limitare il numero di
problema di progettazione. metodi definiti nella collezione, e di sfruttare
Spesso il pattern non viene nemmeno ricercato, lo stesso tipo di iteratore, per gestire colle-
perché il problema non viene riconosciuto come zioni di tipo diverso, semplificando il codice
tale. Nei casi più sfortunati, il problema si manife- delle applicazioni client.
sterà poi quando lo sviluppo del software sarà già
stato intrapreso o addirittura terminato, e la scel- • Applicabilità. L’applicabilità del pattern è di
ta di progettazione sbagliata potrà avere conse- fatto definita nelle motivazioni. Il pattern può
guenze anche pesanti in termini di manutenzione essere usato in tutti i casi in cui si debba de-
o estendibilità del software. Anche ammettendo finire una classe costituita da una collezione
di avere più o meno individuato il proprio proble- di oggetti più semplici, indipendentemente da
ma, però, la scelta del pattern da applicare non come la collezione è strutturata.
è banale, perché il “modello mentale” che il pro-
gettista si è fatto del proprio problema può an- • Structure. La struttura della soluzione è mo-
che essere molto distante dalla descrizione della strata in Figura 1. Una generica collezione de-
motivation del pattern. La difficoltà che si incon- finisce un metodo CreateIterator che permette
tra è quindi quella di capire che il proprio proble- di creare un iteratore compatibile con la sua
ma può essere modellato ricorrendo ad un deter- struttura. L’iteratore fornisce i metodi neces-
minato pattern. sari per accedere agli elementi dell’interfaccia.
Una volta risolto questo problema, il compito di Le due classi ConcreteCollection e ConcreteI-
applicare la soluzione indicata sarà, nella maggior terator costituiscono implementazioni concre-
parte dei casi, molto più semplice. te delle interfacce.

Il pattern Iterator • Participants. Più in dettaglio, queste sono le re-


Iterator è uno dei pattern più noti ed utilizzati, tra sponsabilità delle varie classi ed interfacce:
quelli descritti nel libro della GoF, e credo sia il mi-
glior candidato per un introduzione all’argomento. Il
pattern è applicato anche in molte librerie commer-
ciali. Ad esempio, qualsiasi cursore utilizzato per
accedere ai dati di un recordset SQL può essere
considerato un iteratore. Chi preferisca un paragone
più concreto può pensare alla classe DataReader
di ADO.NET, che implementa un cursore forward-
only sui dati sottostanti. Vediamo quindi come sia
possibile descrivere questo pattern utilizzando le
proprietà precedentemente menzionate.

• Intent. L’obiettivo è quello di permettere di ac-


cedere agli elementi di una collezione senza far Figura 1 Architettura del pattern Iterator
conoscere alle applicazioni client la struttura in-
terna della stessa.

38 VBJ N. 62 - Marzo/Aprile 2005


SOFTWARE ENGINEERING

• l’interfaccia Iterator definisce i metodi che Object. In questo modo, diventa possibile utiliz-
dovranno essere implementati da qualsiasi zare la collezione per gestire elementi di qual-
iteratore concreto per permettere alle appli- siasi tipo, anche se non ci sarà nessun control-
cazioni client di spostarsi tra i vari elementi lo sul fatto che elementi di tipo diverso venga-
della collezione; no inseriti nella stessa collezione. Le due inter-
• la classe ConcreteIterator implementa l’inter- facce e le due classi, in questo esempio, sono
faccia Iterator per una specifica collezione; state per comodità implementate all’interno del-
• l’interfaccia Collection definisce i metodi che lo stesso file di codice.
dovranno essere implementati da una collezio- Più probabilmente, un’implementazione reale
ne che debba permettere l’utilizzo di iteratori; vedrebbe separate le due interfacce dalle due
• la classe ConcreteCollection implementa classi.
l’interfaccia Collection. Le due classi dovranno però essere in qualche
modo collegate, perché è ovvio che il ConcreteI-
• Collaborations. Nessuna. terator dovrà avere un accesso privilegiato alla
ConcreteCollection, in modo da poterne mani-
• Consequences. Le conseguenze derivanti dal- polare gli elementi senza che questa sia neces-
l’utilizzo del pattern sono la possibilità di de- sariamente costretta a definire dei metodi pub-
finire diversi modi per accedere agli elemen- blici per farlo (il che, tra l’altro, renderebbe qua-
ti della collezione, una semplificazione dell’in- si inutile l’iteratore).
terfaccia pubblica delle classi Collection, che Questa modalità di accesso privilegiato tra clas-
non dovranno dotarsi dei metodi di naviga- si viene resa disponibile con diverse modalità da
zione, e la possibilità di avere diversi iteratori quasi tutti i linguaggi di programmazione orien-
contemporaneamente attivi sulla stessa col- tati ad oggetti.
lezione, che quindi non sarà limitata ad avere Con Visual Basic.NET si può utilizzare la parola
un unico elemento “corrente” o selezionato. chiave Friend, che indica che un particolare me-
todo o proprietà di una classe deve risultare ac-
• Known uses. Gli iteratori sono comunemente cessibile da tutte le altre classi dello stesso pro-
usati in molte librerie e framework ad ogget- getto, ma invisibile all’esterno dello stesso, esat-
ti, sia specializzati, come quelli per l’accesso tamente come se fosse un membro Private.
a database relazionali, sia generici, come ad L’iteratore utilizza questo privilegio per accede-
esempio la Standard Template Library (STL) re alla struttura della collezione, implementata in
di C++. questo esempio tramite un semplice array, e te-
nere traccia della posizione corrente.
Implementazione del pattern in VB.NET L’applicazione di esempio è costituita da una
Il codice di esempio allegato all’articolo ripor- form che sfrutta il principio dell’iteratore per per-
ta l’implementazione delle due interfacce e del- mettere di navigare all’interno della collezione in
le due classi tratteggiate nel paragrafo prece- due modi diversi e indipendenti.
dente. Il numero di metodi definiti nelle interfac-
ce è stato volutamente contenuto in modo da Conclusioni
evidenziare meglio le caratteristiche progettua- La conoscenza dei principali pattern di proget-
li del pattern. tazione permette in molti casi concreti di evitare
L’interfaccia Iterator contiene due metodi per di “reinventare la ruota”, ricorrendo invece a so-
spostare la posizione del record corrente, e un luzioni già note e consolidate.
metodo CurrentItem che permette di accedere Spesso, capita di ritrovare all’interno di un pat-
all’elemento corrente secondo la posizione del- tern la formalizzazione di un ragionamento che
l’iteratore. L’interfaccia Collection, da parte sua, ha portato a una particolare implementazione.
contiene i metodi necessari per aggiungere nuo- In questi casi, il pattern può aiutare a compren-
vi elementi e per contarne il numero. dere meglio implicazioni e limitazioni della solu-
Per definire il tipo degli elementi mantenuti all’in- zione adottata.
terno della collezione sarebbe corretto utilizzare la L’applicazione di pattern, in particolare, può
programmazione generica, ma questo sarà pos- evitare l’adozione di soluzioni troppo rigide od
sibile solo con la prossima versione di .NET. orientate alla semplice risoluzione di problemi di
Per questo motivo, ci si accontenterà di por- programmazione, che alla lunga potrebbero pro-
re il tipo degli elementi della collezione uguale a vocare seri problemi di manutenzione.

N. 62 - Marzo/Aprile 2005 VBJ 39


INTELLIGENZA ARTIFICIALE

Oracoli di Turing
e Sistemi
Logicamente Aperti
In questo articolo, anteprima assoluta, parliamo di Nuove Frontiere della Computazione:
“frontiere” che hanno a che fare con il concetto stesso di computazione oltre il limite di
Turing. In particolare sono illustrate due teorie della computazione, unite da un mix di
idee nuove, tra cui la ricerca sui “sistemi logicamente aperti”.

di Ignazio Licata

G
ran parte dei progressi dell’informatica sono ri- ceva effettivamente quando ese-
volti ad ampliare le risorse dei sistemi di calco- guiva un calcolo. Diversamente
lo in termini di tempo/velocità di elaborazione da quello che si sarebbe portati a
e capacità di memoria. In particolare ci si è concentrati pensare oggi, il problema non ave-
sul “collo di bottiglia” di Von Neumann – computazione va una vocazione puramente appli-
step by step –, ideando architetture massivamente pa- cativa, ma era legato piuttosto al
rallele che distribuiscono l’elaborazione tra più nodi di programma di assiomatizzazione di
calcolo/memoria interconnessi. In alcuni casi si è fatto D. Hilbert ed ai limiti messi in luce
ricorso anche a materiali diversi per realizzare le porte nel 1931 da K. Gödel con i suoi fa-
logiche, in alternativa agli attuali chip di silicio; è il caso mosi teoremi di indecidibilità ed in-
dei bio-chip o del calcolatore ottico. In nessuno di que- completezza: non esiste un siste-
sti casi però la teoria fondamentale della computazio- ma inferenziale deduttivo in grado
ne che deriva dal formidabile lavoro di Alan Turing, On di rispondere della verità o falsità
computable numbers (1936), viene messa radicalmen- di ogni proposizione costruibile tra-
te in discussione. In questa sede vogliamo proporre al- mite funzioni ricorsive enumerabili.
cune considerazioni altamente speculative sulla possi- In pratica una MT fornisce il con-
bilità di definire nuovi modelli di computazione, equiva- testo matematico corretto ed uni-
lenti o addirittura più potenti di quello offerto dalla Tu- versale per la definizione genera-
ring-computabilità. le di algoritmo, in accordo con la
Tesi di Church-Turing: Le MT sono
Il limite di Turing una classe di automi computazio-
Alan Turing mise a punto la sua famosa Macchina di nalmente universali.
Turing (MT) considerando ciò che un essere umano fa- Al di là dei vari formalismi (mac-
chine a registri, sistemi di produ-
zione di Post,Lambda-Calcolo di
Church,Grammatiche di Chomsky,
Ignazio Licata è un fisico teorico. Si occupa di sistemi
ecc.), la MT resta il modello con-
complessi e processi cognitivi. Nel 1998 ha fondato l’Isti-
tuto di Cibernetica Non-Lineare per lo Studio dei Sistemi cettuale più brillante e chiaro del-
Complessi. Può essere contattato tramite e-mail all’indirizzo la computazione, e può essere de-
ilicata@infomeda.it scritta come un nastro infinito sul

N. 62 - Marzo/Aprile 2005 VBJ 41


INTELLIGENZA ARTIFICIALE

quale un automa a stati finiti può


leggere, scrivere e manipolare un
numero finito di simboli operan-
do secondo un set di regole ap-
plicate in tempo discreto, passo
dopo passo. Queste poche os-
servazioni suggeriscono che la
nozione di Turing-computabilità
(T-comp) nasce in un ambito al-
tamente formalizzato ed è mirata
all’analisi sintattica dell’informa-
zione. In realtà il concetto d’infor-
mazione ha una portata molto più
ampia, che possiamo compren-
dere rifacendoci ai sistemi fisici.
In natura non esiste informazio- Figura 1 Classi di complessità P ed NP. La “trattabilità” computazionale di
un problema conduce ad identificare delle classi di complessità
ne che non sia associata a qual- in relazione al tempo richiesto di Turing-computabilità.
che forma di materia-energia di- I problemi P richiedono in genere una quantità polinomiale di tempo
screta e/o continua; ogni siste- di lavoro di un algoritmo deterministico. Gli NP sono risolvibili
ma fisico o biologico può esse- attraverso algoritmi non-determistici che incorporano elementi
random e necessitano di un tempo esponenziale, ma la loro
re considerato un elaboratore di soluzione può essere verificata in tempo finito.
informazione in cui il valore di al-
cune grandezze in entrata viene
trasformato in uscita dalla dina- grado di decidere se il processo di computazio-
mica interna del sistema. In questo senso si può ne avrà termine o no, ossia se l’algoritmo produr-
dire che ogni sistema fisico “computa”, e biso- rà o meno quella stringa. I computer non sanno
gna prendere in considerazione altri aspetti del- mai quando è il momento di smettere! Può essere
l’informazione: la dinamica (la distribuzione spa- utile vedere il risultato in termini di linguaggi for-
zio-temporale dell’informazione) e la semantica (il mali: con gli strumenti del linguaggio è impossi-
valore che l’informazione ha per il sistema, que- bile stabilire se una certa espressione appartiene
stione particolarmente importante nello studio dei al linguaggio o meno, dunque: esistono linguaggi
sistemi biologici). Possiamo dunque chiederci se i ricorsivamente enumerabili ma non ricorsivi (teo-
nuovi scenari relativi allo studio dei sistemi caoti- rema sui linguaggi ricorsivi).
ci, quantistici e biologici suggeriscono nuovi mo- Intuitivamente è possibile connettere questa li-
delli di computazione. mitazione ad una “rigidità” delle MT, dei linguaggi
Le MT sono caratterizzate da alcune limitazio- e dei sistemi formali. Infatti è possibile mostrare
ni fondamentali strettamente connesse ai teoremi che per superare un singolo problema di indeci-
di K. Gödel, e globalmente indicate come limite dibilità – ma ne resteranno sempre infiniti, in ac-
di Turing. È possibile dimostrare che le MT sono cordo all’universalità dei risultati di Gödel-Turing!
un insieme infinito numerabile (cioè possono es- – nuovi assiomi devono essere aggiunti al siste-
sere contate), mentre l’insieme di tutte le funzioni ma, ossia è necessario modificare la struttura del
che si possono costruire ha la potenza del conti- sistema. Siamo ormai talmente abituati a convive-
nuo, ossia sono un insieme infinito non numera- re con l’ovvietà di questo risultato da non riuscire
bile. È piuttosto intuitivo comprendere che que- ad apprezzare il gioco d’implicazioni a cui condur-
sto risultato è collegato all’aspetto discreto della rebbe la violazione di tale limitazione.
T-comp, ed al modo di enumerare le MT. In altre
parole, il grado di “infinità” delle MT è più bas- Oracoli e sistemi logicamente aperti
so di quello dell’insieme delle funzioni costruibili, Consideriamo una struttura ibrida del tipo (MT,
e dunque esistono funzioni non computabili se- O), dove con il simbolo O indichiamo un disposi-
condo Turing (funzioni non-ricorsive). Un esempio tivo ideale chiamato oracolo. Nella sua accezio-
classico è dato dal problema della fermata (hal- ne più ampia un oracolo può essere considerato
ting problem): dato un algoritmo ed una stringa è come un insieme di procedure di decisione in gra-
possibile dimostrare che non esiste alcuna MT in do di vincolare l’attività della MT. Potrebbe esse-

42 VBJ N. 62 - Marzo/Aprile 2005


INTELLIGENZA ARTIFICIALE

Tabella 1 Le caratteristiche significative della computazione naturale rispetto alle Macchine di Turing

Turing Computabilità Computazione naturale-Sistemi formali continui

Programmabilità; il processo termina dopo un Capacità evolutive auto-organizzanti; il processo


numero finito di passi; problemi di indecidibilità, non termina, modifica i suoi obiettivi in relazione al
halting-problem contesto

Informazione discreta; logica binaria; distribuzione Informazione continua; logica a valori multipli; pat-
sintattica dell’informazione tern continui nello spazio-tempo
Processo deterministico; emergenza computazionale Elementi random; emergenza intrinseca

Dati esatti; output definito Dati “fuzzy”; strategie di ottimizzazione adattiva

Seriale/Lineare Parallela/Non-Lineare

re una tabella di valori, oppure una “black-box”. Turing-Computabile, per il quale è impossibile sta-
Ciò che qui conta è rendersi conto del tipo di li- bilire una procedura effettiva per stabilire a priori
mitazioni di una MT. Per definizione, un oracolo è quale informazione è rilevante per la descrizione
dunque in grado di superare i limiti di una MT, ad del sistema. Questo perché l’informazione viene
esempio fornendo l’algoritmo di un insieme non fornita al sistema in modo non-algoritmico (ran-
ricorsivo rispetto alla MT, e risolvendo così l’hal- dom) e soprattutto perché il gioco di interrelazioni
ting problem. In pratica, l’accesso all’oracolo ren- tra sistema ed ambiente è particolarmente com-
derebbe una macchina ibrida capace di affrontare plesso e porta ad una continua riorganizzazione
classi di problemi che nessun sistema algoritmi- strutturale del sistema che non può essere espli-
co può risolvere. Un altro campo in cui gli oracoli citata tramite una semplice procedura ricorsiva.
hanno mostrato una funzione teorica è nella clas- In questa classe rientrano i sistemi non-lineari e
sificazione dei problemi “trattabili” o “intrattabili”, context-dependent, come gli sciami o esseri col-
risolvibili cioè in tempo polinomiale o esponenzia- lettivi, e le reti neurali. Questi sistemi presentano
le in relazione alla dimensione n del problema. Lo un tipo di emergenza detta intrinseca o osserva-
studio delle classi P ed NP è uno dei grandi pro- zionale, non riconducibile ad una produzione com-
blemi aperti della matematica, ma alcune convin- putazionale. È possibile ordinare in una gerarchia
centi argomentazioni hanno messo in luce che i di ordini di complessità i LOS, e dimostrare che
problemi del tipo “NP-completo” (come i problemi è impossibile descrivere un sistema logicamente
di ottimizzazione, dal “commesso viaggiatore” al aperto per mezzo di un singolo modello formale,
folding protein), possono essere ridotti a proble- ossia una MT, e che un sistema ad alto grado di
mi “trattabili” con algoritmi in tempo polinomiale apertura logica può essere soltanto approssima-
con l’ausilio di oracoli. La stessa linea di ragio- to da un altro con apertura di grado n, con n in-
namento ha mostrato però che il tipo di soluzio- terpretabile come numero di vincoli che formaliz-
ne dipende strettamente dalle caratteristiche del- zano le relazioni tra sistema ed ambiente. D’altra
l’oracolo adottato, e dunque non ha un carattere parte, una MT può essere identificata con un ti-
universale ma piuttosto relativo. pico sistema logicamente chiuso (LCS), la cui ar-
È possibile gettare nuova luce sulle caratteristi- chitettura globale non cambia, o comunque può
che delle MT ed ibride utilizzando la teoria dei si- sempre essere ricavata da una procedura effetti-
stemi logicamente aperti (LOS). Com’è noto, tutti i va, ragione essenziale degli scacchi storici dell’IA
sistemi fisici possono essere classificati utilizzando “forte”. Arriviamo dunque al punto essenziale:
tre categorie principali: 1) i sistemi conservatori di Una MT è un sistema logicamente chiuso, un
informazione, che conservano l’energia; 2) i sistemi oracolo è un sistema logicamente aperto.
distruttori di informazione, soggetti a dissipazio- Anche se un oracolo ideale non esiste, ed è frut-
ne; 3) i sistemi amplificatori di informazione, dove to del genio speculativo di A.Turing, è possibile di-
si hanno fenomeni di emergenza e di auto-orga- sporre di dispositivi con capacità “oracolari” che
nizzazione in tempo polinomiale o esponenziale. corrispondono a vari gradi di apertura logica, come
In questa terza classe rientrano i sistemi logica- le reti neurali o gli agenti autonomi dell’IA distribui-
mente aperti, descritti tramite un modello formale ta. Lo studio di questi sistemi suggerisce un nuo-
logicamente aperto, ad esempio un sistema non vo paradigma computazionale analogico.

N. 62 - Marzo/Aprile 2005 VBJ 43


INTELLIGENZA ARTIFICIALE

Sistemi super & sub Turing aperti presentano fenomeni di emergenza intrin-
Lo studio dei sistemi logicamente aperti con ca- seca e dunque sono soggetti ad un forte grado
pacità “oracolari” trova in un gran numero di si- di impredicibilità logica. La computazione “oraco-
stemi fisici la sua ispirazione. Questo corrisponde lare” appare dunque come una forma di compu-
all’ovvia considerazione che in natura non esisto- tazione “dedicata”, costruita sul particolare pro-
no i problemi di “incompletezza” ed “indecidibi- blema e sulle caratteristiche del sistema. La cosa
lità” che affliggono i nostri sistemi formali. La T- non dovrebbe sorprenderci, perché conosciamo
comp è soltanto uno dei modi possibili che pos- bene un dispositivo di questo tipo, messo a pun-
siamo adottare per descrivere il flusso di informa- to dall’evoluzione in millenni di “prove ed errori”:
zione nei processi naturali e artificiali. Una carat- la mente umana.
teristica che va rimarcata, oltre alla non-linearità,
alla sensibilità al contesto, alle capacità evolutive Bibliografia:
ed auto-organizzative multi-livello, è la continuità, [1] M. Davis, “Il calcolatore universale”, Adepti,
che situa il “grado di infinità” dei sistemi oracolari Milano, 2003;
alla potenza del continuo. Ad esempio le configu- [2] M. Davis, “Computability and Unsolvability”,
razioni di una rete neurale possono essere para- Dover, NY, 1982;
metrizzate tramite un parametro reale connesso [3] J.W.Dawson Jr., “Dilemmi logici. La vita e
ai pesi della rete. In generale, lo studio dei siste- l’opera di Kurt Gödel”, Bollati-Boringhieri, To-
mi formali continui, ancora allo stato germinale, rino, 2001;
ha permesso di individuare le caratteristiche signi- [4] A. Hodges, “Storia di un enigma.Vita di Alan
ficative della computazione naturale rispetto alle Turing 1912-1954”, Bollati-Boringhieri, Tori-
MT (vedi Tabella 1). no,1991.
Ma in pratica, quali sistemi fisici possono esse- [5] G. Chaitin, “Information, Randomness and In-
re effettivamente utilizzati per realizzare disposi- completness”, World Scientific, Singapore,
tivi dalle capacità super-Turing? Esistono in que- 1990;
sto senso degli “indizi” interessanti, tutti piutto- [6] J.L.Casti & A.Karlqvist (eds.), “Boundaries and
sto recenti, che in questa sede possiamo soltan- Barriers”, Addison-Wesley,1996;
to menzionare. Esistono classi di sistemi dinami- [7] I. Licata, “Verso una teoria generale dei siste-
ci che possono risolvere formulazioni particolari mi intelligenti”, neuroscienze.net, vol.1, n.1,
dell’halting-problem. Le reti neurali ricorrenti(RNR) 2004;
a modificazione sincrona e con pesi reali posso- [8] C. Hewitt, “The Challenge of Open Systems”,
no ottenere ottime performance su problemi NP- in Byte, 10, 1985;
completi, come i sistemi DAI asincroni, ed anche [9] C. Hewitt, “Open Information Systems:
alcuni algoritmi quantistici mostrano di poter ri- Semantics for Distributed Artificial Intelligence”,
solvere in tempi polinomiali problemi di difficoltà Artificial Intelligence, 47, 1991;
esponenziale per sistemi classici di computazio- [10] G. Minati, M.P. Penna, E.Pessa,
ne. Stesse indicazioni provengono dal DNA-com- “Thermodynamical and Logical Openness in
puting, dove le informazioni opportunamente “in- General Systems”, Systems Research and
cise” sul DNA vengono elaborate da processi en- Behavioral Science, 15, 1998;
zimatici. Infine, anche il chaos computing, erede [11] H.T.Siegelmann, “Computation Beyond the
delle tecniche di controllo dei sistemi caotici, sta Turing Limit”, Science, 268,1995;
entrando in una fase matura, ricca di grandi pos- [12] H.T. Siegelmann, “Neural Networks and
sibilità su problemi di ottimizzazione. Analog Computation.Beyond the Turing Limit”,
È possibile dunque immaginare una tecnologia di Birkhäuser, Boston, 1999;
oracoli neuro-fuzzy, caotici e quantistici. Il prezzo [13] B. MacLennan, “Transcending Turing
da pagare è l’universalità. In tutti i casi citati in- Computability”, Tech. Rep. UT-CS-01-473,
fatti è possibile fornire dei contro-esempi in cui la Dept. Comp. Science, Univ. Of Tennessee,
prestazione viene compromessa da piccole varia- Knoxville, 2001;
zioni dei parametri in gioco, in corrispondenza di [14] D. Deutsch e R. Jozsa, “Rapid Solution of
ciò che si delineano essere come soglie critiche Problems by Quantum Computation”, Proc.
della capacità computante. Al di là dei casi parti- Royal Soc., A439, 1992;
colari, esiste una considerazione intuitiva che può [15] A. Berthiaume e G. Brassard, “Oracle Quan-
aiutarci a comprendere questa convivenza di ca- tum Computing”, Jour. of Modern Optics, XLI,
pacità super & sub Turing. I sistemi logicamente 1994.

44 VBJ N. 62 - Marzo/Aprile 2005


ARCHITECT'S CORNER

Un cluster
in 15 clic
Specialità del giorno: soluzioni pratiche invece della teoria

di Ingo Rammer

N
elle ultime puntate di questa rubrica, ho scritto lo indirizzo IP. In questo scena-
abbastanza di design e di sviluppo di applica- rio, si può non solo gestire un ca-
zioni scalabili. Qualcosa che vi devo per com- rico di lavoro superiore, ma si è
pletezza è una dimostrazione pratica di come installare anche protetti dalle interruzioni di
un cluster e quali sono i vantaggi che se ne ricevono. servizio del sistema: se una delle
In effetti non è in realtà un classico argomento di archi- due macchine va in errore, l’altra
tettura del software. Ho comunque deciso di mostrarvi può gestire semplicemente il ca-
questo aspetto pratico, poiché ho osservato che molti rico ulteriore.
sviluppatori e architetti non sanno come sia facile crea- L’utente noterebbe questa “ava-
re un cluster “load balancing” con Windows. ria” solo perché le prestazioni del-
Se avete seguito i numeri precedenti della rubrica Ar- l’applicazione si degradano di una
chitect’s Corner, avrete certamente notato che sono certa percentuale.
un fautore delle applicazioni scalabili, applicazioni che Tuttavia, l’applicazione non an-
possono essere distribuite su un cluster di macchine drà in errore e continuerà a fun-
per utilizzarne l’ulteriore potenza di elaborazione. Ma zionare.
un attimo! Utilizzare un cluster può non solo migliorare Qualcosa di analogo sarà vero
il throughput dell’applicazione ma permette di ottenere anche per l’installazione dei ser-
anche dei sostanziali vantaggi, anche se a lavorare con vice pack e degli aggiornamenti
l’applicazione sono solo alcuni utenti. del sistema operativo: si posso-
no rimuovere semplicemente sin-
Una macchina va giù... e nessuno lo nota goli nodi dal cluster, applicare l’ag-
Provate a immaginare che i componenti di servizio giornamento a questi nodi, esegui-
(web service, remoting e anche siti web) siano in ese- re il reboot se necessario, e riunirli
cuzione su due macchine in parallelo. al cluster in seguito.
Immaginate anche che entrambe le macchine si com- Possono anche esistere cluster in
portino in modo che dall’esterno si veda un singo- cui vi è un mix di sistemi operati-
vi, dove alcune macchine utilizza-
no Windows NT 4.0, alcune Win-
dows 2000, e altre che sono già
state aggiornate a Windows Ser-
ver 2003.
Ingo Rammer è il fondatore di thinktecture, una com- Fantasticherie? No. È necessario
pagnia che aiuta gli sviluppatori e gli architetti software dell’hardware speciale? No. È co-
a progettare e implementare applicazioni e Web service stoso? No! La funzionalità che ho
.NET. Partecipa come speaker alle conferenze internazio-
descritto è già compresa nel si-
nali dedicate a tali argomenti ed è autore del best-seller
Advanced .NET Remoting (APress). È Microsoft Regional stema operativo Windows Server
Director per l’Austria e può essere contattato tramite il sito 2003 (e anche di Windows Server
http://www.thinktecture.com/staff/ingo. 2000, ma con meno Wizard GUI

46 VBJ N. 62 - Marzo/Aprile 2005


ARCHITECT'S CORNER

fantasiosi per effettuare la configurazione). Tutto Mondi in connessione


ciò che è necessario per implementare Windows Prima di mostrare passo per passo come si può
Network Load Balancing (NLB) sono due server creare un cluster con circa 15 clic del mouse, per-
(sino a 32) standard. mettetemi una nota di cautela: leggete la docu-
Non devono essere identici e non necessitano di mentazione (almeno in seguito)! Specialmente se si
hardware speciale: a scopo dimostrativo, si po- pensa di utilizzare un cluster NLB in un ambiente
trebbero anche utilizzare due notebook. di produzione, si dovranno fare diverse scelte che
dipendono dalla configurazione della rete.
Elementi di NLB Queste scelte influenzeranno l’ottimalità del-
Contrariamente ad altre soluzioni di load balan- la scalabilità del cluster, ma la discussione di
cing (come le soluzioni dedicate Cisco), Windows questi argomenti è un po’ troppo per un artico-
NLB non richiede un sistema dedicato per ese- lo come questo.
guire il dispatching delle richieste in ingresso. In- La documentazione online di Windows NLB con-
vece, tutte le macchine in un cluster comunicano tiene alcune ottime liste di controllo di ciò che si
tra di loro per capire chi deve gestire la prossima deve considerare prima di creare un cluster. Ciò
richiesta in ingresso. è importante perché una configurazione non otti-
Ciò riduce il potenziale degli errori critici (poiché male può anche influenzare in modo negativo le
rimuove il cosiddetto single-point-of-failure) e mi- prestazioni, la scalabilità, l’affidabilità e la dispo-
nimizza l’investimento, poiché non è necessario nibilità dell’applicazione.
acquistare ulteriore hardware. Per iniziare a creare il cluster, bisogna loggarsi
Per illustrare questa situazione, supponiamo di su una macchina Windows Server 2003 (questa
avere due macchine server differenti (SERVER01 macchina non deve necessariamente far parte del
e SERVER02) con i seguenti indirizzi IP: cluster) e avviare il tool NLB manager, raggiungi-
SERVER01: 192.168.0.41 bile da Start  Administrative Tools  Network
SERVER02: 192.168.0.42 Load Balancing Manager. In questa applicazione,
Queste due macchine devono essere connes- si scelga Cluster  New, in modo che appaia il
se a un cluster con l’indirizzo IP virtuale (VIP) dialogo in Figura 1.
192.168.0.40, in modo che i web service, i com- In questo dialogo, si deve specificare il nuovo
ponenti del remoting e i siti web possano essere indirizzo IP virtuale (VIP) del futuro cluster, la ma-
distribuiti in modo “load balanced”. schera di sottorete, il nome completo del DNS e
la modalità operativa. Nella documentazione onli-
ne di NLB, è presente una lunga e det-
tagliata discussione di diverse pagine
su queste modalità, che possono es-
sere riassunte approssimativamente in
queste indicazioni: provare per prima
la modalità Multicast (senza IGMP, a
meno che non si sia sicuri al 100%
che la rete lo supporti).
Se questa non funziona nella vostra
rete, passate a Unicast. Unicast è un
po’ più lento e non permette una co-
municazione distinta tra i nodi (tutta-
via tutti i nodi sono sempre raggiungi-
bili dall’esterno del cluster).
Dopo aver premuto il pulsante Next,
si ha la possibilità di specificare ulte-
riori indirizzi VIP, che nel nostro caso
non sono necessari.
Il successivo dialogo è più interessan-
te: permette di specificare le cosiddette
Figura 1 Creazione di un nuovo cluster Port Rules, che configurano come ven-
gono distribuite le richieste in ingresso
tra le macchine del cluster.

N. 62 - Marzo/Aprile 2005 VBJ 47


ARCHITECT'S CORNER

Con un doppio clic sulla prima regola di default so provenienti dallo stesso utente siano gestite
già esistente, si possono modificare i dettagli come dallo stesso nodo.
mostrato nella Figura 2. Per le applicazioni scalabili che sono state svilup-
A meno che non si utilizzi lo stato di sessione in- pate in modalità cluster-compatibile, questa impo-
memory per le applicazioni web, si deve sempre stazione ha delle conseguenze piuttosto negative,
modificare le impostazioni di affinità da “Single” pertanto di solito si dovrebbe scegliere “None”.
a “None” per permettere il miglior failover traspa- Dopo aver completato questo dialogo, si deve
rente possibile (ossia, in caso di interruzione del- specificare l’indirizzo IP del primo nodo del clu-
l’operatività di un computer, interviene automati- ster. Per ciascun nodo, si deve anche specificare
camente un’altra macchina ad assorbire il carico un ID univoco nel cluster (un valore da 1 a 32). Es-
delle richieste. La transizione è del tutto traspa- sendo il primo nodo, si deve selezionare 1 come
rente all’utente. NdT). ID. Completata la configurazione del primo nodo,
Se non si modifica questa impostazione a NLB manager contatterà la macchina specificata
“None”, ma la si lascia a “Single” o a “Class C”, utilizzando WMI (Windows Management Instru-
ciò inciderà sulla distribuzione delle richieste in mentation) per applicare alcune modifiche di con-
ingresso. Dopo che la prima richiesta in ingres- figurazione direttamente a ciascun nodo. Nel frat-
so da un singolo host (o da una intera sottorete tempo, si può continuare ad aggiungere ulteriori
di classe C) è stata assegnata in modo random, nodi nella schermata principale di NLB manager,
questa impostazione specifica che le successi- come mostrato nella Figura 3.
ve richieste che provengono dalla stessa origi- Nota: NLB è compatibile con una ampia varie-
ne (host o sottorete) verranno gestite dallo stes- tà di hardware di rete. In passato, ho comunque
so nodo del cluster. sperimentato dei problemi con le schede di rete
Ciò è ad esempio necessario se si esegue il de- on-board, al punto di aver dovuto inserire in uno
ployment di una applicazione ASP vecchio stile slot della macchina una seconda scheda di rete
(pre .NET) che utilizza lo stato di sessione in-me- per supportare NLB.
mory. In questo caso, la sessione verrà diretta-
mente associata a una singola macchina del clu- Internet Information Server in un cluster
ster e sarà disponibile solo a questa macchina. È Prima di poter pubblicare i propri Web Service o
perciò necessario che tutte le richieste in ingres- componenti Remoting in un cluster, si deve ese-
guire una ulteriore modifica alla configurazione.
Per inciso: NLB funziona a livello di connessio-
ni TCP/IP ed è distribuito solo con le richieste di
connessione iniziale. Non appena la connessio-
ne tra un client e un nodo del cluster è stata sta-
bilita, NLB non prenderà più parte in alcuna ul-
teriore comunicazione. Naturalmente ciò non do-
vrebbe comportare alcun problema, se non fosse
per il fatto che i Web Service ASP.NET e i com-
ponenti .NET Remoting riutilizzano le connessio-
ni già stabilite per lunghi periodi di tempo. Nelle
specifiche HTTP 1.1, ciò è detto “Keep-Alive”. Ciò
significa che una connessione HTTP già stabilita
verrà disconnessa solo dopo due minuti di inat-
tività. Ciò ha molto senso per i siti web classici
con una gran quantità di elementi <IMG>, perché
può migliorare le prestazioni, altrimenti dovreb-
be essere creata una nuova connessione TCP/IP
per ogni <IMG>.
Nelle architetture application-server ad alta di-
sponibilità, il keep-alive è tuttavia alquanto nega-
tivo. Se fallisce un nodo, tutte le macchine che
Figura 2 Modifica dell’affinità di sessione del cluster hanno una connessione persistente (keep-alive) ad
essa riceverebbero una eccezione. E ciò accade
anche se volessero solamente inviare una ulte-

48 VBJ N. 62 - Marzo/Aprile 2005


ARCHITECT'S CORNER

Figura 3 Aggiunta di ulteriori nodi

riore richiesta un po’ di tempo dopo che la mac- sioni esistenti senza accettare alcuna nuova ri-
china è andata giù. Sostanzialmente, ciò significa chiesta di connessione. Dopo che questa moda-
che non si ha la possibilità di un fail-over traspa- lità “drain” è stata terminata, il nodo sarà tem-
rente. Per modificare questo comportamento, si poraneamente rimosso dal cluster. Si può quindi
deve aprire lo snapin IIS MMC (Start  Admini- installare il service pack ed eseguire il reboot se
strative Tools  Internet Information Services). In necessario. Per ricongiungere il nodo al cluster,
questo tool, si passa al sito web site che contie- basta scegliere Control Hosts  Start.
ne l’applicazione in cluster (questa impostazione è
sempre valida per un sito completo e non per una Riassumendo
sola directory). Nella prima scheda (“Web Site”), Come si è visto, la creazione di cluster basato
si potrà disattivare la checkbox “HTTP Keep-Ali- su sistemi Windows non è affatto complessa. Ri-
ves Enabled”. Dopodiché, ogni singola richiesta chiede solo alcuni clic del mouse e nessun hard-
HTTP sarà soggetta al load balancing. Il costo di ware ulteriore per congiungere due o più nodi in
ciò in termini di prestazioni è di circa soli 2 milli- cluster. Tuttavia, NLB distribuisce solo le richieste
secondi per ciascuna richiesta in una LAN, e nel- di rete in ingresso, ma non gestisce le applicazioni
la gran parte dei casi il potenziale del failover tra- installate. È perciò estremamente importante es-
sparente è ben più prezioso di questa piccolissi- sere certi che tutti i nodi contengano sempre le
ma degradazione delle prestazioni. stesse identiche versioni delle applicazioni. Gra-
zie al deployment XCOPY, di solito questo non
Aggiornamenti a caldo è un grosso problema, poiché può essere risol-
Per rimuovere un nodo da un cluster in modo to semplicemente scrivendo alcuni script a riga
controllato (ad esempio per applicare un aggior- di comando. In alternativa, si possono utilizzare
namento o un service pack), non va semplice- prodotti come Microsoft Application Center 2000,
mente disconnesso dalla rete. Altrimenti, tutte le che si appoggia a NLB, e offre ulteriori tool di ge-
richieste correntemente in esecuzione dovrebbero stione per il cluster. Ma, come ho già detto, ciò
essere nuovamente inviate dopo che i client rice- è del tutto opzionale. Il cluster funzionerà senza
vono una eccezione. Invece, si deve aprire il tool questo ulteriore software. Distribuirà le richieste in
NLB manager, spostarsi sul nodo da rimuovere, ingresso tra più nodi e noi trarremo vantaggio dal
e con un clic destro del mouse selezionare Con- maggiore “uptime” dell’applicazione, dalla mag-
trol Hosts  Drainstop. Questa selezione farà sì giore disponibilità e dal supporto degli aggiorna-
che il server termini l’elaborazione delle connes- menti a caldo. Cosa state aspettando?

N. 62 - Marzo/Aprile 2005 VBJ 49


PRIMO PIANO

Verso la sanità
elettronica
di Alberto Rosotti

L'
automazione delle procedure cliniche, am- abbattere i costi. Le vie più pro-
ministrative e di supporto alle decisioni nel- mettenti per risparmiare mante-
le moderne strutture sanitarie si sta manife- nendo alti i LEA3 sono l’automa-
stando in maniera sempre più evidente, portando no- zione del flusso di lavoro (work-
tevoli vantaggi per la salute dei pazienti ed al tempo flow) e l’applicazione delle best
stesso ponendo sfide sempre più ardue agli operato- practice4.
ri del settore: ne è un buon esempio il workflow nei Ciò comporta, al di là delle
reparti di radiologia. possibilità offerte dalle tecnolo-
I vantaggi dell’introduzione dell’informatica e del- gie emergenti, la formazione de-
l’integrazione dei reparti sia clinici che amministrati- gli operatori sanitari e la reinge-
vi sono noti a tutti: si pensi alla possibilità di preno- gnerizzazione del workflow, tan-
tare un esame tramite Internet o call center, all’uso to nelle corsie come nei reparti e
di diagnostiche complesse come TAC o PET che ar- nei laboratori.
chiviano gli esami nei fileserver insieme ai referti fir-
mati elettronicamente, alla Telemedicina o alla robo- La sanità elettronica
tica operatoria. Il sistema sanitario italiano, pub-
Mentre in Inghilterra si sta lavorando al progetto di un blico per il 65% circa, raggiunge
PACS1 distribuito, nel nostro paese sono stati stanzia- a fatica l’efficienza dei percorsi
ti “44 milioni di euro con l’obiettivo di conseguire una terapeutici a causa della scarsità
riduzione della crescita della spesa complessiva della di personale, di risorse ed orga-
Sanità italiana, un innalzamento dei livelli essenziali di nizzazione. Se da un lato dobbia-
assistenza, un incremento della qualità dei servizi per- mo tutti adoperarci per difende-
cepita dai cittadini, una riduzione ed un maggior con- re il diritto alla salute così come
trollo dei tempi di attesa delle prestazioni e della de- sancito dall’articolo 32 della Co-
genza ospedaliera”, come affermato dal Ministro per stituzione, è pur vero che i fondi
l’innovazione e le tecnologie Lucio Stanca. Fin dall’ini- a disposizione sono limitati e van-
zio del nuovo millennio l’imperativo dei CIO2 sanitari no trovati nella eliminazione de-
è stato quello di risparmiare, perchè la coperta della gli sprechi e nella razionalizzazio-
spesa pubblica era diventata corta per tutti. ne dei costi.
La teoria dello sviluppo sostenibile richiede sacrifi- Partendo da un’analisi della cali-
ci: o si diminuisce la qualità dei servizi, o si diminui- forniana Kaiser Foundation, il Mi-
sce il numero delle prestazioni, o si allungano le liste nistro Stanca ha quantificato un ri-
di attesa, o si privatizza il servizio pubblico, o si au- sparmio del 2% annuo nella spesa
mentano i ticket o si razionalizzano le prestazioni per sanitaria nazionale, pari ad alme-
no 1,6 miliardi di euro, derivante
dall’adozione di tecnologie infor-
Alberto Rosotti è laureato in ingegnria elettronica. È respon- matiche inserite nell’iniziativa “Sa-
sabile sistemi informativi della ditta FBL di Pesaro. Può essere nità elettronica”, varata il 16 mar-
contattato tramite e-mail all’indirizzo arosotti@infomeda.it zo 2004. Questa iniziativa è stata

N. 62 - Marzo/Aprile 2005 VBJ 51


PRIMO PIANO

man mano estesa a tutte le regioni con l’obiettivo di


emettere 15 milioni di tessere entro il mese di apri-
le 2005. “Sarà così possibile acquisire dati statistici
aggregati, ma anche combattere sprechi, abusi e
truffe”, ha dichiarato Stanca, rilevando che grazie
alla nuova tessera “in particolari situazioni geografi-
che si potranno individuare i casi anomali in cui un
cittadino risulta iscritto a medici posti in Asl diver-
se, rilevare utilizzi abnormi di particolari farmaci o
l’emissione di ricette a carico di persone decedute;
con pochi interventi mirati si possono acquisire ri-
sparmi, razionalizzazione ed efficienza dell’ordine di
Figura 1 Il sito Internet www.ihe-europe.org
centinaia di milioni di euro”. Attualmente sono 800
milioni le ricette che vengono emesse annualmen-
te in Italia, per cui i margini di risparmio sono enor-
mi. I primi dati sembrano dare ragione al Ministro:
illustrata dal Ministro della Salute Girolamo Sirchia, una Asl, di cui però non è stato reso noto il nome,
il quale ha parlato di prevenzione attiva e proattiva, ha già sperimentato il sistema e con la sola puli-
prenotazioni on line integrate a livello nazionale, dati zia degli archivi ha risparmiato oltre 200 mila euro.
elettronici sulla storia sanitaria dei pazienti e teleme- La tessera sanitaria elettronica è simile ad un ban-
dicina. La prevenzione attiva è un sistema integrato comat e contiene i dati relativi alla salute dell’assi-
che consente un ruolo attivo all’azione di prevenzio- stito. Permette l’accesso alle prestazioni ambula-
ne: la sanità deve andare incontro al malato senza toriali e specialistiche oltre all’acquisto delle medi-
aspettare che sia lui a richiedere cure, intervenen- cine necessarie; inoltre può essere utilizzata in tut-
do per esempio in quel 62% di maschi diabetici ti i paesi dell’Unione Europea per ricevere l’assi-
che non segue alcun trattamento farmacologico. stenza sanitaria in sostituzione dell’attuale model-
Le prenotazioni on line integrate a livello naziona- lo cartaceo E111. La tessera sanitaria riporta i dati
le consentono al cittadino una scelta consapevo- anagrafici ed il codice fiscale dell’assistito anche
le dell’offerta sanitaria, fornendo un miglioramen- su banda magnetica e codice a barre, oltre ad un
to del servizio, una riduzione ed un controllo dei codice identificativo unico collegato al medico pre-
tempi di attesa, oltre alla razionalizzazione dell’of- scrittore; rappresenta uno strumento per facilitare il
ferta che permette di valutare meglio la domanda contatto dei cittadini con il servizio sanitario e per
e ridistribuirla sull’intero territorio. Mira ad infor- ricevere più rapidamente sia le cure che i risultati
mare il cittadino ed a metterlo nelle condizioni di delle visite e degli esami. Sarà facilmente utilizza-
non dover più ricorrere ai “viaggi della speranza”. bile anche dai non vedenti grazie alla presenza di
I dati elettronici sulla storia sanitaria dei pazien- caratteri braille in rilievo e vale come tesserino di
ti permettono la condivisione delle informazio- codice fiscale. Grazie alla tessera sanitaria elettro-
ni mediche, l’archiviazione ed il retriving sicuro, nica la nuova ricetta medica viene standardizzata
e fanno riferimento alla realizzazione della cartel- a livello nazionale. Se i dati anagrafici riportati sul-
la clinica automatizzata (CCA), utilissima sopra- la tessera fossero errati, il cittadino potrà rivolger-
tutto per i pazienti affetti da patologie croniche. si ad un qualsiasi ufficio dell’Agenzia delle entrate
La telemedicina avvicina l’erogazione di servizi sa- e richiederne la correzione.
nitari specialistici ai medici che hanno in carico il Allo stesso modo, in caso di smarrimento si po-
paziente, migliorando il servizio e l’assistenza do- trà ottenere un duplicato, anche via Internet, ac-
miciliare e permettendo, ove possibile, la deospe- cedendo al portale www.agenziaentrate.gov.it; per
dalizzazione. informazioni è anche disponibile il numero verde
800 030 070.
La tessera sanitaria elettronica Per l’introduzione della tessera, la Regione Um-
La sanità elettronica prevede l’uso della Tesse- bria ha avviato il 10 dicembre 2004 seminari di
ra Sanitaria Elettronica, promossa dai Ministri del- studio rivolti agli operatori del settore direttamen-
l’Economia, della Salute e delle Finanze, già in di- te nel loro luogo di lavoro tramite corsi di forma-
stribuzione in Abruzzo, Umbria, Emilia Romagna, zione a distanza mediante l’uso di CD interattivi e
Veneto e Lazio a seguito del decreto pubblicato della piattaforma di e-learning accessibile dal sito
il 4 novembre 2004 sulla Gazzetta Ufficiale. Verrà web www.sistemats.it.

52 VBJ N. 62 - Marzo/Aprile 2005


PRIMO PIANO

Il progetto IHE pubblica manuali scaricabili da internet all’indirizzo


La gestione del flusso di lavoro unitamente alla www.ihe-europe.org, Figura 1, a disposizione di
possibilità di automatizzare alcune procedure, utenti e sviluppatori; tra il 2002 ed il 2003 ne sono
come l’ammissione dei pazienti in ospedale, la stati scritti almeno dieci, che partono da problemi
gestione delle prenotazioni degli esami, la cartel- clinici e spiegano dettagliatamente come imple-
la clinica automatizzata, le schede di dimissione mentare concretamente le procedure ed ottenere
ospedaliera, la compilazione dei DRG5, le ricer- le best practice. Per esempio lo “Schedule Work-
che dei documenti in archivio, può liberare mol- flow Integration Profile” stabilisce il flusso delle in-
te risorse medico-infermieristiche che verrebbero formazioni per la gestione delle immagini digitali
convogliate verso la loro primaria attività, quella del paziente, in merito all’acquisizione, alla con-
clinica. D’altro canto l’obiettivo di rendere com- sistenza dei dati, allo storage, alla visualizzazione
pletamente automatico e digitale il flusso di lavo- ed alla stampa, mentre ”IT Infrastructure Techni-
ro all’interno di un ospedale è visto sempre più cal Framework” illustra come gestire il dominio di
come un obiettivo ineludibile da parte dell’uten- una infrastruttura di rete. Dal 2002 esiste anche
te finale, il quale giudica l’assistenza anche da la sezione italiana dell’IHE.
queste caratteristiche ed ‘emigra’ verso i centri
più informatizzati. Il workflow nel reparto di radiologia
Se è vero che le tecnologie sono ormai mature Il reparto di radiologia è tradizionalmente il set-
sia dal punto di vista amministrativo che clinico, tore del mondo sanitario in cui la tecnologia e l’in-
è altrettanto vero che non sempre si sanno utiliz- formatica sono maggiormente diffuse ed accetta-
zare al meglio: ciò è comprensibile soprattutto se te, se escludiamo l’amministrazione dove regnano
proviamo a calarci nella realtà di una corsia dove gli ERP. Modellare il flusso di lavoro in radiologia,
il personale sanitario non ha tempo per risolvere cioè schematizzare e sintetizzare il reparto con le
i problemi contingenti, figuriamoci per ottimizza- sue sfaccettature, umori e varianti umane, difficil-
re il workflow. mente conduce ad un risultato univoco esprimi-
Per questo è nato IHE (Integrating the Healthca- bile con un software. L’IHE propone un percorso
re Enterprise), un’iniziativa sviluppata in America standard che qui presentiamo come un modello
con l’obiettivo di assicurare che nella cura di un di workflow e che impegna diversi attori, vedi Fi-
paziente, tutte le informazioni richieste per le deci- gura 2. Il flusso di lavoro comincia con l’ingres-
sioni mediche siano corrette, immediatamente di- so del paziente in ospedale e la sua registrazione
sponibili ed interpretabili da tutti. IHE è sia un pro- che avviene tramite un sistema ADT (Ammissione,
getto che un forum di discussione (www.ihe.net) Dimissione e Trasferimento), un attore che memo-
che incoraggia l’integrazione delle risorse e l’uso rizza i dati anagrafici, i recapiti ed altre caratte-
degli standard; un team di ricercatori esegue ri- ristiche peculiari. In una successiva ammissione
gorosi test delle procedure ed organizza sessioni del medesimo paziente sarà sufficiente richiama-
di divulgazione per dimostrare e diffondere i be- re i dati già inseriti ed eventualmente aggiornarli.
nefici derivanti dall’applicazione delle nuove tec- I dati di ammissione dovranno essere disponibili
niche. Coinvolge sia medici che produttori di ap- anche ai successivi attori della catena. Dal punto
parecchi medicali con lo scopo di eliminare i gap di vista tecnico l’ADT è generalmente realizzato
che ostacolano l’uso di standard quali Dicom ed con un’architettura client-server a tre livelli o web-
HL7, spiegando come utilizzarli al meglio per rag- based, che fa perno su un database dalle ottime
giungere gli obiettivi. La sezione europea dell’IHE prestazioni con tempi di risposta immediati.
L’architettura web-based
sfrutta le funzionalità dei più
comuni browser, come Net-
scape Navigator o Internet
Explorer, quindi risulta facile
da gestire ed immediata negli
aggiornamenti, sopratutto ne-
gli ambienti di lavoro dove sono
presenti molti PC; d’altro can-
Figura 2 Il percorso del paziente radiologico in ospedale to è meno flessibile e più len-
ta della ormai consolidata ar-
chitettura client-server.

N. 62 - Marzo/Aprile 2005 VBJ 53


PRIMO PIANO

Successivamente viene richie-


sta una prestazione per il pazien-
te, come per esempio una PET.
La prenotazione avviene trami-
te un sistema CUP (Centro uni-
co di prenotazione) che gesti-
sce sia richieste provenienti dal-
l’esterno dell’ospedale che dal-
l’interno; in questo ultimo caso
si opera tramite il sistema infor- Figura 3 Il flusso dei dati digitali dalla CCA al DRG

mativo ospedaliero. Il CUP indivi-


dua la miglior data per effettuare
l’esame tenendo conto del tec-
nico disponibile, del parco macchine, degli orari zoom, contrasto, esaltazione dei contorni, ecc.
di lavoro e delle necessità del paziente: al temine Inoltre i referti possono essere compilati sfruttan-
genera un’agenda di appuntamenti che schedula do moduli wizard preformattati, oppure mediante
il workflow e che può essere facilmente consul- dettatura e riconoscimento vocale basandosi sul
tata, condivisa con l’amministrazione ai fini con- lessico standard della terminologia medica inter-
tabili e modificata. Come l’ADT, anche il CUP dal nazionale ICD9-CM (International Classification of
punto di vista informativo generalmente è di tipo Diseases, versione 9 – Clinical Modification). Gra-
client-server o web based: spesso sfrutta un da- zie alla terminologia ICD9-CM, che classifica più
tabase proprio, ma è evidente il vantaggio di uti- di 15000 patologie e pratiche mediche basando-
lizzare un sistema integrato con il RIS (Radiolo- si su codici numerici di 3 o più cifre (per esem-
gical Information System) ed il datawarehouse. pio il codice 001 è assegnato al colera), i sanita-
Alla data prefissata, a meno di imprevisti, l’esa- ri di tutto il mondo possono interpretare corretta-
me viene eseguito sfruttando le funzionalità di mente qualsiasi cartella clinica. Se la cartella cli-
un’apparecchiatura diagnostica, comunemente nica è automatizzata, dalla sintesi dei suoi dati si
detta “modalità”. Il tecnico di radiologia, all’inizio può facilmente ottenere la scheda di dimissione
del turno potrà scaricare la lista di lavoro giorna- ospedaliera sulla base della quale, con un appo-
liera, in quanto le modalità attuali sono costitui- sito software chiamato “grouper”, si assegnano i
te da workstation (tipicamente Windows o Linux) DRG indispensabili agli ospedali (in Italia) per ri-
che si interfacciano da un lato con il RIS ed il CUP cevere i finanziamenti dalle Regioni. Questo giro
e dall’altro con i circuiti di controllo legacy della di informazioni, attualmente a carico di medici e
diagnostica medica. Le modalità di ultima gene- capi sala, se automatizzato con l’adeguato work-
razione forniscono immagini digitali che vengo- flow, può fare risparmiare enormi quantità di de-
no immediatamente immagazzinate in un appo- naro a vantaggio di tutti, vedi Figura 3.
sito server detto Image Server, sfruttando i siste-
mi PACS e standard quali Dicom. Grid computing in ospedale
Gli Image Server memorizzano le immagini su Quali capacità di calcolo richiede un moderno
array di dischi on line e successivamente su sup- ospedale completamente informatizzato? La ri-
porti più lenti e capienti, come i juke box di nastri sposta dipende ovviamente da molteplici fattori,
capaci di memorizzare petabyte di dati. quali l’ampiezza delle strutture, il tipo ed il nume-
A questo punto interviene il medico di radiologia ro di interventi effettuati, l’indice di Case-Mix6, il
che recupera le immagini dal PACS per produrre numero dei posti letto e del personale impiega-
un referto che sarà firmato digitalmente, archiviato, to, il livello d’integrazione tecnologica ed ovvia-
stampato, consegnato al paziente o ad altri medi- mente tanto altro ancora. Il sistema informativo
ci e reso disponibile sul web, con tutte le misure ospedaliero, per il tipo di servizio che deve of-
di sicurezza per tutelare la privacy, al fine di pro- frire (disponibilità no-stop e massima sicurezza),
seguire nel percorso terapeutico. La refertazione potrebbe essere ben servito da un sistema grid
viene eseguita su workstation dotate di due o più computing, cioè un’infrastruttura software adat-
monitor ad alta risoluzione per visualizzare molte tabile che fa un uso efficiente di server di ridotte
immagini contemporaneamente, utili nel confron- dimensioni e soluzioni di storage modulari in gra-
to prima/dopo o per la visione contemporanea da do di bilanciare i carichi di lavoro e garantire una
diverse angolazioni, e con l’uso di tool grafici di vera capacità on demand. L’amministrazione uni-

54 VBJ N. 62 - Marzo/Aprile 2005


PRIMO PIANO

Tabella 1 I punti chiave della sanità elettronica

1. La prevenzione attiva
2. Le prenotazioni on line integrate a livello nazionale
3. I dati elettronici sulla storia sanitaria dei pazienti
4. La telemedicina

taria del grid permette di eliminare le inefficienti Bibliografia & Riferimenti


isole informatiche ottenendo maggiori prestazio- [1] A. Spada – “L’informatizzazione del Workflow
ni ed affidabilità, trattando tutte le risorse come in sanità. Il modello di integrazione IHE”, di An-
un servizio virtuale per ottimizzarne l’impiego e la drea Spada, Computer Programming 121
disponibilità. I fattori caratterizzanti il grid compu- [2] P. Ghedini – “Strutture sanitarie ad alta auto-
ting sono: la virtualizzazione, l’allocazione dinami- mazione, governo clinico e standard”
ca e la condivisione delle risorse, l’autoadattabi- [3] M. Nash – “Oracle 10g: infrastruttura per il
lità, il monitoraggio costante dei sistemi e la ge- grid computing”, white paper Oracle, settem-
stione centralizzata. Se fino a pochi anni orsono bre 2003.
l’imperativo era centralizzare potenza di calcolo [4] www.innovazione.gov.it
e database, tendenza evidente nei data center
dei servizi bancari che utilizzano i blade server7, Note
1
oggi al contrario si torna a delocalizzare le risor- PACS: Picture Archiving and Communication Sys-
se mantenendo però un controllo centrale e for- tem. Sistema per la generazione e la gestione delle
nendo la disponibilità. immagini digitali ospedaliere e delle informazioni ad
Per far fronte all’imprevedibilità ed all’urgenza esse associate.
2
in termini di elaborazione, analogamente a come CIO: Chief Information Officer, cioè responsabile
avviene al pronto soccorso quando c’è un’emer- del sistema informativo.
3
genza, i CIO hanno finora fatto ricorso a server LEA: Livelli Essenziali di Assistenza, stabiliti nel Pia-
sovradimensionati capaci di assorbire i picchi di no Sanitario Nazionale dal Ministero della Salute.
4
lavoro; oggi, grazie al paradigma del grid, l’ela- Best practice: termine usato per intendere il mi-
borazione viene distribuita dove c’è effettivo bi- glior modo di affrontare un problema, derivante dal-
sogno attingendo le risorse computazionali dal- l’esperienza dei maggiori player. Le best practice
le reti disponibili, grandi o piccole, lente o velo- sono codificate in procedure informative ben defi-
ci, proprio come un computer attinge la corrente nite e trovano ampio spazio nei sistemi integrati di
elettrica dalla rete, senza sapere chi la genera o gestione delle risorse, permettendo di raggiungere
la distribuisce. i migliori risultati.
5
Suddividendo il lavoro su più server aumenta DRG: Diagnosis Related Group. È un metodo per
la scalabilità, la disponibilità e l’utilizzo delle ap- la classificazione dei pazienti dimessi che si basa
parecchiature, ottenendo un ampio risparmio ed su raggruppamenti omogenei di diagnosi, utilizzato
economie di scala, in osservanza alle ultime di- in Italia come base per il finanziamento delle Azien-
rettive governative. Sebbene la novità intrinseca de Ospedaliere.
6
del grid provenga dall’hardware, la sua potenza Case-Mix: indice della complessità degli interventi
risiede nel software e nella capacità dei databa- svolti in ospedale. Esistono vari modi per calcolarlo,
se e dei server applicativi di gestire la condivisio- uno dei quali consiste nel fare il rapporto tra la som-
ne delle informazioni e della potenza di calcolo. Il ma dei pesi dei DRG ed il numero dei DRG stessi.
7
grid computing, il computing on demand, l’adap- Blade server: letteralmente server taglienti, affilati,
tive computing, l’utility computing, l’organic com- disposti su singole schede indipendenti che conten-
puting o l’ubiquitous computing sono solo alcuni gono essenzialmente processore e memoria RAM,
sostantivi, sinonimi, con i quali il mondo della sa- per minimizzare l’ingombro ed ottenere una elevata
nità sta navigando verso un nuovo corso. concentrazione di risorse.

N. 62 - Marzo/Aprile 2005 VBJ 55


I MITI

Configurazione
e deployment
in ASP.NET
Vediamo come ASP.NET risolve molte delle limitazioni che affliggevano ASP

di Dino Esposito

G
ran parte del successo di ASP è dovuto alla zato l’ingegno e, per i vari proble-
sua facilità di utilizzo. E in effetti chiunque rie- mi “strutturali” di ASP, sono venu-
sca ad orientarsi nel mondo dello sviluppo per te fuori soluzioni eleganti e meno
Windows – non importa con quale strumento, da Visual eleganti ma tutte allo stesso modo
C++ a PowerBuilder passando per Delphi e Visual Basic efficaci e risolutive.
– non fa soverchia fatica a buttar giù pagine ASP anche Nel corso di questi quattro anni
relativamente complesse ed articolate. sono state sviluppate un buon nu-
Lo stesso fatto che per circa quattro anni (un'eterni- mero di best-practice per i maggiori
tà nel mondo Microsoft) in ASP non sia cambiato qua- limiti di ASP. Tanto per fare qualche
si nulla dimostra l’assoluta stabilità ed equilibrio rag- nome: supporto per le Web Farm,
giunti da ASP. form rientranti, oggetti di caching,
Il che – non fraintendete – non equivale certo a dire trasformazioni XSL, trucchi per limi-
che tutto va ben, madama la marchesa ASP. tare l’ammasso di roba nella Ses-
Il fatto è che per lungo tempo ad ASP non vi sono sion, e così via. A tutte queste que-
state alternative affidabili o praticabili su nessuna piat- stioni risponde oggi con indubbia
taforma. E su Windows nemmeno a parlarne (escludo efficacia ASP.NET. E così sia.
soluzioni proprietarie solitamente alquanto costose e Ma la vera tragedia di ASP è il
dall’efficacia tutta da dimostrare, per non parlare della deployment delle applicazioni. Non
documentazione). tanto per ASP stesso, quanto per
Per chi doveva scrivere applicazioni Web (e tantissimi la strutturale complessità del mo-
hanno dovuto…), per lungo tempo ASP è stato lo stru- dello di componenti utilizzato: COM
mento ideale in quanto ottimo compromesso tra presta- prima e COM+ dopo. Per miglio-
zioni (mai strutturalmente eccelse), costo e facilità di uti- rare la performance e “distribuire”
lizzo. Di fronte a situazioni in cui non vi sono alternative il sistema si è finito per introdur-
da invocare, né vi sono precedenti versioni da rimpian- re un discreto numero di compo-
gere, il programmatore può solo svolgere al meglio il suo nenti che per loro intrinseca natura
compito istituzionale: scrivere codice e pedalare. hanno bisogno di sotto-componen-
Messi alle strette, tanti programmatori hanno aguz- ti, interfacce, type library, configu-
razioni varie e soprattutto del regi-
stry e di un buon numero di mo-
Dino Esposito Si occupa di applicazioni Web-based e lavora
duli runtime.
come consulente per diverse società. È autore di “Professional
Windows Shell Programming” e “Windows Script Host Program-
Per far girare poche pagine ASP
mer’s Reference” entrambi per Wrox Press. È contributing editor sono necessari pesanti interventi
di MSDN Magazine e Windows 2000 Magazine. Può essere sul registry e sul metabase di In-
contattato tramite e-mail all’indirizzo esposito@infomedia.it. ternet Information Services (IIS) con

56 VBJ N. 62 - Marzo/Aprile 2005


I MITI

creazione e modifica di parametri in vari folder vir- In ASP.NET la stragrande maggioranza delle in-
tuali. Tutta roba da fare, se non a mano, tramite formazioni sull’ambiente runtime – cioè le informa-
un ottimo strumento di setup. E in ogni caso una zioni che l’utente programmatore/amministratore
serie di operazioni da far tremare i polsi e la me- può voler modificare – sono memorizzate in un file
moria. Al punto che di consegna chiavi-in-mano XML chiamato web.config. Esso, oltre ad essere
proprio è difficile parlare. facilmente leggibile e manualmente modificabile, è
anche isolato dal resto dell’ambiente, indipendente
Deployment in ASP.NET da crash e affini e non richiede restart in seguito
Per fortuna, la consegna chiavi-in-mano di una a modifiche – basta che sia possibile rileggerne il
applicazione ASP.NET è molto più semplice. La contenuto. Cosa che avverrà a partire dalla suc-
differenza però non dipende granché da ciò che cessiva sessione del successivo utente.
rende differente ASP da ASP.NET. A ben guardare, Il file web.config permette di associare e modi-
la differenza vera è in ciò che fa da sfondo ad ASP ficare impostazioni in modo dichiarativo invece
e ASP.NET. E cioé l’impalcatura .NET. Vediamo più che procedurale. Può farlo in maniera gerarchica
in dettaglio perché. I passi fondamentali del de- dal momento che le modifiche si estendono dalla
ployment di una applicazione ASP.NET sono: directory in cui web.config si trova al sottoalbe-
ro. Impostazioni definite nel web.config principale
• copia dei file ASPX e quant’altro in un Web possono essere sovrascritte da web.config trovati
folder; a livelli più annidati. Il file web.config principale si
• copia di controlli e servizi nel folder BIN del trova in una directory sotto winnt\microsoft.net.
Web server;
• modifica del file web.config per creare le im- Struttura di web.config
postazioni a livello di applicazione e/o di siste- Come detto, web.config è un file XML. Tutte le
ma. informazioni sono racchiuse da un tag chiamato
<configuration>. Il contenuto può essere di due
Dov’è la differenza? Vediamo più o meno i pas- tipi: handler e setting. Gli handler sono racchiusi
si necessari in ASP: in un blocco centrato in <configsections>. I set-
ting hanno nomi di nodi personalizzati e sono tutti
• copia dei file ASP e quant’altro in un Web fol- diretti figli del nodo radice <configuration>. Ecco
der; lo schema di base:
• installazione e registrazione di componenti
COM; <configuration>
• creazione delle applicazioni COM+ necessa- <configsections>
rie; <!-- Configuration section handlers -->
• tuning delle proprietà di IIS. </configsections>
<!-- Configuration section settings -->
Apparentemente non vi è una grandissima diffe- </configuration>
renza. I passi sono più o meno quelli e per le pa-
gine non cambia nulla. La novità si ha a proposi- I Configuration Section Handlers (CSH) sono di-
to di componenti. chiarati tramite il tag <add> e fanno riferimento
Se il modello è COM(+) allora il registry gioca un alle classi handler utilizzate per la gestione di un
ruolo essenziale. Se il modello è .NET allora la re- certo tipo di parametri.
flection dà il meglio di sé e per installare e regi- Si tratta di classi che implementano l’interfaccia
strare un componente, alla fin fine, basta copiar- IConfigSectionHandler.
lo in un percorso pubblico. Il registry è essenziale Non è necessario dichiarare i section handler in
per individuare nome, ruolo e attributi di un com- ogni file web.config dal momento che le impo-
ponente COM. I componenti .NET espongono le stazioni sono ereditate da folder più in alto nel-
stesse informazioni da programma tramite le in- la gerarchia del file system. Ecco un esempio di
terfacce di reflection: una volta trovato il file DLL file web.config:
il più è fatto. Le informazioni, infatti, sono lì espo-
ste con una serie di interfacce particolari. <configuration>
Il tuning di IIS è in gran parte manuale e in ogni <configsections>
caso richiede lo stop-and-restart del Web server <add name=”sessionstate”
per ogni blocco di modifiche. type=”System.Web.SessionState.

N. 62 - Marzo/Aprile 2005 VBJ 57


I MITI

SessionStateModule” /> Accesso da programma


<add name=”httphandlers” Le informazioni di web.config sono accessibili
type=”System.Web.Configuration. anche da programma tramite un oggetto globa-
HttpHandlersConfig” /> le statico che ricorda molto le funzioni Windows
<add name=”security” 3.1 per accedere ai file INI.
type=”System.Web.Config. Il metodo da utilizzare si chiama GetConfig e ap-
SecurityConfigHandler” /> partiene alla classe statica ConfigurationSettings.
</configsections> Con il codice che segue
</configuration>
ConfigurationSettings.GetConfig(“sectionname”)
Per ciascuna delle sezioni di configurazione esi-
ste un apposito sotto-albero con i parametri. Per si riesce a leggere il contenuto della sezione in-
esempio, le informazioni sul Session Manager sono dicata. Ciò che viene restituito non è una strin-
salvate nel seguente codice: ga o un qualsivoglia altro tipo primitivo. Si tratta
invece di una classe SessionStateConfig o una
<sessionState equivalente XXXConfig. Ecco come manipolare
mode=”Off|Inproc|StateServer|SqlServer” da programma le informazioni sullo stato di fun-
cookieless=”true|false” zionamento del Session Manager.
timeout=”number of minutes”
connectionString=”server name:port number” SessionStateConfig config;
sqlConnectionString= config = (SessionStateConfig) ConfigurationSettings.
”sql connection string” /> GetConfig(“sessionState”);
if (config.CookieLess == true)
Il tag SessionState definisce una serie di attri- {
buti che permettono di dichiarare come si vuole // sessioni senza cookies
che funzioni il Session Manager in quella (o quel- }
le) applicazioni ASP.NET.
In particolare, l’attributo mode indica la moda- Le informazioni incluse nella sezione <appSettin-
lità di funzionamento che può essere in-process gs> che riguardano l’applicazione nel suo insieme
(inproc), out-of-process (stateserver) oppure out- sono accessibili tramite la collection globale Confi-
of-process ma basato su SQL Server (sqlserver). gurationSettings.AppSettings. ASP.NET rileva auto-
La quarta opzione (Off) semplicemente disabilita maticamente ogni cambiamento ai file di configu-
il Session Manager. L’attributo Cookieless indica razione e li rilegge e applica le modifiche. Non vi è
se l’individuazione delle sessioni client deve av- alcun bisogno che il server venga stoppato e fatto
valersi o meno dei cookie. Timeout è il numero di ripartire. ASP.NET protegge i suoi file di configura-
minuti che dura una sessione in memoria. zione da accessi esterni non desiderati e lo fa im-
Infine, ConnectionString ha senso solo quando postando IIS in modo da prevenire il direct brow-
la modalità è out-of-process. Esso indica il nome sing sui quei file. Ogni tentativo di accedere ad uno
della macchina e la porta dove si trova il server dei file di configurazione viene punito con un errore
su cui gira il Session Manager. HTTP access error 403 (forbidden).
Questa modalità di funzionamento è particolar-
mente utile quando i dati di sessione sono molto Conclusioni
importanti e non si vuol rischiare di perderli. Le In ASP.NET il meccanismo di configurazione, di
prestazioni, ovviamente, sono un po’ peggiori che cui la sicurezza e il session manager sono una par-
nel caso default quando la sessione viene man- te, utilizza una architettura sostanzialmente gerar-
tenuta in memoria. chica. Tutte le informazioni sono contenute in uno
Se la persistenza delle informazioni di sessione o più file chiamati web.config, che può trovarsi nel-
è un aspetto cruciale del software allora si può la stessa directory dell’applicazione. Le sottodi-
anche fare in modo di salvare la sessione diretta- rectory ereditano le impostazioni a meno che non
mente su un database SQL Server. In questo caso contengano a loro volta un file web.config.
torna comodo l’attributo SqlConnectionString che All’interno di questo file, vi sono sezioni con in-
specifica la stringa di connessione al database formazioni dettagliate per ciascuna delle princi-
che sarà stato creato in precedenza con tutte le pali aree configurabili di ASP.NET.
stored-procedure necessarie.

58 VBJ N. 62 - Marzo/Aprile 2005


.NET TOOLS
a cura di Davide Mauri dmauri@infomedia.it

Firefox Web Developer Extensions in pixel dei blocchi div, l’id dei controlli e simili.
Le Outline Features permettono in modo davvero molto
Il prodotto in questione, lo anticipo subito, non è stret- semplice di evidenziare la struttura di tabelle, frame e
tamente legato a .NET, ma si è ugualmente meritato un più in generale di qualsiasi porzione della pagina.
posto in queste pagine perché diverrà sicuramente un Oltre a questo è possibile evidenziare tutti gli elementi
fidato strumento per tutti coloro che sviluppano appli- deprecati dall’HTML 4.0 così da poterli identificare, ed
cazioni web, nella fattispecie applicazioni ASP.NET. eventualmente sostituire, in modo piuttosto rapido.
Il tool è di fatto una estensione di Firefox (c’è anche Per quanto riguarda la sezione Tool Features, all’inter-
una versione per Mozilla), che permette di analizzare no si trova tutto ciò che concerne la validazione delle
ed applicare modifiche ad una pagina web in tempo pagine web e dei vari elementi collegati.
reale. Le features disponibili, raggiungibili direttamente La sezione più importante e probabilmente più utile è
tramite una barra di menù aggiuntiva, sono raggruppate quella delle Css Features.
in dieci sezioni: Tramite le funzionalità presenti all’interno della stessa
è possibile operare in modo particolareggiato sugli stili
 Disable utilizzati nella pagina.
 Form È possibile visualizzare, tramite un semplice click del
 Information mouse, gli stili applicati su un particolare elemento della
 Outline pagina. Oltre a questo è possibile modificare in tempo
 Tools reale gli stili presenti, applicando immediatamente tali
 Css cambiamenti alla pagina web.
 Images Questo è reso possibile da un editor di testo interno,
 Miscellaneous che si posiziona nella sezione sinistra del browser, dove
 Resize viene caricato il codice dei Css in uso (Figura 1). Ogni
 Other modifica apportata ad essi viene istantaneamente appli-
cata alla pagina, rendendo così davvero molto semplice il
Nella sezione Disable Features sono raggruppate le
impostazioni che permettono di disabilitare diverse fun-
zionalità del browser. Si va dai cookies alle immagini,
dal javascript agli stili.
Questo permette di vedere come il sito viene visualiz-
zato da un browser non recentissimo, in modo tale da
poter intervenire e assicurare una buona fruizione del
sito anche a chi usa questo tipo di browser.
In Form Features si trovano tutte le opzioni riguardanti
i form. Da qui è possibile avere informazioni dettagliate
sul form, visualizzare i campi nascosti, convertire azioni
GET in POST e viceversa e via dicendo. Tali funziona-
lità sono molto utili per effettuare debug e test delle
applicazioni web.
Tramite le Information Features è possibile mostrare
tutte le caratteristiche altrimenti non facilmente visibili
delle pagine web come gli ancoraggi, le dimensioni reali

Davide Mauri è un consulente freelance che si occupa di


SQL Server 2000 e di sviluppo di soluzioni Web basate sul
Figura 1 L’editor CSS della Web Developer Extension
.NET Framework. All’attività di consulenza affianca una co-
all’opera
spicua attività di docenza e di formazione presso Mondadori
Informatica. Il suo sito personale è www.davidemauri.it.

60 VBJ N. 62 - Marzo/Aprile 2005


.NET TOOLS

lavoro di creazione e perfezionamento del layout grafico


dell’applicazione web. È importante sottolineare che
l’estensione permette di specificare se si desidera ren-
dere i CSS secondo gli standard W3C oppure secondo
la metodologia applicata da Internet Explorer.
Non cambia molto tra le due, ma in alcuni casi gli stili
vengono applicati in modo diverso. Grazie a questa op-
zione ci si assicura che gli stili sviluppati vengano ben
digeriti da entrambi i browser. Le funzionalità contenute
in Images Features riguardano le immagini. È possibile,
ad esempio, visualizzare tutte le immagini “rotte”, oppure
quelle senza dimensioni esplicitamente specificate o
senza attributo alt.
Molto utile la possibilità di evidenziare le immagini che
hanno le dimensioni reali diverse da quelle specificate
negli attributi dell’elemento img, in modo tale da poter
ottimizzare il peso della pagina stessa.
Grazie alla sezione Miscellaneous Features è possibile
rimuovere cookie e cookie di sessione, cache, l’http
authentication header e via dicendo: funzioni utili per Figura 2 L’ambiente fornito da QueryCommander
simulare il comportamento di utenti che non sono mai
stati prima sul sito che si sta sviluppando, oppure che
non desiderano utilizzare cookies.
Le ultime due sezioni, Resize ed Other Features per-
mettono rispettivamente di ridimensionare il browser in
modo da poter analizzare la visibilità e la fruibilità del QueryCommander
sito alle diverse risoluzioni, e di impostare le opzioni
dell’estensione di Firefox in modo tale da renderla il più QueryCommander è uno strumento nato per fornire agli
possibile comoda da usare. utilizzatori di MSDE un ambiente di sviluppo comodo,
In conclusione, un’estensione fondamentale per tutti come quello fornito da Query Analzyzer.
gli sviluppatori ASP.NET: grazie ad essa assicurarsi che Nel tempo si è poi evoluto fino a voler sostituire di fatto
l’interfaccia utente sia visivamente e qualitativamente il Query Analyzer e non solo, in quanto con la recente
degna del codice prodotto, sarà molto più facile per versione è stato aggiunto il supporto per database diversi
tutti. da SQL Server, come Oracle e MySql (Figura 2).
L’idea dell’autore è piuttosto ambiziosa dunque (e di
strada da fare ce n’è ancora parecchia) ma le premesse
Prodotto sono sicuramente molto buone.
Web Developer Extension Le funzionalità offerte da questo tool sono davvero
numerose, e sono tutte rivolte a rendere più comodo e
Url di riferimento confortevole lo sviluppo di codice SQL.
http://www.chrispederick.com/work/firefox/webdeveloper/ Tra le più interessanti c’è sicuramente l’Intellisense,
Stato Release che rende davvero molto più agevole lo sviluppo di script
0.9.3 complessi. In tema di script è possibile confrontarne
due per evidenziare le differenze che intercorrono tra
Semplicità d’uso  di essi.
Semplicissimo. Oltre a queste un’altra funzionalità estremamente utile
Utilità  è la possibilità di poter accedere al codice che definisce
Estrema! Poter applicare modifiche in tempo reale sugli un oggetto (ad esempio una stored procedure) dall’in-
stili delle pagine web significa poter fare un ottimo lavoro terno dello script che ne fa uso; per far ciò è sufficiente
in tutta comodità. posizionarsi sul nome dell’oggetto e scegliere “Goto
Definition” ed il gioco è fatto.
Qualità prodotto  Un’altra feature comoda per chi sviluppa è la possibilità
Ottima.
di inserire degli header di commento. Tali header sono
Qualità documentazione  particolari perché contengono elementi XML; grazie a
Disponibile solamente online, ma non dovrebbe pratica- questo, esattamente come accade per Visual Studio,
mente servire tanto è semplice l’utilizzo. è possibile generare in automatico la documentazione,
estraendola dai commenti stessi. Una comodità non
indifferente.

N. 62 - Marzo/Aprile 2005 VBJ 61


.NET TOOLS

Un’idea molto bella è quella della funzionalità xml2data


che permette di utilizzare un file XML come sorgente di
Prodotto
QueryCommander
dati, sia per definire la struttura di una tabella, sia per
alimentarne il contenuto. Url di riferimento
Oltre a queste funzionalità offerte in modo nativo, è http://querycommander.rockwolf.com/
possibile sviluppare dei plug-in in modo da estenderne
le capacità. Sul sito si trova la documentazione ne-
Stato Release
3.0.0.6
cessaria (poca a dir la verità) e degli esempi da usare
come tutorial. Semplicità d’uso 
Tra i plugin forniti insieme all’installazione c’è il “Result Abbastanza semplice da usare anche se in alcuni casi un
to Excel” che permette di esportare il risultato di una po’ di opzioni in più non avrebbero guastato.
query in formato xls: una comodità non da poco, so-
prattutto nel caso in cui si debba fare un’esportazione
Utilità 
Alta per tutti coloro che usano MSDE o RDMBS privi di
ad-hoc o saltuaria.
strumenti di sviluppo avanzati.
In conclusione questo è un prodotto che, anche se
giovane, è da provare. Personalmente continuo ad uti- Qualità prodotto 
lizzare Query Analyzer per il 99% del lavoro (parlando Ancora giovane, ma sicuramente promettente. Già a questo
di SQL Server) visto che ancora quello che mi dà più livello è comunque più che sufficiente.
soddisfazioni (anche se ormai, come ho già detto più Qualità documentazione 
volte, mostra tutti i suoi anni), ma se dovessi utilizzare Non ce n’è traccia. È anche vero che è in pratica un editor
MSDE utilizzerei senza dubbio questo QueryComman- di testo mirato al linguaggio SQL quindi non se ne sente
der; oltre a questo, inoltre, alcune sue funzionalità sono molto la mancanza. I nomi dei comandi e delle opzioni
parecchio comode e ogni tanto mi capita di farne uso sono autoesplicativi.
ed desiderare di averle integrate nel Query Analyzer…
e questo è un ottimo segno.

62 VBJ N. 62 - Marzo/Aprile 2005


I N O F F E R TA V B J 6 2
Scrivi a
Wireless sensor Networks 3ds Max 6 con CDROM
di F. Zhao e L. Guibas book@infomedia.it di F. Barrett
specificando
nell’oggetto della
Ed. Morgan Kaufmann
e-mail: Ed. MacGraw-Hill Italia
ISBN 1558609148
376 pp - 72,00 €
IN OFFERTA ISBN 8838643830
450 pp - 36,00 €
VBJ n. 62
OPPURE
inviaci il coupon
Sistemi di basi di dati - Adobe InDesignCS
Fondamenti 4/E sottostante di D. Bergsland
di R. Elmasri e S. Navathe al numero di fax
0587/732232
Ed. Pearson Italia Potrai acquistare Ed. MacGraw-Hill
ISBN 8871922204 ISBN: 88 386 4392-X
580 pp - 35,00 €
i libri qui riportati con 512 pp - 31,00 €
uno
SCONTO
Ingegneria del Software 2/E
ECCEZIONALE Aspect-Oriented
di C. Ghezzi - D. Mandrioli, Database Systems
M. Jazayeri del 10% anche se di Rashid, Awais
acquisti solo un
libro
Ed. Pearson Italia Ed. Springer
ISBN 8871922042 OPPURE ISBN 3540009485
700 pp - 46,00 € 176 pp - 60 illus - 37,40 €
del 20% se acquisti
3 libri

VBJ 62
LIBRI
Verification of Reactive System SMIL 2.0 - Interactive Multimedia
Formal Methods and Algorithms for Web and Mobile Devices
Autore Klaus Schneider Autore J. E. Hansen, C. Thomsen
Editore Springer Editore Springer
ISBN 3540002960 ISBN 354020234X
Lingua Inglese Lingua Inglese
Anno 2004 Anno 2004
Pagine 600 Pagine 439
Prezzo € 74,85 Prezzo € 53,45

i sono applicazioni software progettate per sistemi il cui scopo MIL è un linguaggio basato su XML, progettato per la realizza-

V è rispondere a stimoli esterni; questi sistemi sono detti sistemi


reattivi. Sottoporre i sistemi reattivi ad una serie di test prima del
loro rilascio sul mercato è sicuramente necessario ma non sufficiente,
S zione di applicazioni multimediali su Web e dispositivi “mobili”.
L’intento degli autori di questo libro è quello di realizzare una
guida di riferimento, chiara e al tempo stesso esaustiva, rivolta sia
per due motivi: il primo è che le possibili condizioni di funzionamento agli sviluppatori che già conoscono SMIL (e magari approfondire
di un sistema del genere sono infinite, mentre il numero di test deve la nuova versione o rivisitare determinati argomenti) sia a coloro i
tenere conto delle esigenze di time-to-market. Il secondo motivo è quali ne desiderano conoscere le potenzialità. Il testo è suddiviso
che trovare un difetto di progettazione in fase di test significa trovarlo in quattro parti (una delle quali contenente soprattutto riferimenti);
al termine del processo di sviluppo e dunque implica grossi costi per la prima ha uno scopo puramente introduttivo e si occupa di descri-
le modifiche. In questa situazione la matematica viene in aiuto alle vere (mediante esempi) le situazioni in cui è utile impiegare questo
buone pratiche ingegneristiche. Se infatti la specifica del prodotto linguaggio rispetto ad altre soluzioni. La seconda parte si addentra
viene espressa in un linguaggio formale non ambiguo, allora si può soprattutto sul discorso dell’architettura su cui poggia SMIL, della
tentare di dimostrare matematicamente la coerenza interna della spe- sintassi e dei costrutti principali a livello di TAG, mentre nella terza
cifica e, in certi casi, anche la sua corrispondenza con i requisiti, sono approfonditi argomenti di livello più avanzato, come la gestione
consentendo così di trovare difetti già nelle prime fasi del processo dei Layout, le tecniche di animazione, la sincronizzazione. Gli autori
di sviluppo: questa attività prende il nome di verifica formale. Questo dimostrano una certa esperienza nel settore soprattutto a livello di
volume, unico nel suo genere, si propone di fornire una panoramica approccio alla “materia”. Infatti i concetti, pur non essendo di facile
completa sulla storia e sullo stato dell’arte di questa materia. Come livello, sono spiegati in modo chiaro anche grazie alla vasta quantità
l’Autore spiega già, con molta onestà, nella prefazione, il testo non di immagini (anche di qualità molto elevata) e illustrazioni – presenti
è destinato ad un vasto pubblico, neppure tra i tecnici: esso è in- in quasi tutte le pagine - con relativi esempi di codice. Il libro man-
dirizzato a laureandi, ricercatori e docenti universitari. Nella stessa tiene anche una certa impostazione discorsiva, quasi interattiva, ma
prefazione, sono anche indicate letture alternative per chi è interes- al tempo stesso schematica; anche il lettore non esperto troverà
sato all’argomento ma ne desidera una trattazione meno formale: sempre consigli, ottimizzazioni e spunti interessanti da approfondire
per comprendere il contenuto del libro sono infatti necessarie solide a livello pratico. Al termine di ogni capitolo è sempre presente una
basi di logica matematica. Il primo capitolo è dedicato alla storia dei breve ricapitolazione e vengono pubblicati ulteriori riferimenti pre-
metodi formali. Nel secondo capitolo viene proposto un linguaggio senti su Internet, qualora si intendesse approfondire ulteriormente
formale di riferimento mentre nei successivi capitoli sono descritti i gli argomenti esposti. Forse la quarta parte poteva anche essere
metodi formali di specifica più usati come gli automi a stati finiti, la evitata o magari sostituita con ulteriori approfondimenti o esempi,
logica temporale e quella dei predicati. Ogni metodo formale viene ma comunque alla fine nessuna componente dell’architettura di
descritto per mezzo di definizioni e teoremi, rendendo quindi il testo SMIL viene ignorata. Personalmente questo testo ha soddisfatto
adatto allo studio e alla consultazione ma non alla lettura. le mie aspettative; consiglio di tenerlo sempre a portata di mano
durante lo sviluppo.
Pro
L’Autore propone un esaustivo compendio dei metodi formali di Pro
specifica esistenti. Si considera il problema della scrittura di spe- Argomenti espressi in modo chiaro grazie anche all’utilizzo di
cifiche coerenti e non ambigue, prima ancora di iniziare la fase di schemi e illustrazioni.
sviluppo dell’applicazione. Contro
Nessuno.

Contro
La trattazione avviene solamente attraverso definizioni e teoremi;
il libro è quindi riservato al pubblico, molto ristretto, dei docenti e
dei ricercatori.
Marco Aldrovandi Gianluca Masina

N. 62 - Marzo/Aprile 2005 VBJ 65