You are on page 1of 60

IN VETRINA

Essential SharePoint 2007 2ed. Essential SharePoint 2007 The ASP.NET 2.0 Anthology
A Practical Guide for Users, Delivering High-Impact Collaboration 101 Essential Tips, Tricks & Hacks
Administrators and Developers di S. Jamison et al. di S. Allen et al.
di J. Webb Addison Wesley O’ Reilly - Sitepoint
O’ Reilly 456 pp - euro 44,95 500 pp - euro 41.40
445 pp - euro 41,40 ISBN 9780321421746 ISBN 9780980285819
ISBN 9780596514075

Visual Basic 2005 Microsoft SharePoint Microsoft SharePoint 2007
Instant Results Server 2007 Bible For Dummies
di T. Willis di A. Corp et al. di V. L. Williams
John Wiley John Wiley John Wiley
316 pp - euro 35,00 792 pp - euro 40,00 456 pp - euro 27,50
ISBN 9780470118719 ISBN 9780470008614 ISBN 9780470099414

SharePoint 2007 and Core Internet Application Advanced FPGA Design
Office Development Expert Development Architecture, Implementation,
Solutions with ASP.NET 2.0 and Optimization
di R. Holloway et al. di R. Connolly di S. Kilts
John Wiley Addison Wesley John Wiley
324 pp - euro 42,00 1088 pp - euro 48,95 336 pp - euro 75,20
ISBN 9780470097403 ISBN 9780321419507 ISBN 9780470054376
VBJ 77

VBScript Programmer’s Microsoft SharePoint 2007 SharePoint 2007
Reference, 3ed. Unleashed User’s Guide
di A. Kingsley-Hughes et al. di M. Noel e C. Spence di S. Bates e T. Smith
John Wiley Sams Apress
816 pp - euro 35,50 840 pp - euro 52,95 407 pp - euro 46,50
ISBN 9780470168080 ISBN 9780672329470 ISBN 9781590598290

Scrivi a book@gruppoinfomedia.it specificando nell’oggetto della e-mail:
IN VETRINA VBJ n. 77
oppure inviaci il coupon al numero di fax 0587/732232
Potrai acquistare i libri qui riportati con uno SCONTO ECCEZIONALE
del 10% anche se acquisti solo un libro
oppure del 20% se acquisti 3 libri

VBJ 77
���� ��������
��������
�� �����������������������
�������������������������������������������������������������������������������������
�������������������������������������
������������������

����
�������������������������������������������������
�� �����������������������������������������������������������������������������������������
����������������������������������������������������������
�������������������������������

����������
�� ������������������������������������������������
���������������������������������������������������������������������������������
�����������
������������������

������������������������
�� ������������������������������������������������������
�������������
�����������������

������
�����������������������������������������������������������������
�� ��������������������������������������������������������������������������������������
������������������������������
������������������

���������������������������������
�� ���������������������������������������������������������������������������������������
���������������
������������������

����������
�����������������������������������������
�� ��� ������� ��������������� ���� ����������� ��� ������������ ��� ��������� ���� ��� ���������
������������
���������������������

�����������������������������������
�� ���������������������������������������������������������
��������������� ����������������
��������
������������������������������������������������������������������������������������
�������������������������������������������������������������������������������������� �� ����������
�������������������������������������������������������������������������������������������
������������������������������������������������������������������� �� ���������������

����������������������������������� �
�������������������
��������������������������������
�����������������������������

��������������������������
��������������������������������������

��������������������
���� ������� ������
�����������������������������������������
����������������
�������������������������������
�����������������
�������������
�������������������
��������������
����������������
��������������������
��������������


���������������
������������������������������������������������������
����������������
� ��������������������������������������������������������
�������������������������������������������������������������
��������������������������������������������������������
������������������������������������������������������������
����������������������������������������������������������������������
����������������������������������������������������������������������
�����������������������������������������������������������������
�������������������������������������������������������������������
���������������������������������������������������������������
���������� �����������������������������������������������������������������������������������������
��������������������������������
�����������������������������������������������������������������������������������������
������������������������� ���������������������������������������������������������������������������������������
����������������������� �������������������������������������������������������������������������������������������
�����������������������
�������������������������������������������������������������������������������������
���������������
���������������������
������������������������������
��� ��������� ����� ����� ��� ��� ���������� ������� �� ���������� ��� �� ���������� ��������� �����
������� ����������������������������������������������������������������������������������������
�����������������������
�����������������������������������������������������������������������������������������
�������������� ���������������������������������������������������������������������������������������������
�������������������
����������������������������������������������������������������������������������
����������� ����������������������������������������������������������������������������������������
�������������������
�����������������������������������������������������������������������������������������
����������������������������������������������������������������������������������������������
������ ��������������������������������������������������������������������������������������������
������������������������ ����������������������������������������������������������������������������������������������
����������������������
���������������������������������������������������������������������������������������
����������������������������������������������������������������������������������������
�������������������
���������������������������������� �������������������������������
��������������������������������� ��������������������������������������������������������������������������������������
���������������� ����������������������������������������������������������������������������������������
������������������������������� ���������������������������������������������������������������������������������������
������������������������������������������������ �����������������������������������������������������������������������������������������
����������������������������������
�������������������� ������������������������������������������������������������������������������������������
������������������������� ��� ����������� ��� ���� �� �������� ��� ��� ���������� ������������� ��� ��������� ��������� ���
��������������������

��������������������������������������������������������� ����������������
���������������������������������������������������� ��������������������������
������������������������������������

����������������������������������������������������������������
���������������������������������������������������������
�������������������������������������
�������������������������������������������������������������������������
�����������������������������������������������������
����������������������������������� ��
SHAREPOINT

SharePoint
Object Model
Introduzione al modello ad oggetti di Microsoft Office SharePoint Server 2007
per lo sviluppo di soluzioni personalizzate.

di Paolo Pialorsi (www.devleap.com)

Microsoft Office SharePoint Server 2007 Tutti questi servizi e funziona-
(MOSS2007) è un framework applicativo princi- lità sono utilizzabili “out of the
palmente pensato per la realizzazione di soluzioni box” e gestibili con strumenti
web di collaborazione, gestione documentale e pu- già pronti per l’uso, come Mi-
blishing. Come probabilmente saprete esiste una crosoft Office SharePoint Desi-
versione gratuita di SharePoint, chiamata Windows gner 2007 e Microsoft Office 2007
SharePoint Services 3.0 (WSS3), che sta alla base in generale.
anche di MOSS2007, che semplicemente lo esten-
de in termini di funzionalità e servizi accessori. Sviluppare soluzioni Share-
Ad esempio MOSS2007, nelle sue varie versioni e Point
licenze, offre un motore di ricerca evoluto e di li- Molto spesso però non è suffi-
vello enterprise, fornisce un motore di Single Sign ciente appoggiarsi a questi stru-
On, consente il collegamento a sistemi e software menti e occorre sviluppare delle
gestionali esterni tramite il Business Data Cata- personalizzazioni, per integrare
log, consente di gestire integrazioni con Microsoft le proprie soluzioni con il moto-
Office Form Server e Microsoft Office Excel Ser- re di WSS3/MOSS2007.
vices, ecc. Di seguito sono elencati alcuni
dei più comuni ambiti di perso-
nalizzazione e sviluppo di solu-
DevLeap è un gruppo di consulenti e autori specializzati nella zioni SharePoint:
formazione e consulenza per lo sviluppo di soluzioni basate
sul Framework .NET di Microsoft. Possono essere contattati • WebPart: controlli web pensati
via email: info@devleap.it. I loro blog personali sono dispo-
nibili all’indirizzo http://blogs.devleap.com/ per arricchire la classica inter-
faccia utente di SharePoint, de-

12 VBJ N. 77 - Settembre/Ottobre 2007
SHAREPOINT

Figura 1 SharePoint Object Model Hierarchy

finibili e configurabili anche dall’utente fi- dello grafico e la stessa struttura di conte-
nale, che si integrano con l’interfaccia web nuti (liste, cartelle documenti, ecc.). Si pensi
di SharePoint. Richiamano in tutto e per tut- alla gestione dei clienti e alla realizzazione
to il concetto di WebPart di ASP.NET 2.0, in di un mini-portale web, per ciascun clien-
quanto ne rappresentano un’estensione. te o area commerciale, con le cartelle per
le fatture attive, passive, gli indirizzi, gli
• EventHandler: sono classi che intercettano appuntamenti, ecc. Creare un site templa-
azioni eseguite dagli utenti (inserimento di te corrisponde a formalizzare uno schema
un file, cancellazione di un item da una lista, dei contenuti, delle personalizzazioni e del
ecc.) e consentono di svolgere azioni corret- layout grafico di base, da applicare poi a
tive, se invocati pre-evento, o consequenzia- tutte le singole istanze di sito web, costrui-
li, se invocati post-evento. te secondo quel modello.

• List template: descrivono modelli di liste • Workflow: sono processi di business rea-
di documenti o elementi (contatti, appun- lizzati con Windows Workflow Foundation
tamenti, task, ecc.) utilizzabili per creare e che possono arricchire di funzionalità e
N diverse istanze delle stesse, tutte con la comportamenti le liste di file e contenuti o
stessa struttura e comportamento, in base i modelli di documento. Ad esempio è pos-
a quanto definito nel modello. sibile associare un workflow di approvazio-
ne ad ogni documento di tipo “offerta”, op-
• Site template: spesso si realizzano soluzioni pure collegare un workflow a qualsiasi do-
basate su N siti web tutti con lo stesso mo- cumento inserito in una specifica cartella,

VBJ N. 77 - Settembre/Ottobre 2007 13
SHAREPOINT

oppure ancora definire un flusso da esegui- space .NET che raggruppano diverse mi-
re ogni volta che viene inserito un appun- gliaia di classi. Il namespace radice si chia-
tamento in un’agenda on-line. ma Microsoft.SharePoint e contiene nume-
rosi altri namespace, alcuni dei più impor-
tanti sono:

• Microsoft.SharePoint.Administration: con-
Qualunque soluzione si tiene le classi per l’amministrazione e la
vada ad implementare, gestione della topologia di soluzioni Sha-
uno degli strumenti rePoint.

principali è l’Object Model • Microsoft.SharePoint.WebControls: racchiu-
di SharePoint de i controlli e le classi per la realizzazione
di WebPart e WebControl.

Vi sono molti altri ambiti in cui può essere • Microsoft.SharePoint.Workflow: rappresen-
necessario sviluppare porzioni di codice per ta il namespace preposto a definire le clas-
SharePoint, ma quelli appena visti sono sicu- si relative all’integrazione tra SharePoint e
ramente tra i più diffusi. Ciò che conta mag- Windows Workflow Foundation.
giormente però è il fatto che qualunque tipo
di soluzione si vada ad implementare, uno de- • Microsoft.SharePoint.Portal.Search: contie-
gli strumenti principali da utilizzare è l’Object ne le classi relative al motore di ricerca, pre-
Model di SharePoint. sente solo in MOSS2007 e non in WSS3.

SharePoint Object Model • Microsoft.SharePoint.Portal.WebControls:
Dal momento che SharePoint persiste sia la controlli web specifici di MOSS2007.
propria configurazione che la configurazione
e i contenuti dei suoi siti su dei database ap- • Microsoft.SharePoint.Portal.SingleSignOn:
plicativi, basati su Microsoft SQL Server, è ne- le classi che afferiscono al motore di Sin-
cessario appoggiarsi ad un modello ad oggetti gle Sign On di MOSS2007.
per poter operare in modo sicuro e corretto.
Lo SharePoint Object Model è un framework La topologia di una soluzione SharePoint
di classi, realizzato con .NET Framework e prevede la definizione di una SharePoint
parzialmente offuscato, che consente di la- Server Farm, rappresentata da oggetti di
vorare e interagire con tutti gli strumenti e tipo SPFarm. Una SPFarm consente di ge-
gli oggetti definiti all’interno di una server stire la configurazione della farm, importare/
farm SharePoint. esportare utenti definiti nella farm stessa e
È una libreria di classi che è disponibile su svolgere operazioni di backup e restore dei
qualsiasi server sul quale siano configurati i servizi configurati. Di seguito un esempio di
moduli di SharePoint. Non è pensato per es- codice per accedere ad una SPFarm, in base
sere referenziato ed utilizzato da applicazioni alla stringa di connessione del suo database
o servizi che girano su server diversi da quelli di configurazione:
preposti ad ospitare SharePoint. Esistono in-
fatti dei web service, pubblicati da SharePoint,
pensati per tutte quelle situazioni in cui sia C#
necessario utilizzare i server MOSS2007/WSS3 SPFarm farm = SPFarm.Open
da server o applicazioni remote. (“server=localhost;database=SharePoint
Esistono poco più di una ventina di name- _Config;integrated security=SSPI;”);

14 VBJ N. 77 - Settembre/Ottobre 2007
SHAREPOINT

tabase di configurazione o applicativo, a se-
Console.WriteLine(“The current conda dei casi.
SPFarm version is: {0}”, farm.BuildVersion); All’interno di ciascuna Web Application tro-
Console.WriteLine(“The SPFarm name is: {0}”, vano posto le Site Collection, oggetti di tipo
farm.DisplayName); SPSite, che non sono altro che insiemi di Siti
Web, corrispondenti ad oggetti di tipo SPWeb.
Una SPFarm è costituita da una o più Web Gli SPSite raggruppano diversi SPWeb, con-
Application, che in SharePoint Object Model sentendo di condividere il database di conte-
si chiamano SPWebApplication. Queste ulti- nuti, gli utenti e i gruppi SharePoint, oltre ad
me corrispondo ai siti IIS configurati sui ser- alcune impostazioni generali.
ver web di pubblicazione. Da una SPWebAp- Ecco un esempio di codice che scorre tut-
plication si gestiscono le configurazioni della ti gli SPSite configurati su una SPWebAppli-
singola applicazione. Ad esempio di seguito si cation, per andare poi a mostrare le singole
utilizza un oggetto SPWebApplication per con- istanze di SPWeb in essi cotenute.
figurare l’accesso anonimo all’applicazione:
C#
C# SPWebApplication webApplication =
SPWebApplication webApplication = SPWebApplication.Lookup
SPWebApplication.Lookup (new Uri(“http://moss2007dev:9501/”));
(new Uri(“http://moss2007dev:9501/”));
webApplication.IisSettings[SPUrlZone.Default]. Console.WriteLine(“\nHere are the Sites in the
AllowAnonymous = true; SPWebApplication:”);
webApplication.Update(); foreach (SPSite site in webApplication.Sites)
{
Come si vede già da questo primo esempio, Console.WriteLine
le modifiche agli oggetti devono sempre es- (“\tPortal Name: {0}\n\tURL: {1}”,
sere confermate invocando l’apposito metodo site.PortalName, site.Url);
Update(). Infatti mentre si lavora con gli og-
getti si modifica solo una copia in memoria di Console.WriteLine
quello che deve poi essere persistito nel da- (“\n\tHere are the Webs in the SPSite:”);

Riquadro 1 Ambiente di sviluppo SharePoint

Una domanda molto ricorrente nei corsi e negli eventi pubblici dedicati a SharePoint 2007 è quella relativa all’ambiente
di sviluppo “ideale” per lavorare con SharePoint. Sono possibili almeno due diverse soluzioni. La prima prevede l’uso
di un server SharePoint condiviso tra diversi sviluppatori, con una gestione dei sorgenti locali alle singole macchine
di sviluppo ed un deployment centralizzato sul server di sviluppo e test. Questa soluzioni non consente di verificare e
debuggare direttamente il codice, in particolare quello basato sullo SharePoint Object Model, in quanto manca l’infra-
struttura di SharePoint installata sui singoli PC di sviluppo, però consente di avere un ambiente di testing condiviso e
centralizzato. Una seconda soluzione possibile, e che personalmente utilizzo, prevede l’uso di macchine virtuali preposte
all’esecuzione delle soluzioni e personalizzazioni SharePoint. Su queste macchine dedicate potranno essere installati
tutti gli strumenti di sviluppo necessari e potrà essere svolto comodamente il debug del codice. Ovviamente in soluzioni
di questo tipo diventa importante che ci sia un gestore dei sorgenti condivisi, come il Source Control di Team System,
al fine di avere ambienti di sviluppo diversi ma collegati come sorgenti. In generale una postazione di lavoro (fisica o
virtuale) per sviluppare soluzioni SharePoint prevede un sistema Windows Server 2003, con Visual Studio 2005 e .NET
Framework 3.0, oltre ovviamente a WSS3/MOSS2007. Inoltre servono le estensioni per Visual Studio per lo sviluppo di
Workflow e risultano molto comode le Visual Studio Extensions for Windows SharePoint Services 3.0, scaricabili dal sito
pubblico di MSDN. Queste ultime permettono di avere una serie di modelli di classi e progetti, pensati per estendere
in modo rapido e guidato l’ambiente di SharePoint. Con Visual Studio 2008 queste estensioni saranno già nativamente
presenti nell’ambiente di sviluppo.

VBJ N. 77 - Settembre/Ottobre 2007 15
SHAREPOINT

foreach (SPWeb web in site.AllWebs) Attraverso un’istanza di SPWeb si può ave-
{ re accesso, da codice, alle liste di contenuti e
Console.WriteLine documenti presenti all’interno di un portale
(“\tTitle: {0}\n\tURL: {1}\n\tTemplate: {2}”, SharePoint, sia esso MOSS2007 o WSS3. In-
web.Title, web.Url, fatti ogni SPWeb espone la proprietà Lists,
web.WebTemplate); di tipo SPListCollection, tramite la quale si
} possono scorrere e ricercare le singole liste
} di contenuti. Pensiamo allora ad un classi-
co portale SharePoint di collaborazione (det-
Il codice di esempio appena visto è definito to “Team Site”), dove sia presente una lista di
all’interno di un’applicazione esterna, in que- “Contacts”. Il seguente codice mostra come
sto caso specifico si tratta di un’applicazione ottenere e sfogliare l’elenco dei singoli con-
Console, che interagisce con SharePoint. Mol- tatti in essa contenuti:
to spesso però il codice che scriviamo gira al-
l’interno di pagine ASP.NET o WebPart, che
in realtà sono ospitate all’interno di istanze di Attraverso un oggetto
SPWeb. Per questo motivo gli oggetti SPWeb
e SPSite possono essere costruiti anche sfrut- SPWeb si può avere
tando direttamente il contesto ASP.NET delle accesso alle liste di
richieste che si stanno evadendo, per ricavare
automaticamente il contesto SharePoint.
contenuti e documenti
del portale
C#
SPSite site = SPControl.GetContextSite
(Context);
SPWeb web = SPControl.GetContextWeb(Context); C#
SPWeb web = SPControl.GetContextWeb(Context);
L’esempio appena riportato descrive come ac- SPList listContacts = web.Lists[“Contacts”];
cedere al SPSite e/o SPWeb corrente da una foreach (SPListItem contact in
Web Part configurata in MOSS2007/WSS3. listContacts.Items)
L’oggetto SPControl utilizzato si trova nel {
namespace Microsoft.SharePoint.WebContro Respone.Write(String.Format
ls, proprio ad indicare che è di uso ricorren- (“Last Name: {0} - EMail: {1}”,
te da parte dei Web Control ASP.NET creati contact[“Title”], contact[“Email”]));
per girare in SharePoint. }

Lavorare con le liste Come si vede dall’esempio appena riportato,
A prescindere dal fatto che si lavori con ap- ogni item di una lista SharePoint è descrit-
plicazioni esterne (servizi del sistema operati- to da un oggetto di tipo SPListItem, il quale
vo, moduli batch da Console, programmi Win- espone un dictionary di proprietà che corri-
dows Forms, ecc.) referenziando gli SPSite e spondono ai campi informativi dell’elemen-
SPWeb tramite la loro URI, oppure con pagi- to. Si noti che le chiavi utilizzate per acce-
ne ASP.NET e WebPart, utilizzando il conte- dere i singoli campi non corrispondo neces-
sto ASP.NET, tipicamente questi oggetti sono sariamente ai nomi dei campi stessi (“Last
utilizzati non tanto o non solo per variare la Name” diventa “Title”). Inoltre ogni campo
configurazione dell’ambiente, ma soprattut- di un SPListItem ha un nome pubblico e de-
to per accedere in lettura e scrittura ai con- scrittivo, chiamato Title, e un nome interno,
tenuti del portale. chiamato InternalName. Nel nostro esempio

16 VBJ N. 77 - Settembre/Ottobre 2007
SHAREPOINT

il campo con Title “Last Name” ha un Inter- sito web radice della Site Collection corrente.
nalName pari a “Title”. La ricerca dei campi Sottolineo il fatto che l’elemento deve prima
su un SPListItem avviene sulla base dell’In- di tutto essere aggiunto alla lista, tramite il
ternalName, che è case sensitivo. Per avere un metodo Add() della collezione di Items, quin-
elenco preciso dei nomi dei campi disponibi- di solo dopo aver valorizzato i suoi campi può
li per gli SPListItem di un’istanza di SPList essere salvato, chiamandone il metodo Upda-
possiamo utilizzare la proprietà Fields dell’og- te(), già visto in precedenza.
getto che descrive la lista. Nel prossimo estratto di codice invece si crea,
completamente da zero, una lista di clienti,
C# con titoli “Clienti”, in un portale di collabo-
SPWeb web = SPControl.GetContextWeb(Context); razione SharePoint:
SPList listContacts = web.Lists[“Contacts”];
SPWeb web = new SPSite
(“http://moss2007dev/”).OpenWeb();
foreach (SPField field in listContacts.Fields)
{
Le soluzioni WSS3/
Respone.Write(String.Format MOSS2007 di archiviazio-
(“Title: {0} - Internal Name: {1} - Type: {2}”,
field.Title, field.InternalName,
ne documentale sono
field.TypeAsString)); gestibili via Object Model
}

In alternativa possiamo utilizzare la proprie-
tà SchemaXml che caratterizza ogni istanza di
SPList, per avere la sua struttura in un solo C#
passaggio, in formato XML. SPWeb web = SPControl.GetContextWeb(Context);
Un’operazione ricorrente, oltre allo sfogliare Guid newListId = web.Lists.Add(“Clienti”,
una lista, è creare nuovi elementi al suo in- “Lista Clienti”, SPListTemplateType.Contacts);
terno ovvero creare liste ex-novo. Di seguito è Response.Write(String.Format(“List {0} crea-
riportato un esempio di codice che aggiunge ted.”, web.Lists[newListId].Title));
un contatto alla lista appena sfogliata:
La lista viene aggiunta, come accadeva per
C# gli SPListItem, alla collezione delle Lists del
SPWeb web = new SPSite SPWeb. Il risultato del metodo di Add(...) è il
(“http://moss2007dev/”).OpenWeb(); GUID che identifica univocamente in Share-
SPList listContacts = web.Lists[“Contacts”]; Point la lista appena creata. Come si vede il
SPListItem newContact = listContacts.Items. tipo di lista è ottenuto tramite una enumera-
Add(); zione di tipologie predefinite (SPListTempla-
newContact[“Title”] = “Pialorsi”; teType). In realtà è anche possibile utilizza-
newContact[“First Name”] = “Paolo”; re template di liste personalizzati, per crea-
newContact[“Email”] = “paolo@devleap.it”; re da codice N istanze di liste secondo mo-
newContact.Update(); delli proprietari. Non soffermiamoci oltre su
aspetti di dettaglio in un articolo introdutti-
In questo caso l’accesso all’istanza di SPWeb vo come questo.
avviene tramite il metodo OpenWeb() dell’og-
getto SPSite. Di fatto questo metodo, se in- Gestire file e documenti
vocato nel suo overload senza parametri, re- Uno degli aspetti più interessanti e rivolu-
stituisce l’istanza di SPWeb corrispondente al zionari di SharePoint è il fatto che è possi-

VBJ N. 77 - Settembre/Ottobre 2007 17
SHAREPOINT

bile utilizzare portali e soluzioni SharePoint Console.WriteLine(“\tTitle: {0}\n\tUrl:
come valide alternative a sistemi di file sha- {1}\n\tAuthor: {2}”,
ring tradizionali. file.Title, file.Url, file.Author.Name);
}

Qualora si voglia estrarre da SharePoint
Il codice .NET di Web Part il contenuto binario di un file, è possibi-
o controlli ASP.NET, deve le accedervi tramite un oggetto di tipo
essere autorizzato via System.IO.Stream, nel modo seguente:

Code Access Security C#
SPWeb web = new SPSite
(“http://moss2007dev/”).OpenWeb();

Le soluzioni di archiviazione documentale SPDocumentLibrary doclib = web.Lists
basate su WSS3/MOSS2007 sono gestibili non [“Shared Documents”] as SPDocumentLibrary;
solo attraverso l’interfaccia utente di Share-
Point, Microsoft Office e Windows Explorer, SPFile fileInstance = doclib.RootFolder.Files
ma anche attraverso l’Object Model. Ogni li- [“Notes.txt”];
sta di documenti, dal punto di vista di Sha- Stream fileStream = fileInstance.OpenBinary-
rePoint, è innanzitutto una SPList, specializ- Stream();
zata nel tipo SPDocumentLibrary. In pratica using (StreamReader sr = new StreamReader
ogni SPDocumentLibrary non è altro che una (fileStream))
classe, derivata da SPList, che specializza al- {
cuni dei suoi comportamenti e funzionalità. String data = sr.ReadToEnd();
Mentre gli elementi di una SPList tradizionale Console.WriteLine(data);
sono oggetti di tipo SPListItem, i documenti }
all’interno di una SPDocumentLibrary sono
oggetti di tipo SPFile. A ciascun SPFile cor- Anche il salvataggio di un file in una car-
risponde però anche un SPListItem che rap- tella documenti è un’operazione abbastan-
presenta il contenitore di meta-informazioni za banale:
legate al singolo file (autore, data di upload,
versione, ecc. e campi personalizzati). C#
Di seguito è riportato un esempio di codice SPWeb web = new SPSite
per leggere i file presenti in una document (“http://moss2007dev/”).OpenWeb();
library:
SPDocumentLibrary doclib = web.Lists
C# [“Shared Documents”] as SPDocumentLibrary;
SPWeb web = new SPSite
(“http://moss2007dev/”).OpenWeb(); String fileContentAsText = “Sample document
content!”;
SPDocumentLibrary doclib = web.Lists Byte[] fileContent = Encoding.Unicode.GetBytes
[“Shared Documents”] as SPDocumentLibrary; (fileContentAsText);
SPFile fileUploaded = doclib.RootFolder.Files.-
Console.WriteLine(“\n\tHere are the Files in Add(“sample.txt”, fileContent);
the SPDocumentLibrary:”); fileUploaded.Item[“Title”] = “Sample Document”;
foreach (SPFile file in doclib.RootFolder.Files) fileUploaded.Item.Update();
{ fileUploaded.Update();

18 VBJ N. 77 - Settembre/Ottobre 2007
SHAREPOINT

Come si vede possiamo scrivere il contenu- String data = sr.ReadToEnd();
to del file sotto forma di array di Byte, oppu- data = data.ToUpper();
re anche come Stream sfruttando un overload fileUploaded.SaveBinary(Encoding.Unicode.-
differente del metodo Add(...) della lista di Fi- GetBytes(data));
les corrente. Ogni SPFile prevede poi una pro- }
prietà di nome Item che corrisponde al SPLi- fileUploaded.Update();
stItem sottostante. Ogni lista di documenti in- fileUploaded.CheckIn(“Upper case done.”);
fatti è prima di tutto una lista di SPListItem,
che hanno però una serie di caratteristiche in I metodi più importanti di questo esempio
più finalizzate a descrivere il file rappresen- sono CheckOut() e CheckIn(...), dove il nome
tato. Nuovamente si sottolinea l’importanza indica già in modo inequivocabile lo scopo di
dell’invocazione del metodo Update() sul SP- ciascuno dei due. Volendo è anche possibile
File e sul SPListItem sottostante. annullare un’operazione di check-out, invo-
Un’altra attività abbastanza semplice e ricor- cando il metodo di UndoCheckOut().
rente è il check-in/check-out dei documenti
da modello ad oggetti. SharePoint consente Conclusioni
infatti di gestire politiche di accesso concor- In questo articolo abbiamo “assaggiato” al-
rente ai documenti, sfruttando regole di che- cune delle potenzialità del modello ad og-
ck-out esclusivo dei file e di check-in al ter- getti di SharePoint. È importante ricordare
mine delle attività di modifica. Ecco un esem- che lo SharePoint Object Model è fruibile da
pio di codice in grado di prendere un docu- qualsiasi postazione abbia SharePoint instal-
mento, farne il check-out e successivamente lato. Inoltre è fondamentale sottolineare che
il check-in, il tutto da Object Model. il codice che usa l’Object Model dall’interno
di Web Part o controlli ASP.NET, deve essere
C# autorizzato a farlo, tramite apposite configu-
SPWeb web = new SPSite razioni di Code Access Security (CAS), altri-
(“http://moss2007dev/”).OpenWeb(); menti il codice non sarà autorizzato a girare
e non produrrà alcun effetto, anzi in alcune
SPDocumentLibrary doclib = web.Lists circostanze determinerà errori.
[“Shared Documents”] as SPDocumentLibrary; In articoli futuri approfondiremo alcuni di
questi e altri temi relativi allo sviluppo per
String fileContentAsText = “Sample document SharePoint, come per esempio la creazione
content!”; di EventHandler e di Workflow personalizzati,
Byte[] fileContent = Encoding.Unicode.GetBytes l’utilizzo dei Web Service di SharePoint, per
(fileContentAsText); la gestione dei contenuti da remoto, e la con-
SPFile fileUploaded = doclib.RootFolder.Files.- figurazione della Code Access Security.
Add(“sample.txt”, fileContent);
fileUploaded.Item[“Title”] = “Sample Document”; Riferimenti
fileUploaded.Item.Update(); [1] http://msdn.microsoft.com/sharepoint/
fileUploaded.Update(); [2] http://msdn2.microsoft.com/en-us/library/
bb530302.aspx
fileUploaded.CheckOut(); [3] http://msdn2.microsoft.com/en-us/library/
Stream fileStream = fileUploaded.OpenBinary- bb530301.aspx
Stream(); [4] http://msdn2.microsoft.com/en-us/library/
using (StreamReader sr = new StreamReader bb153523.aspx
(fileStream))
{

VBJ N. 77 - Settembre/Ottobre 2007 19
LINQ

LINQ in pillole:
architettura e filosofia
di base
Il primo di una serie di articoli in “pillole” per introdurre i concetti fonda-
mentali di LINQ e capire quando e come usarlo al meglio, nell’attesa che
arrivi insieme a Visual Studio 2008.

di Marco Russo e Paolo Pialorsi (www.devleap.com)

Questo articolo è il primo di una serie dedicata a Grazie a LINQ è possibile scri-
LINQ in cui presenteremo le principali funzionali- vere:
tà di questo nuovo strumento che sarà disponibile
in Visual Studio 2008. var query =
from c in Customers
Cosa è LINQ where c.Country == “Italy”
LINQ (Language Integrated Query) è un modello select c.CompanyName;
di programmazione che introduce all’interno dei lin-
guaggi .NET (per ora C# e VB) dei costrutti sintatti- foreach ( string name in query ) {
ci per l’interrogazione di strutture dati, siano esse in Console.WriteLine( name );
memoria o meno. Si tratta di vere e proprie estensio- }
ni dei linguaggi che espongono in maniera più sem-
plice e intuitiva delle funzionalità presenti in una li- Questo codice (scritto in C#
breria che fa parte del .NET Framework 3.5. 3.0) estrae da Customers i clien-
ti italiani, fornendo una lista che
contiene solo il nome (quindi un
elenco di stringhe). Questa sin-
tassi richiama quella di SQL, an-
DevLeap è un gruppo di consulenti e autori specializzati nella
formazione e consulenza per lo sviluppo di soluzioni basate
che se ha un costrutto sintattico
sul Framework .NET di Microsoft. Possono essere contattati diverso soprattutto per l’ordine
via email: info@devleap.it. I loro blog personali sono dispo- delle keyword, visto che select
nibili all’indirizzo http://blogs.devleap.com/
è alla fine anziché all’inizio. Si

20 VBJ N. 77 - Settembre/Ottobre 2007
LINQ

Figura 1 Architettura di LINQ

tratta di una precisa scelta progettuale per In realtà Customers può anche essere un
migliorare il funzionamento di Intellisense. semplice array di oggetti in memoria:
Ma cosa è Customers?
La risposta più intuitiva è che Customers sia Customer[] Customers;
una tabella all’interno di un database. Questa
è una delle possibilità offerte da LINQ, ma Oppure una tabella in un DataSet:
non è l’unica e forse nemmeno la più impor-
tante. L’oggetto di una query LINQ può esse- DataSet ds = GetDataSet();
re un qualsiasi oggetto (da un punto di vista DataTable Customers = ds.Tables[“Customers”];
OOP) che esponga l’interfaccia IEnumerable.
L’oggetto Customers dell’esempio precedente L’elemento centrale è che la sintassi che de-
rappresenta una tabella in un database se è finisce la query sui dati è identica, indipen-
dichiarato in questo modo: dentemente dal fatto che l’oggetto della query
sia una tabella su un database o un array di
DataContext db = new DataContext( Connection oggetti in memoria. Elenchiamo i motivi per
String ); cui questa uniformità è così importante:
Table<Customer> Customers =
db.GetTable<Customer>(); • Programmazione dichiarativa: si definisce

VBJ N. 77 - Settembre/Ottobre 2007 21
LINQ

cosa si vuole ottenere e non come ottener- Architettura di LINQ
lo – il compilatore e il runtime hanno più Come si può vedere in Figura 1, LINQ ha
informazioni per ottimizzare l’esecuzione, un’architettura estendibile: il “motore” di
eventualmente facendo leva sul paralleli- LINQ lavora su oggetti in memoria e prende
smo; il nome di LINQ to Objects, ma altre estensio-
ni consentono da subito di lavorare con dati
• Sintassi uniforme: le regole sintattiche per relazionali (LINQ to SQL), DataSet (LINQ to
le query sono le stesse anche se i dati risie- DataSet), XML (LINQ to XML) ed entità for-
dono su sistemi con metodi d’accesso diffe- nite da ADO.NET Entitiy Framework (LINQ
renti (o linguaggi di interrogazione diversi to Entities). La scelta dell’estensione da usa-
– es. dialetti SQL); re dipende dal tipo dell’oggetto su cui agisce
una query LINQ (con la conseguente dipen-
• Type-checking: il controllo sintattico sulla denza da alcuni namespace e assembly).
query e sulla correttezza dei tipi avviene al
momento della compilazione anziché du-
rante l’esecuzione. Questo è particolarmen-
te importante se si pensa al fatto che oggi LINQ introduce all’interno
le query SQL annegate nel codice non han- dei linguaggi .NET
no alcun controllo sintattico. Anche usando
le stored procedure, resta il problema del- costrutti sintattici per
la mancanza di controllo sui tipi restituiti l’interrogazione di
dalla stored procedure stessa.
strutture dati
A queste considerazioni se ne possono ag-
giungere altre valide limitatamente ad alcune
implementazioni di LINQ. Per esempio, dal
punto di vista della sicurezza LINQ to SQL Le query LINQ sono fisicamente imple-
evita all’origine problemi di SQL injection nel mentate attraverso due meccanismi: in uno
codice SQL generato e inviato al database. il compilatore genera il codice che eseguirà
Il codice visto inizialmente è scritto in C# la query (LINQ to Objects, LINQ to XML),
3.0; in Visual Basic 9.0 dovremmo scriverlo nell’altro il compilatore genera una struttu-
nel modo seguente: ra dati (expression tree) che può essere ana-
lizzata, manipolata e infine compilata come
Dim query = _ codice (o convertita in altri linguaggi, come
From c In Customers _ SQL) durante l’esecuzione.
Where c.Country = “Italy” _
Select c.CompanyName Anche se a prima vista LINQ è importan-
te per l’accesso ai dati relazionali, in realtà è
For Each name in query il paradigma di programmazione dichiarati-
Console.WriteLine( name ) va quello più interessante a lungo termine.
Next name Il fatto di scrivere codice a un livello “più
alto” consente di lasciare maggiore libertà
Le differenze sono minime e puramente sin- al compilatore piuttosto che al runtime per
tattiche, almeno in questo caso. Esistono tut- apportare ottimizzazioni di vario tipo al co-
tavia alcune differenze funzionali tra C# 3.0 dice che deve essere eseguito, e tra queste
e Visual Basic 9.0 che potrebbero variare da un posto di primo piano spetta sicuramente
qui alla versione finale (LINQ, come Visual al parallelismo.
Studio 2008, è ancora in beta). All’interno di Microsoft un team sta svilup-

22 VBJ N. 77 - Settembre/Ottobre 2007
LINQ

pando un’estensione chiamata PLINQ (Paral- na a LINQ per la prima volta è la possibili-
lel LINQ). Altro non è che una versione di tà di manipolare strutture dati in memoria
LINQ to Objects che consente di interrogare scrivendo meno codice che soprattutto diven-
strutture dati in memoria sfruttando in ma- ta molto più chiaro da leggere e mantenere.
niera completamente automatica algoritmi LINQ non è solo accesso a dati relazionali,
che implementano tecniche di parallelismo, ma è soprattutto integrazione nei linguaggi
sfruttando così più CPU (o core) a disposizio- di programmazione di istruzioni specifiche
ne. Visto che nei prossimi anni difficilmen- per l’accesso ai dati.
te vedremo aumentare la velocità dei singoli
core, ma ne avremo un numero sempre mag- Nelle prossime pillole esamineremo più da
giore per ogni PC, l’evoluzione di strumenti vicino i principi base di LINQ e le specificità
che semplifichino l’uso del parallelismo è di delle varie implementazioni.
assoluta importanza.
Bibliografia
Conclusioni [1] Paolo Pialorsi & Marco Russo – “Intro-
LINQ è uno strumento che introduce nuo- ducing Microsoft LINQ”, Microsoft Press,
vi paradigmi nella programmazione, anche 2007
se ciò non deve automaticamente indurre a
cambiare l’architettura di un applicativo. Un Riferimenti
aspetto spesso sottovalutato da chi si avvici- [2] http://introducinglinq.com

VBJ N. 77 - Settembre/Ottobre 2007 23
ENTERPRISE

Architettura di
applicazioni gestionali
con .NET
Quale architettura adottare per realizzare un’applicazione gestionale con Visual
Studio.NET?

di Lorenzo Vandoni

In questo articolo viene presentato uno studio che • Interfacciamento con un data-
ha l’obiettivo di decidere quale architettura adottare base relazionale già esistente
per realizzare un’applicazione gestionale di grosse (nel caso specifico, Oracle)
dimensioni, utilizzando Visual Studio.NET.
Lo studio prende spunto da un caso concreto, ov- • Molte maschere con funziona-
vero dalla necessità reale di sviluppare un’applica- lità di ricerca ed inserimento
zione di questo tipo, presenta alcune alternative, ed dati
arriva a proporre alcune scelte ben precise, spie-
gando perché sono state adottate. • Molti report
Trattandosi di un caso concreto, cominceremo
con una discussione dei requisiti di questa appli- L’applicazione dovrà essere
cazione. utilizzata da diverse aziende di
grandi dimensioni, e con mol-
Requisiti applicativi te sedi sul territorio nazionale.
L’applicazione da realizzare è un “classico” sistema Per questo motivo, sono parti-
informativo gestionale, che presenta quindi queste colarmente importanti questi
caratteristiche principali: requisiti:

Lorenzo Vandoni, è laureato in Informatica ed è uno spe- • facilità di installazione e di
cialista di progettazione e sviluppo con tecniche e linguag-
aggiornamento
gi object-oriented in ambiente Windows. È direttore del
Laboratorio di Ricerca e Sviluppo di Emisfera e coordina
un progetto di ricerca internazionale sulle reti wireless, • efficienza, anche nell’accesso
finanziato dalla Comunità Europea nell’ambito del Sesto a grandi quantità di dati resi-
Programma Quadro (FP6). Può essere contattato all’indirizzo
lvandoni@infomedia.it denti su database remoti

24 VBJ N. 77 - Settembre/Ottobre 2007
ENTERPRISE

L’applicazione, di fat-
to, consiste in un por-
ting di un sistema
precedente, realizzato
utilizzando Visual Ba-
sic 6, Crystal Repor-
ts ed Oracle. Per que-
sto motivo, sarà anche
importante mantenere
una sorta di continuità,
dal punto di vista fun-
zionale, con la versio-
ne precedente.
In quella versione, il Figura 1 Architettura client/server “classica”
problema delle instal-
lazioni e degli aggior-
namenti era stato risol-
to scegliendo di non installare il programma
sul computer degli utenti, ma solo su alcune • applicazione client-server di tipo classico
macchine, accessibili tramite Terminal Ser-
ver. Questa soluzione, in parte, permetteva di • applicazione web
risolvere anche il problema delle prestazioni,
in quanto consentiva di applicare le ottimiz- • applicazione smart client
zazioni di tipo sistemistico solo alle macchi-
ne server, senza preoccuparsi dei vari client Nei prossimi paragrafi verranno descritte le
sparsi sul territorio. caratteristiche principali di ognuna di que-
ste alternative.
Porting su .NET:
motivazioni ed alternative Applicazione client-server “classica”
La scelta di effettuare il porting su .NET è Col termine applicazione client-server “clas-
principalmente motivata dalla necessità di sle- sica” intendo indicare un programma che ri-
garsi da un sistema di sviluppo, Visual Basic siede su una macchina client, e che dialoga
6, ormai abbandonato dal produttore. A que- tramite SQL con un server di database, come
sta necessità si aggiunge il desiderio di rea- mostrato in Figura 1.
lizzare alcuni miglioramenti “strutturali” al- In un’applicazione di questo tipo, la logi-
l’applicazione, che non potrebbero essere im- ca applicativa risiede quasi totalmente sul
plementati se non riscrivendola quasi com- client. Al server vengono demandati alcuni
pletamente. controlli, come la duplicazione di chiave pri-
La scelta di .NET, rispetto ad alternative maria o l’obbligatorietà dei campi, che però
come Java od altri sistemi, è legata a moti- tipicamente vengono implementati anche lato
vazioni di tipo aziendale, come corsi di for- client, e alcune funzionalità “database inten-
mazione già effettuati e certificazioni già ac- sive”, tipicamente implementate tramite sto-
quisite, per cui non verrà ulteriormente ap- red procedure.
profondita. Una soluzione di questo tipo presenta alcu-
Scegliendo di utilizzare .NET, le scelte di- ni vantaggi e svantaggi:
sponibili dal punto di vista architetturale, o
almeno quelle che sono state esaminate, sono • vantaggio: somiglianza archietturale con
le seguenti: la soluzione attuale, con conseguente sem-

VBJ N. 77 - Settembre/Ottobre 2007 25
ENTERPRISE

Figura 2 Architettura semplificata dell’applicazione web

plicità “concettuale” della fase di porting Questa, come già accennato, è anche la so-
luzione adottata nel sistema attuale, e per-
• vantaggio: semplicità architetturale, in mette in effetti di semplificare le fasi di in-
quanto buona parte della logica applica- stallazione e di aggiornamento. I problemi di
tiva risiede sul client questa soluzione sono principalmente legati
ai costi elevati (delle macchine server) e alla
• svantaggio: l’applicazione client diviene scalabilità limitata (ogni server può suppor-
particolarmente pesante tare solo un determinato numero di utenti –
se gli utenti aumentano è necessario instal-
• svantaggio: problemi di installazione e so- lare nuovi server).
prattutto di aggiornamento, in quanto di-
viene necessario installare l’applicazione Applicazione web
client sulle macchine di tutti gli utenti La seconda possibilità che è stata conside-
rata è quella di creare un’applicazione web,
la cui architettura semplificata è mostrata
in Figura 2.
L’applicazione da In questo caso il programma è costituito
da un insieme di pagine ASP.NET, che risie-
realizzare è un classico dono sul server web, e che comunicano tra-
sistema informativo mite SQL col server di database. La comu-
nicazione con il client avviene tramite http,
gestionale e il programma può essere utilizzato trami-
te un web browser. Sul browser, oltre al co-
dice HTML che costituisce l’interfaccia gra-
Una possibile variante, per ovviare a que- fica del programma, può essere eseguito del
st’ultimo problema, potrebbe essere quella di codice Javascript.
utilizzare Terminal Server. In questo modo, In un programma di questo tipo, la logica
l’applicazione non verrebbe installata diret- applicativa risiede quasi totalmente sul ser-
tamente sulle macchine degli utenti, ma su ver, ed è implementata dalle pagine ASP.NET.
un numero limitato di server, ai quali le mac- Al server di database possono essere deman-
chine client potrebbero accedere come sem- dati gli stessi controlli e le stesse funziona-
plici terminali. lità menzionati al punto precedente, men-

26 VBJ N. 77 - Settembre/Ottobre 2007
ENTERPRISE

Figura 3 Architettura della soluzione “smart client”

tre sul client possono essere implementati,
in Javascript, alcuni controlli e funzionalità
elementari. L’applicazione dovrà
Per una soluzione di questo tipo, vantaggi e
svantaggi sono i seguenti:
essere utilizzata da diverse
aziende di
• vantaggio: problemi di installazione e di ag-
giornamento molto limitati, e quasi esclu-
grandi dimensioni
sivamente costituiti dalla necessità di ve-
rificare la compatibilità coi vari browser
web disponibili
tecnologie Ajax, cioè facendo in modo che la
• svantaggio: l’architettura diviene più com- pagina web residente sul client possa comuni-
plessa, alcuni controlli (es. obbligatorietà care con il server e aggiornare il proprio con-
di campi) potrebbero essere implementa- tenuto. In questo caso, si otterrebbe una so-
ti in ciascuno dei tre livelli luzione simile a quella discussa nel paragra-
fo successivo, ma basata su web.
• svantaggio: lo sviluppo web presenta diffi-
coltà di implementazione oggettivamente Smart client
superiori, legate soprattutto al fatto che il Uno “smart” client è un’applicazione client
web non è nato per ospitare applicazioni di livello intermedio rispetto alle due prece-
di questo tipo dentemente esaminate. È più leggera di un’ap-
plicazione client-server di tipo classico, ma è
• svantaggio: le applicazioni web sono ne- più intelligente rispetto a una normale appli-
cessariamente più limitate, nell’interfac- cazione web.
cia grafica, e consentono una minore in- Uno smart client può essere realizzato sia
terattività con l’utente come applicazione Windows, sia come appli-
Alcune di queste limitazioni potrebbero cazione web, utilizzando Ajax. La sua archi-
essere superate adottando delle tecniche/ tettura è mostrata in Figura 3.

VBJ N. 77 - Settembre/Ottobre 2007 27
ENTERPRISE

In questo caso il programma client è costi- Quale soluzione scegliere
tuito da una classica applicazione Windows, Una volta esaminati vantaggi e svantaggi le-
che però demanda una gran parte della logi- gati alle varie soluzioni esaminate, la scelta
ca applicativa a uno strato software residen- è ricaduta su un’applicazione di tipo smart
te sul web server, implementato tramite Web client. In particolare, sulla decisione hanno
Service. La comunicazione tra smart client e pesato la necessità di stratificare l’applicazio-
programma server avviene tramite http, men- ne per rendere meno pesante il programma
tre quest’ultimo usa SQL per interagire con client, e la complessità intrinseca lagata allo
il database. sviluppo di applicazioni gestionali in ambien-
In un programma di questo tipo la logica ap- te web. Tale complessità avrebbe introdotto
plicativa è suddivisa tra i tre livelli. Rispetto difficoltà sicuramente superabili, ma in gra-
alla soluzione precedente, il client è più in- do di rallentare sensibilmente il processo di
telligente (“smart”, appunto), e potrà eseguire sviluppo.
un maggior numero di controlli. Tipicamen- Un ulteriore elemento a favore della soluzio-
te, sul client verranno implementati controlli ne smart client, reso evidente dai test sui pri-
e funzionalità che possono essere gestiti uti- mi prototipi, è legato alla maggiore velocità
lizzando solo i dati precedentemente invia- dell’applicazione, rispetto ad un’analoga ap-
ti dal server, senza accedere nuovamente al plicazione web. Il passaggio da una masche-
database. ra ad un’altra, in particolare, risulta estrema-
In questo caso, i principali vantaggi e svan- mente più veloce, in quanto tutti gli elemen-
taggi sono: ti di interfaccia grafica sono già presenti sul
client. In questo modo, l’utente ha la perce-
• vantaggio: problemi di installazione e di zione di lavorare su un’applicazione remota,
aggiornamento relativamente limitati ma allo stesso tempo ottiene la maggior par-
te dei benefici legati ad un programma che
• vantaggio: semplicità di sviluppo, senza funziona localmente.
le complicazioni tipiche delle applicazio-
ni web Altre caratteristiche dello smart client
Abbiamo finora esaminato solo le caratteri-
• vantaggio: maggiori potenzialità nel dise- stiche più generali dell’architettura proposta.
gno dell’interfaccia grafica Per concludere l’articolo, vengono qui elenca-
te altre caratteristiche del tipo di architettura
• svantaggio: l’architettura diviene molto che è stata successivamente realizzata:
più complessa
• Installazione di tipo “ClickOnce”. Si tratta
Un caso particolare di “smart” client, come di un utile automatismo fornito con Visual
precedentemente accennato, potrebbe essere Studio 2005, che permette la pubblicazione
costituito da un’applicazione web che, grazie di un’applicazione su un sito web, e la con-
all’utilizzo di Ajax, sia in grado di portare sul seguente gestione automatica di installa-
client un maggior numero di funzionalità. zioni ed aggiornamenti. L’adozione di que-
Una soluzione di questo tipo potrebbe esse- sta tecnologia permette di risolvere gran
re sicuramente interessante per lo sviluppo di parte dei problemi legati al deployment.
un’applicazione Internet, ma nel nostro caso
si rivela poco interessante, perché portereb- • Realizzazione di codice di libreria, lato ser-
be con sé tutti gli svantaggi delle ultime due ver e lato client. Lo sviluppo dell’applica-
soluzioni esaminate (complessità architettura- zione è stato preceduto dalla realizzazione
le e complessità implementativa, soprattutto), di alcune funzionalità di base, che risulta-
senza apportare vantaggi significativi. no comuni ai vari moduli. Lato client, sono

28 VBJ N. 77 - Settembre/Ottobre 2007
ENTERPRISE

stati realizzati o, in alcuni casi, adottati, motivo viene spedito dal server al client,
tutti i componenti di interfaccia necessa- che lo riceve come stringa, gestendolo in-
ri per realizzare un’applicazione gestiona- teramente in memoria.
le di livello professionale: griglie, finestre
di ricerca, campi di lookup, ecc. Sono sta- L’uso combinato di codice di libreria e pro-
te inoltre realizzate delle classi base per fili XML ha permesso di creare un’applica-
incapsulare tutti i comportamenti comuni zione estremamente versatile, in cui il codice
alle finestre dell’applicazione client. Lato applicativo è relativamente limitato. In par-
server, sono state realizzate delle classi ticolare, grazie alla gestione lato server dei
base per i Web Service. profili, è possibile modificare diverse carat-
teristiche applicative senza ricompilare l’ap-
• Gestione di profili in formato XML. La plicazione né installare aggiornamenti pres-
maggior parte delle caratteristiche ap- so il cliente.
plicative (campi di ricerca, colonne da vi-
sualizzare, relazioni tra le tabelle, regole Conclusioni
di validazione, ecc.) sono state specifica- In questo articolo è stato descritto il proces-
te all’interno di file di profilo, in formato so decisionale che ha portato alla scelta di
XML, residenti sul server. Per ogni fun- una particolare architettura per la realizza-
zionalità (es. gestione clienti) sono sta- zione di una complessa applicazione gestio-
te create una o più form sul programma nale con Visual Studio.NET. Le considerazio-
client (ClientiFrm.vb), un solo Web Servi- ni fatte in questo contesto possono essere ap-
ce (ClientiWS.vb) e un solo file di profilo plicate in molti altri casi analoghi, anche se
(Clienti.XML). Il file XML risiede sul ser- ovviamente non possono avere una valenza
ver, ma contiene informazioni che riguar- di tipo generale.
dano anche l’interfaccia grafica. Per questo

VBJ N. 77 - Settembre/Ottobre 2007 29
INTELLIGENZA ARTIFICIALE

Programmazione
Genetica e Strategie di
Pianificazione
Prima puntata

di Fabio Fabozzi

Sono sempre stato affascinato dall’Intelligenza Ar- legati alle strategie di pianifica-
tificiale e, soprattutto, dagli Algoritmi Genetici. In zione, riproponendo un classico
particolare, chi ha letto il mio primo libro e gli arti- problema proposto (e risolto) da
coli scritti in passato, ha potuto apprezzare la bel- Koza: UNIVERSAL (Figura 1).
lezza di queste aree tematiche, naturalmente non Tale gioco – o problema – con-
grazie a me, ma al contributo dei grandi scienziati siste nell’impilare dei cubi con
che vi hanno lavorato. La Programmazione Geneti- delle lettere, disposti casualmen-
ca (PG), è il frutto di un’applicazione degli Algorit- te su un tavolo, finché non sia
mi Genetici (AG) da parte di John Koza. I risultati composta la parola “UNIVER-
ottenuti da Koza e dagli altri studiosi in questa di- SAL”, appunto. Un problema
sciplina sono stupefacenti. Vi consiglio di visitare che può sembrare banale, ma
il sito della Genetic Programming Foundation [1], in realtà non lo è. Si tratta, in-
per seguire gli ultimi aggiornamenti e le novità. In fatti, di un problema riguardan-
questo articolo parleremo della PG e dei problemi te le strategie di pianificazione,
successivamente la presa di de-
Fabio Fabozzi è progettista software per tecnologie .NET e cisione e, naturalmente, la rela-
JAVA e di integrazioni tra differenti piattaforme. Attualmente, tiva generazione di programmi
collabora con la ICM Italia S.p.A. sede di Roma. Tra i suoi che risolvano il problema.
principali interessi vi sono l’Intelligenza Artificiale e le Scien-
ze Cognitive. È laureando in Scienze dei Processi Cognitivi, Per ciò che concerne le basi del-
presso l’università “La Sapienza” di Roma. È autore del libro la PG si consiglia di consultare
“Intelligenza Artificiale con VB” edito dal Gruppo Infomedia, la bibliografia alla fine di que-
con cui collabora da diversi anni. Può essere contattato al-
sto articolo.
l’indirizzo fabozzi@infomedia.it

30 VBJ N. 77 - Settembre/Ottobre 2007
INTELLIGENZA ARTIFICIALE

rentetica di un albero.
Tale peculiarità rende
tale linguaggio partico-
larmente adatto a rap-
presentare le forme di
pensiero deduttivo,
sotto forma appunto
di alberi decisionali e
aiuta altresì a rappre-
sentare la popolazione
di un Algoritmo Gene-
tico per l’applicazione
di operatori come l’in-
crocio. Cosa succede
quando si vuole uti-
lizzare un linguaggio
diverso dal LISP, non
funzionale quindi, ma
procedurale e/o ad og-
getti? La direzione in
cui indagheremo è pro-
Figura 1 prio questa.

L’idea di Koza

Considerazioni iniziali Il problema dell’impilamento dei blocchi ser-
ve per sviluppare e verificare metodi di pia-
Koza ha sempre scelto la generazione di pro- nificazione. Koza per risolvere questo proble-
grammi in LISP. La scelta è in questo caso ma utilizzò un insieme di tre terminali e cin-
giustificata: il LISP ha infatti a disposizione que funzioni. I terminali erano rappresenta-
un’ampia scelta di primitive che consentono di ti da sensori collegati ad una sorta di robot e
effettuare operazioni immediate su liste, pile controllato dal programma LISP. Ognuno di
e code con estrema semplicità rispetto ad al- questi sensori rileva un insieme di informa-
tri linguaggi. Inoltre il LISP consente di rap- zioni (Tabella 1).
presentare le operazioni sotto forma di alberi Le cinque funzioni erano quelle riportate
decisionali, ossia come rappresentazione pa- nella Tabella 2.

PA Restituisce il nome del blocco in cima alla pila, altrimenti, se la pila è vuota, restituisce NIL, il
corrispettivo in LISP dell’istruzione null, presente in altri linguaggi.

BS Restituisce il nome del Blocco Superiore Corretto; NIL se non corretto.

PN Restituisce il nome del blocco che è necessario per completare la parola UNIVERSAL; NIL se non è
necessario nessun altro blocco.
Tabella 1

VBJ N. 77 - Settembre/Ottobre 2007 31
INTELLIGENZA ARTIFICIALE

Figura 2

La generazione della Popolazione partiva da gramma vada fatto “girare” prima di conosce-
questi due insiemi. Koza generò casualmen- re la sua Idoneità.
te 300 individui. Il resto, come nella PG, in generale segue
L’Idoneità era calcolata in base al numero di le regole d’Incrocio, cioè i più idonei vengo-
casi prova che risultavano impilati in modo no incrociati tra loro.
corretto. I soggetti della popolazione erano rappre-
Ciò implica, in parole povere, che ogni pro- sentati direttamente come espressioni LISP

SP(x) Sposta un blocco x dal tavolo, sulla pila

ST(x) Sposta un qualsiasi blocco x dalla pila al tavolo

RF(espressione1, espressione2) Esegue l’espressione1 finche l’espressione2, un predicato, non
restituisce True.

NOT(espressione1) Restituisce True se l’espressione1 è NIL, altrimenti NIL

EQ(espressione1, espressione2) Restituisce True se l’espressione1 e l’espressione2 sono
equivalenti, NIL altrimenti.

Tabella 2

32 VBJ N. 77 - Settembre/Ottobre 2007
INTELLIGENZA ARTIFICIALE

Figura 3

piuttosto che alberi nelle popolazioni PG clas- come e quanto impegnativo e relativamente
siche: oneroso sia scrivere queste primitive. Il “pre-
mio finale” è comunque allettante.
(EQ(ST PA)PN)
Come procedere?
Ancora una volta la PG ha entusiasmato per
i risultati raggiunti, soprattutto per ciò che Per chi predilige la parte puramente tecni-
concerne la complessità delle soluzioni can- ca, arriveremo a costruire questa applicazio-
didate e per il fatto che tale complessità au- ne in C# per .NET Framework 2.0. L’ambiente
menti con l’evoluzione, piuttosto che rimane- di sviluppo usato sarà SharpDevelop 2.2, un
re prefissata come negli AG classici. Tuttavia IDE open source, scaricabile liberamente. Ad
le caratteristiche del LISP, che possono esse- ogni modo, andrà bene qualsiasi versione di
re considerate ottimali per le caratteristiche Visual Studio a vostra disposizione.
della PG, potrebbero rappresentare proprio Laddove sono presenti diagrammi UML, vi
una sua limitazione se trasposte in un altro segnalo che sono stati creati con Star UML,
linguaggio di programmazione. Questo pro- un Modeler open source.
blema potrebbe essere risolto scrivendo delle I dati per risolvere il problema (l’insieme del-
“primitive” ad hoc; il problema è di scrutare le informazioni e delle funzioni e l’obiettivo)

Listato 1

private void MescolaLettere()
{
for (int i = 0; i < _blocchiLettere.Length; i++)
{
int tempIdx = _mescolatore.Next(0, _blocchiLettere.Length);

string tmpStr = _blocchiLettere[tempIdx];
_blocchiLettere[tempIdx] = _blocchiLettere[i];
_blocchiLettere[i] = tmpStr;
}

}

VBJ N. 77 - Settembre/Ottobre 2007 33
INTELLIGENZA ARTIFICIALE

Figura 4

li abbiamo già. in ingresso 3 parametri:
Non resta che pianificare la progettazione
di questo software. - la lunghezza del programma
La nostra ipotesi di partenza è di vedere - l’insieme dei terminali
qual è il risultato che si può raggiungere, co- - l’insieme delle funzioni
struendo delle primitive in C# per risolvere
questo problema. Ciò è abbastanza semplice da intuire: la lun-
Funzioni e Terminali, specificati in questo ghezza del programma viene selezionata in
problema, non sono altro che funzioni. modo random, dal programma principale, così
L’ assunzione da cui si può partire, ossia la come l’insieme dei terminali e delle funzioni
più semplice, è di andare ad implementare ha già dimensioni predefinite. Ciò ci dice che
delle primitive molto semplici. Tuttavia, pri- ogni soggetto genererà il suo programma in
ma di effettuare questa operazione, sarà ne- modo autonomo. La prima operazione che il
cessario definire la classe che definisce il sog- costruttore esegue è un metodo privato, ossia,
getto della popolazione e le relative operazio- “MescolaLettere()”. Tale metodo ha l’effetto
ni per generare la popolazione. di effettuare il mescolamento dei blocchi che
compongono la parola UNIVERSAL.
La classe “soggetto” Ogni generazione, dunque, mescolerà i bloc-
e la classe “istruzioni” chi da impilare in modo diverso (Listato 1).
Il metodo successivo lanciato dal costrutto-
Prima di analizzare Attributi, Proprietà e Me- re si occuperà di generare il programma re-
todi della classe Soggetto e della classe Istru- lativo ad un determinato soggetto, con i pa-
zioni, vediamo i relativi Class Diagram per una rametri passati al costruttore. Naturalmen-
panoramica più generale (Figura 2 e 3): te, l’avvicendarsi tra terminali e funzioni è
Tralasciando attributi, proprietà e meto- regolato totalmente da generazioni random
di di ordine generale, andiamo ad analizza- (Listato 2).
re le caratteristiche più salienti della classe Noterete che il programma è un Array di
Soggetto. tipo Istruzioni. Nello specifico, la classe istru-
Iniziamo dai costruttori della classe. Il co- zioni consente di memorizzare dei parametri
struttore parametrico lo tralasciamo perché che sono, praticamente, dei terminali e/o fun-
più semplice. Per ciò che concerne il costrut- zioni. In tal modo, sarà possibile eseguire il
tore parametrico, troveremo che esso riceve flusso del programma senza troppe complica-

34 VBJ N. 77 - Settembre/Ottobre 2007
INTELLIGENZA ARTIFICIALE

Figura 5

zioni. Per ciò che concerne la classe istruzioni Strategie di definizione delle primitive
la sua implementazione è abbastanza sempli- all’interno della classe soggetto
ce, come avete potuto già constatare dal suo
class diagram. Probabilmente qualcuno si sarà posto la se-
Infine, il metodo “EseguiProgramma()” ese- guente domanda: “È possibile scrivere un AG,
gue il programma per il soggetto e produce nell’ambito della PG, che possa scrivere un
il risultato in termini di blocchi impilati, che programma corretto seguendo la logica della
rappresentano la soluzione che il programma scimmia che preme a caso i tasti su una ta-
stesso è riuscito a risolvere (Listato 3). stiera e compone un’opera letteraria?” I risul-
Come noterete, al verificarsi di alcune con- tati dicono che ciò è possibile.
dizioni, “EseguiProgramma()”, richiama altri Pur pensando o credendo che questi risul-
metodi al suo interno, che non sono altro che tati siano oltremodo oltraggiosi ed irriveren-
le primitive di cui avevamo bisogno. ti nei confronti di tutti i nostri anni di studio
Questa tematica verrà affrontata in modo più nel campo dell’ingegneria del software, non
approfondito, in quanto dall’ implementazio- è possibile ignorarli.
ne delle primitive dipende il successo di riso- Tuttavia, il progettista del software ha anco-
luzione del problema di pianificazione. ra un ruolo: definire le procedure attraverso le
quali la “scimmia” possa scrivere il program-

PUNTI DI FORZA PUNTI DI DEBOLEZZA
- Risparmio tempo sulla definizione delle primitive - La soluzione che raggiungo è completa solo al 89% circa
- Realizzo una soluzione comunque robusta

OPPORTUNITA’ MINACCE
- Arrivo ad una soluzione, per approssimazione, - I presupposti della mia progettazione mi portino su una
pressoché completa “strada sbagliata”

Tabella 3

VBJ N. 77 - Settembre/Ottobre 2007 35
INTELLIGENZA ARTIFICIALE

Listato 2

private void GeneraProgramma(string[] insiemeTerminali, string[] insiemeFunzioni)
{
_programma = new Istruzioni[_lunghezzaProgramma];
for (int i = 0; i < _programma.Length; i++)
{

int tmpSel = _selettoreTF.Next(0,2);

if (tmpSel == 1)
{
int tmpSelT = _selettoreT.Next(0, 2);
_programma[i] = new Istruzioni();
_programma[i].Istruzione = insiemeTerminali[tmpSelT];

}
else
{
_programma[i] = new Istruzioni();
int tmpSelF = _selettoreF.Next(0, 4);
_programma[i].Istruzione = insiemeFunzioni[tmpSelF];
if (_programma[i].Istruzione == “RF(espressione1, espressione2)”)
{
int tmpSelP1 = _selettorePar1.Next(0,1);
_programma[i].Parametro1 = insiemeFunzioni[tmpSelP1];
int tmpSelP2 = _selettorePar2.Next(0, 2);
_programma[i].Parametro2 = insiemeTerminali[tmpSelP2];
}

if (_programma[i].Istruzione == “NOT(espressione1)”)
{
int tmpSelP1 = _selettorePar1.Next(0, 1);
_programma[i].Parametro1 = insiemeFunzioni[tmpSelP1];

}

if (_programma[i].Istruzione == “EQ(espressione1, espressione2)”)
{
int tmpSelP1 = _selettorePar1.Next(0, 1);
_programma[i].Parametro1 = insiemeFunzioni[tmpSelP1];
int tmpSelP2 = _selettorePar2.Next(0, 2);
_programma[i].Parametro2 = insiemeTerminali[tmpSelP2];
}

}
}
}

ma o l’opera letteraria in modo corretto. perde e cosa si guadagna comportandosi così?
Un modo corretto e completo sarebbe di pro- Questo comportamento progettuale potrebbe
gettare un parser che ricostruisca il flusso del essere riassunto attraverso un quadro di ana-
programma in modo corretto. lisi S.W.O.T. (Tabella 3).
Nonostante ciò, le primitive possono essere Per non lasciare il lettore perplesso e, so-
costruite in modo molto più semplice, ma non prattutto, per dimostrarvi che il mio ragiona-
solo: il flusso può essere anche considerato mento presentato nel quadro S.W.O.T. non è
come lineare, cioè eseguendo il programma errato, vi mostrerò (solo in parte, per non ro-
dalla prima istruzione fino all’ultima. Cosa si vinarvi il finale) due condizioni, attraverso le

36 VBJ N. 77 - Settembre/Ottobre 2007
INTELLIGENZA ARTIFICIALE

Listato 3

public void EseguiProgramma()
{
int spostaBloccoDaTavolo = 0;
int spostaBloccoDaPila = 0;
int maxBlocchi = 8;
int minBlocchi = 0;
bool _scelta = true;

for (int i = 0; i < _programma.Length; i++)
{
...
if (_programma[i] == “SP(X)”)
{
SP(ref spostaBloccoDaTavolo, ref spostaBloccoDaPila, ref maxBlocchi);

}
if (_programma[i] == “ST(X)”)
{
ST(ref spostaBloccoDaTavolo, ref spostaBloccoDaPila, ref minBlocchi);

}
...
}
}

quali posso sapere che le “cose” sono andate, Condizione 2
tutto sommato, bene.
- popolazione max = 300 individui
Condizione 1 - fitness bersaglio da raggiungere = 9

Faccio girare il mio AG con questi parame- Tuttavia, come avevo già annunciato nel qua-
tri : dro S.W.O.T, nel voler raggiungere una fitness
bersaglio = 9, con una popolazione di n sog-
- popolazione max = 300 individui getto ho raggiunto dei risultati piuttosto scar-
- fitness bersaglio da raggiungere = 8 si (Figura 5).
Ho ottenuto una fitness pari a 6 ed i pro-
Nonostante le condizioni un po’ pretenziose, grammi sono stati accurati al 67% circa, os-
cioè popolazione esigua e fitness abbastanza sia, hanno impilato 6 blocchi su 9.
alta da raggiungere, questo è il risultato ot- Questo punto è importante, perché in questo
tenuto (Figura 4). modo, che in seguito potrete testare anche voi,
Ossia, in 3 epoche su 1.000 in cui il program- so già che il mio programma è in grado di rag-
ma ha ciclato, ho ottenuto un certo numero giungere sempre un’accuratezza, al minimo,
di soggetti che hanno realizzato un program- del 89% circa. Cercheremo, naturalmente, in
ma che si è avvicinato alla soluzione di circa seguito di migliorare questa prestazione.
il 89%, cioè i programmi relativi ad ogni sog- Ora, se vi rivelassi che ho raggiunto questi
getto hanno impilato 8 blocchi su 9 corretta- risultati implementando due sole primitive,
mente. Non male direi. ci credereste?
Beh! Dovete crederci perché è proprio così.

VBJ N. 77 - Settembre/Ottobre 2007 37
INTELLIGENZA ARTIFICIALE

Listato 4

private void SP(ref int spostaBloccoDaTavolo,ref int spostaBloccoDaPila,ref int maxBlocchi)
{
if (spostaBloccoDaTavolo < maxBlocchi)
{
_blocchiDaImpilare[spostaBloccoDaPila] = _blocchiLettere[spostaBlocco
DaTavolo];
spostaBloccoDaPila++;
spostaBloccoDaTavolo++;
}
}
private void ST(ref int spostaBloccoDaTavolo,ref int spostaBloccoDaPila,ref int min
Blocchi)
{
if (spostaBloccoDaPila > minBlocchi)
{
_blocchiDaImpilare[spostaBloccoDaPila] = “”;
spostaBloccoDaPila--;
spostaBloccoDaTavolo--;
}
}

Come mai? formance globale di tutto l’algoritmo rispet-
Per inciso, a mio avviso, le primitive più im- to alle primitive delineate, per vedere se, e
portanti sono quelle che riguardano lo spo- soprattutto quanto, ci siamo avvicinati al no-
stamento dei blocchi dal tavolo e, successi- stro obiettivo.
vamente, vengono impilati per formare la pa-
rola UNIVERSAL. Due di queste, tra quelle Bibliografia
che troverete nel codice sorgente, sono SP()
e ST() (Listato 4). [1] Genetic Programming Foundation – “http:
Per fare una digressione sulla “scimmia”, //www.geneticprogramming.org”
menzionata precedentemente, i risultati rag- [2] Fabio Fabozzi – “Predizione di flussi dati in
giungibili sono molto alti, seppur semplifica- sistemi caotici attraverso gli algoritmi ge-
ti. Nonostante la nostra ricerca in questo ar- netici”, Computer Programming, Febbraio
ticolo sia focalizzata sullo scrivere delle pri- 2006, Gruppo Editoriale Infomedia
mitive in C#, che emulino il comportamento [3] Fabio Fabozzi – “Intelligenza Artificiale con
delle primitive in LISP, in realtà il meccani- Visual Basic”, Dicembre 2004, Gruppo Ed-
smo più grande lo gioca proprio l’ AG stesso. itoriale Infomedia, ISBN 8881500183
Naturalmente, se le primitive sono progetta- [4] Fabio Fabozzi – “Programmazione Genetica
te ed implementate bene, allora tutto andrà in Visual Basic”, VBJ n°50, Marzo/Aprile
“per il verso giusto”. 2003, Gruppo Editoriale Infomedia
[5] Melanie Mitchell – “Introduzione agli Al-
Conclusioni goritmi Genetici”, Apogeo Scientifica, 1998,
ISBN 8873035000
In questa prima parte abbiamo analizzato [6] Kenneth Lange – “Mathematical and
alcune tematiche per risolvere questo pro- Statistical Methods for Genetic Analysis”
blema. I primi risultati sono stati abbastan- Springer, 1997, ISBN 0387949097
za promettenti. [7] Ilya Prigogine – “Le Leggi del Caos”,
Nella seconda parte analizzeremo la per- Laterza Editore

38 VBJ N. 77 - Settembre/Ottobre 2007
OFFICE

Creare un controllo
utente tramite Visual
Studio Tools for Office
In questo articolo vedremo come creare un controllo personalizzato in am-
biente Office utilizzando la tecnologia .NET

di Emanuele Mattei

Con questo articolo proseguiamo la programma- A questo punto viene aperto
zione Microsoft Office 2003 tramite Visual Studio l’ambiente di sviluppo con l’in-
Tools for Office, iniziata in precedenza. In partico- terfaccia simile ad un documen-
lare vedremo come aggiungere un controllo perso- to Word (come illustrato nel pri-
nalizzato per la formattazione del testo in Microsoft mo articolo); dal menu di scelta
Word 2003. Il controllo avrà il compito di impostare rapida (tasto destro del mouse
il testo nel documento con la formattazione di tipo sul nome della soluzione appe-
grassetto, corsivo o di colore rosso. na creata) selezionare la voce di
menu “controllo utente”, situa-
Aggiunta del controllo ta sotto la voce “aggiungi” (Fi-
Si crea un nuovo progetto per Office selezionan- gura 1).
do nella finestra dei modelli di Visual Studio 2005 Verrà aperta una finestra, (Figu-
il modello denominato “Documento di Word”; verrà ra 2) in cui è possibile impostare
aperta una finestra che chiede se creare un nuovo il nome del controllo utente (es.
documento o utilizzarne uno esistente, nel nostro UserFormattazione); dopo aver
caso si crea un nuovo documento. impostato il nome e cliccato sul
pulsante “Ok” della finestra, ver-
Emanuele Mattei è sviluppatore presso una società d’infor- rà inserito nel progetto un user-
matica di Roma. Attualmente collabora con altri webmaster control. Inserite tre controlli che-
al sito www.shareoffice.it il primo usergroup italiano dedicato ckbox, ed impostate le proprie-
alla programmazione di office, tramite la tecnologia .NET. Può
tà “Name” rispettivamente con il
essere contattato all’indirizzo email emattei@infomedia.it
valore “chkgrassetto”, con il va-

40 VBJ N. 77 - Settembre/Ottobre 2007
OFFICE

lore “chkcorsivo” e l’ultimo con il
valore “chkrosso”, mentre per la
proprietà “text”, impostate per il
primo il valore “Grassetto”, il se-
condo con il valore “Corsivo” ed il
terzo con il valore “Rosso”. L’aspet-
to del controllo dev’essere simile a
quello mostrato in Figura 3.

Stesura del codice
Dopo aver predisposto con le do-
vute formattazioni il nostro user
control, facciamo doppio click
sul controllo checkbox, denomi-
nato “chkgrassetto”, in modo da
passare in visualizzazione codi-
ce, e più precisamente nell’even-
Figura 1 La voce di menu controllo utente per inserire il
to CheckedChanged del controllo controllo
selezionato.
Questo evento viene eseguito nel
C#
momento in cui si fa click sul controllo che-
ckbox, per mettere o togliere la spunta dalla //se il checkbox è spuntato rendo il testo
casella. In tale evento inseriamo il codice che (i primi 5 caratteri) in grassetto
permette di impostare il testo (in modo gra-
duale) in grassetto. In particolare tramite la if (chkGrassetto.Checked ==
proprietà Font della proprietà Characters im- CheckState.Checked)
postiamo le dovute formattazioni al testo, in {
questo caso in grassetto tramite la proprietà for (int i = 1; i <= 5; i++)
“bold”. Il codice dev’essere simile a quello {
riportato qui di seguito. Globals.ThisDocument.Characters[1].
Font.Bold = true;
VB.NET }
‘se il checkbox è spuntato rendo il testo }
(i primi 5 caratteri) in grassetto else //tolgo il grassetto dal testo
If chkGrassetto.Checked = CheckState.Checked {
Then for (int i = 1; i <= 5; i++)
For i As Integer = 1 To 5 {
Globals.ThisDocument.ActiveWindow. Globals.ThisDocument.Characters[1].
Document.Characters(i).Font.Bold = True Font.Bold = false;
Next }
Else ‘tolgo il grassetto dal testo }
For i As Integer = 1 To 5
Globals.ThisDocument.ActiveWindow. Con lo stesso metodo è possibile rendere il
Document.Characters(i).Font.Bold = False testo in corsivo (oppure sottolineato o barra-
Next to, ecc.) semplicemente sostituendo la pro-
End If prietà appropriata (ad esempio Italic) alla
proprietà Bold.

VBJ N. 77 - Settembre/Ottobre 2007 41
OFFICE

Figura 2 La finestra di dialogo per impostare il nome del controllo utente

For i As Integer = 1 To 5
I controlli personalizzati Globals.ThisDocument.ActiveWindow.
possono aiutare il pro- Document.Characters(i).Font.Color =

grammatore ad ampliare Next
Word.WdColor.wdColorRed

la vasta gamma della Else ‘tolgo il grassetto dal testo

classi e controlli forniti da For i As Integer = 1 To 5
Globals.ThisDocument.ActiveWindow.
Microsoft Visual Studio Document.Characters(i).Font.Color =

Tools for Office Word.WdColor.wdColorAutomatic
Next
End If
Ritorniamo in visualizzazione designer, e fac-
C#
ciamo doppio click sul terzo ed ultimo con-
trollo checkbox, quello per l’impostazione del //se il checkbox è spuntato rendo il testo
colore del testo. Tramite la sotto-proprietà Co- (i primi 5 caratteri) in rosso
lor della proprietà Font, possiamo impostare if (chkRosso.Checked == CheckState.Checked)
il colore del carattere. Di seguito si riporta un {
esempio di codice per impostare i primi 5 ca- for (int i = 1; i <= 5; i++)
rattere di colore rosso. {
Globals.ThisDocument.Characters[1].
VB.NET Font.Color = Word.WdColor.wdColorRed;
‘se il checkbox è spuntato rendo il testo }
(i primi 5 caratteri) in rosso }
If chkRosso.Checked = CheckState.Checked Then else //tolgo il grassetto dal testo

42 VBJ N. 77 - Settembre/Ottobre 2007
OFFICE

Figura 3 L’aspetto del controllo utente
che stiamo realizzando

{
for (int i = 1; i <= 5; i++)
{
Globals.ThisDocument.Characters[1].
Font.Color = Word.WdColor.wdColorAutomatic;
}
}

Una volta scritto il codice occorre compila-
re: dal menu “Genera” selezioniamo la voce
di menu “Genera soluzione”; se apriamo il
progetto VSTO troviamo nella barra degli
strumenti il nostro usercontrol appena crea-
to, come mostrato in Figura 4.

Esecuzione del codice
A questo punto occorre verificare ed eseguire
il nostro progetto; restando in visualizzazione
Word, digitiamo nel documento la parola “Pro- Figura 4 La barra degli strumenti con il controllo
utente personalizzato
va” ed al termine facciamo doppio click sul pul-
sante invio della tastiera, a questo punto inse-
riamo il nostro user control. re in un progetto per Microsoft Office 2003 un
Fatto ciò, tramite il menu “debug” selezionia- controllo personalizzato, un semplice controllo
mo la voce “Avvia debug” (oppure direttamen- per la formattazione del testo. L’articolo ha volu-
te con il pulsante F5 della tastiera) verrà aperto to introdurre il lettore alla creazione di controlli
un documento Microsoft Word con il controllo personalizzati in ambiente Microsoft Office 2003;
personalizzato: se facciamo click nei vari che- i controlli personalizzati possono aiutare il pro-
ckbox il testo inserito precedentemente verrà grammatore ad ampliare la vasta gamma della
formattato. classi e controlli forniti da Microsoft Visual Stu-
dio Tools for Office. Sul sito FTP di Infomedia
Conclusioni (ftp://ftp.infomedia.it/pub/VBJ/Listati/) trovate il
In questo articolo abbiamo visto come inseri- codice sorgente dell’applicazione.

VBJ N. 77 - Settembre/Ottobre 2007 43
OFFICE

Utilizzare una
fonte dati da VSTO

In questo articolo vedremo come creare uno Smart Tag in ambiente Office
utilizzando la tecnologia .NET

di Emanuele Mattei

In questo articolo vedremo come collegare una • reparto, di tipo testo;
fonte dati – più precisamente un database creato
con Microsoft Access 2003 – ad un foglio di Excel, • piano, di tipo numero.
utilizzando la tecnologia Visual Studio Tools for Of-
fice, in modo del tutto visuale. La tabella Prodotto avrà quat-
tro campi:
Creazione della base dati
Ai fini del nostro esempio, si crei un nuovo da- • idprodotto, di tipo contatore
tabase in Microsoft Access, con le tabelle Settore e chiave,
e Prodotto.
Nella tabella Settore si creino quattro campi: • idsettore, di tipo numerico ed
in relazione con il campo id-
• idsettore, di tipo chiave e contatore; settore della tabella Settore;

• descrizione, di tipo testo; • prezzo, di tipo valuta (euro);

• nome, di tipo testo.
Emanuele Mattei è sviluppatore presso una società d’infor-
matica di Roma. Attualmente collabora con altri webmaster Una volta create le tabelle e le
al sito www.shareoffice.it il primo usergroup italiano dedicato relazioni, e valorizzate con i dati,
alla programmazione di Office, tramite la tecnologia .NET. Può
possiamo passare a Visual Stu-
essere contattato all’indirizzo email emattei@infomedia.it
dio 2005.

44 VBJ N. 77 - Settembre/Ottobre 2007
OFFICE

Creazione del progetto e
collegamento al database
Si apra Visual Studio 2005, dal
menu File selezioniamo Nuovo pro-
getto, nella parte indicante i tipi di
progetto selezioniamo Office, e tra
i modelli messi a disposizione sele-
zioniamo quello con la voce Cartel-
la di Lavoro Excel. Nella finestra
ci verrà chiesto se vogliamo crea-
re un nuovo documento o copiarne
uno esistente, lasciamo l’opzione
su Crea nuovo documento.
Verrà aperto l’ambiente di svilup-
po con l’interfaccia di Microsoft
Excel, dal menu selezioniamo la
voce dati, e poi la voce Aggiungi
nuova origine dati. Nella finestra
Figura 1
che viene aperta (Figura 1) sele-
zionare la voce Database, fate cli-
ck sul pulsante Avanti. Nella fine-
stra successiva fate click sul pulsante Nuova sta che fare click sul pulsante Test connessio-
connessione, e dalla finestra che viene aperta ne per verificare che tutto sia corretto e poi
(Figura 2) selezionare come origine dati il file sul pulsante Ok.
database Microsoft Access, mentre tramite il A video verrà visualizzato un messaggio che
pulsante Sfoglia ricercare il database Access ci chiede se vogliamo salvare una copia del
creato in precedenza; a questo punto non re- database nella cartella output, selezioniamo il
pulsante Si, per avere tutti i file in un’uni-
ca cartella.
Nella finestra successiva verranno visua-
lizzate le tabelle del nostro database; se-
lezionare la tabella Settore e selezionarne
tutti campi, mentre per la tabella Prodotti
selezioniamo tutti i campi Prezzo ad esclu-
sione del campo IdProdotto, come mostrato
in Figura 3. A questo punto fate click sul
pulsante Fine.

Impostare l’ambiente
Al termine del wizard, nella barra origini
dati troveremo un dataset, contenente due
tabelle; selezioniamo il campo descrizione
della tabella Settore; nella casella di riepilo-
go selezioniamo l’impostazione combo-box,
e trasciniamo il controllo nel foglio Excel.
Due righe sotto, scriviamo nella prima co-
Figura 2
lonna (cella A8) il testo “Nome prodotto”
e nella successiva cella (B8) trasciniamo,

N. 77 - Settembre/Ottobre 2007 VBJ 45
OFFICE

quello mostrato in Figura 4.
Così ad ogni cambiamento nella
combo-box, verranno modificati i
valori degli altri campi.

Effettuare delle prove
Dopo aver impostato i vari cam-
pi, non resta che eseguire il pro-
getto, tramite il pulsante F5: avvia-
mo il programma, e nel selezionare
le varie voci della combo-box, ve-
dremo cambiare i valori nelle va-
rie caselle.

Conclusioni
In questo breve articolo abbiamo
visto come tramite la tecnica del
Figura 3
data binding si possono gestire i
dati di un database in un foglio
Excel senza ricorrere alla stesura
dalla barra Origine dati, la casella denomina- di codice. Le funzionalità offerte
ta “Nome della tabella prodotto”, situata sot- dal nuovo ambiente di sviluppo Visual Studio
to la tabella Settore; nella successiva colonna Tools per Office permettono agli sviluppatori
(cella C8) scriviamo il testo “Prezzo” e nel- di creare potenti applicazioni per il pacchetto
la successiva cella di destra (D8) inseriamo, Microsoft Office 2003 con semplicità. Sul sito
dalla barra origine dati, il campo Prezzo della ftp di Infomedia (ftp://ftp.infomedia.it/pub/)
tabella Prodotto. L’aspetto dev’essere simile a trovate il codice sorgente dell’applicazione.

Figura 4

46 VBJ N. 77 - Settembre/Ottobre 2007
Prodotti & News

È online l’osservatorio sulla Antec presenta una nuova Serena migliora il Change
sicurezza informatica linea di prodotti Management
a risparmio energetico
È on-line da Ottobre il sito internet Serena Software ha presentato
dell’Osservatorio Nazionale per la La certificazione 80 PLUS® è un inno- Serena® Dimensions® Express™,
Sicurezza Informatica. vativo programma nord americano di strumento SCM (software configu-
L’indirizzo è www.osservatoriosicurezza incentivi che ha lo scopo di integrare i ration management) leggero per
informatica.org e sarà uno strumento computer da tavolo e i server con ali- sviluppatori, con caratteristiche pre-
in più che l’Osservatorio metterà a mentatori più efficienti dal punto di stazionali e funzionali pacchettizzate
disposizione di aziende, navigatori, vista del consumo energetico. Infatti, in modo tale da facilitarne l’utilizzo
giornalisti, per conoscere meglio le la maggior parte degli alimentatori ha e la messa in produzione. È basato
questioni inerenti alla sicurezza in- un’efficienza massima del 60-70%, e sulla tecnologia Serena Dimensions
formatica, alla tutela della privacy perde dal 30% al 40% dell’energia che 10 che ne facilita l’implementazione
on line, alla sicurezza nelle comu- consuma. La certificazione 80 PLUS® e l’adozione rapida.
nicazioni cellulari e wifi, alle truffe invece assicura un’efficienza minima Gli sviluppatori, in particolare i team
che utilizzano internet. pari all’80%, riducendo almeno della di sviluppo piccoli e agili, devono po-
metà la dispersione di energia e fa- tere trovare un equilibrio tra imple-
“Il nostro Osservatorio è attivo da cendo così risparmiare sui costi della mentazione rapida e usabilità da un
ormai un anno ed ha ottenuto non bolletta elettrica, della manutenzione lato, e controllo e gestione dall’altro:
pochi riconoscimenti al proprio del computer e del raffreddamento. Serena Dimensions Express risponde
lavoro. Abbiamo messo a dispo- I nuovi case di Antec costituiscono a queste esigenze.
sizione dei media e dei cittadini dunque un ottimo punto di parten- Dimensions Express fornisce capacità
importanti dati ed informazioni, za per la realizzazione dei sistemi di livello enterprise senza penalizzare
contribuendo a sensibilizzare gli conformi al programma statunitense la facilità d’uso. Gli utenti hanno i
utenti delle nuove tecnologie e Energy Star 4. vantaggi del supporto nativo del-
quindi prevenire tentativi di truffa Per maggiori informazioni sul pro- la piattaforma per il repository o
o di incursione nei sistemi infor- gramma Energy Star dell’UE, visitare workspace che preferiscono, del-
matici di aziende e privati. – ha il sito l’integrazione nativa con gli IDE più
dichiarato Mirko Gatto della Yarix www.eu-energystar.org/it/index.html importanti e di una terminologia
srl – Inseriremo sul nostro sito gli coerente e standard. L’integrazione
interventi ed i dati delle nostre I modelli della serie New Solutions IDE è profonda, ma non invasiva. Gli
ricerche che saranno a disposizione che sono stati aggiornati includo- strumenti di Configuration Manage-
gratuitamente, costituendo piano no: NSK1380, NSK1480, NSK2480, ment e di controllo delle versioni di
piano una vera banca dati on-line NSK3480, NSK4480, NSK4480B cui gli sviluppatori hanno bisogno
che potrà fornire una informazione (nero) e NSK6580. Il NSK1380, un sono parte integrante dell’interfaccia
corretta sui vari aspetti legati alla case microATX dal design estrema- IDE. Mentre gli sviluppatori appor-
sicurezza informatica. mente compatto, può essere utilizza- tano variazioni al codice sorgente,
to sia come computer da tavolo che Dimensions Express traccia, autentica
Ad esempio uno degli ultimi studi come postazione mobile per giochi. e gestisce il controllo delle versioni
che abbiamo divulgato, sui ten- Il NSK2480 è un case microATX così che, in caso di necessità, possano
tativo di incursione provenienti per computer da tavolo, mentre il tornare facilmente alla configurazio-
dalla Cina per inserirsi sui segreti NSK1480 è un case per media center ne precedente.
aziendali di imprese italiane, ha di fascia economica. Il NSK3480 è Gestire i team di sviluppo e le va-
permesso a molti di conoscere una mini torre per PC da tavolo equi- riabili di progetto è molto difficile,
questo fenomeno e di correre ai paggiato per schede madri microATX. virtualmente impossibile senza stru-
ripari per non essere più esposti Infine i modelli NSK4480, NSK4480B menti adeguati. Il supporto completo
al rischio. In questo modo abbiamo e NSK6580 offrono gli standard di un allo sviluppo in parallelo reso possi-
contribuito concretamente a far case ATX, in piccolo e medio formato. bile da Dimensions Express elimina
crescere la consapevolezza di molti L’intera gamma di case New Solution le complessità, in quanto fornisce
imprenditori.”. è dotata di alimentatori certificati 80 branching e merging a livello di item
PLUS®, ed è già disponibile presso e di progetto.
Sul sito saranno attivati nei pros- i maggiori rivenditori, e-tailer e di- Dimensions Express è fatto per essere
simi mesi anche alcuni servizi per stributori, ad un prezzo che va dai implementato e messo in produzione
i navigatori: fin da subito è pos- 49,00€ ai 114,00€. Antec fornisce in modo veloce e facile. La confi-
sibile attraverso il sito segnalare una garanzia di qualità di 3 anni sia gurazione out-of-the-box segue un
casi “dubbi” di phishing: gli esperti ai prodotti che a tutti gli accessori. modello di processo testato e basato
del’Osservatorio risponderanno in Per ulteriori informazioni visitare il su best practice. I clienti possono
breve tempo a tutti. sito www.antec.com. implementare il prodotto con assi-

48 VBJ N. 77 - Settembre/Ottobre 2007
Prodotti & News

stenza remota all’installazione o con traccia dal vivo. Inoltre, la Samplitu- Paesi Bassi, Belgio, Francia, Spagna;
consulenza on-site, per un servizio de Playback Engine, rende possibili Chart Track UK; NPD Data Charts
più completo e personalizzato. delle azioni che necessitano un alto PC/CD-ROM non-games USA. Gen-
Gli sviluppatori vogliono strumenti rendimento del sistema come l’ap- naio-Luglio 2007.
con le migliori prestazioni e Dimen- plicazione degli effetti agli oggetti.
sions Express è all’altezza delle aspet- Samplitude Music Studio 2008 offre FileMaker lancia un nuovo
tative: è costruito su una architettura poi una totale neutralità del suono,
altamente scalabile con prestazioni caratteristica tipica delle console sito web per il settore
senza precedenti in reti LAN e WAN. high-end analogiche. Education
Spesso le aziende hanno bisogno di Samplitude Music Studio 2008 non
un approccio evolutivo e incremen- lascia soli gli user che non dispongo- FileMaker, Inc., produttore del po-
tale per implementare l’Applica- no di strumenti analogici: ai cinque polare software database FileMaker
tion Lifecycle Management (ALM). Vital instruments di Yellow Tool già Pro, ha realizzato un nuovo micro-
Dimensions Express fornisce un inclusi, si aggiungono adesso i nuovi sito Education (www.filemaker.it/
elemento centrale dell’ALM – il sof- “E-Guitar”, “Power Chords”, “Electric- education) per aiutare docenti,
tware di Configuration Management Guitar” e le “Soundtrack Percussion”. studenti, ricercatori e personale
avanzato - come capacità standalone. Questi possono essere suonati con la scolastico-amministrativo a gestire
Le aziende possono quindi far fronte tastiera del PC o quella MIDI produ- efficacemente i propri dati e le in-
a esigenze immediate e allo stesso cendo un suono assolutamente neu- formazioni.
tempo essere pronte ad assumere un trale. Gli strumenti virtuali a corda Presente nel settore Education da
approccio più olistico e completo in e i fiati sono degni di una grande oltre 20 anni, FileMaker si adatta ai
caso di future necessità. orchestra. Il nuovo sintetizzatore bisogni e alle esigenze di ciascuno dei
Dimensions Express è già disponibile. analogico polifonico “Revolta 2” crea suddetti soggetti del mondo scolasti-
Maggiori informazioni sono disponi- tutti i suoni adeguati a tutti i tipi di co sviluppando soluzioni specifiche
bili al sito www.serena.com. musica elettronica. quali, ad esempio, il Campus Produc-
L’automazione migliorata degli effetti tivity Kit, appositamente studiato per
permette di ottimizzare i parametri gli studenti.
Samplitude Music Studio
VST, volume e panorama, attraverso Sono centinaia gli insegnanti e i
2008: Home-Recording il disegno diretto della curva del- direttori scolastici che quotidiana-
professionale l’automazione sulla traccia. Questa mente utilizzano FileMaker Pro per
funzione può essere utilizzata, per raccogliere le informazioni sugli stu-
I prodotti della serie Samplitude di esempio, per controllare l’eco in denti, organizzare le proprie lezioni o
MAGIX si distinguono per la qualità un luogo preciso. Gli strumenti VST gestire progetti e materiale a propria
del suono e le numerose opzioni per multicanale, che possono scrivere i disposizione.
l’elaborazione Audio & MIDI. Alla già MIDI-Events su fino a 16 canali, sono All’interno del nuovo micro-sito
ampissima gamma di prodotti, si ag- compatibili con il VST Multiout. dedicato, FileMaker offre numerose
giunge ora Samplitude Music Studio Il Cotroller-Hardware, infine, garanti- risorse centralizzate volte a supporta-
2008. Il nuovo nato della famiglia sce un effetto studio perfetto. re chi opera nel mondo della Scuola,
Samplitude stupirà il pubblico con MAGIX non si dimentica nemmeno siano essi utenti esperti oppure prin-
tante nuove funzioni: Hybrid Audio di coloro che iniziano solo adesso cipianti, ad ottimizzare l’utilizzo del
Engine, modalità di lavoro orientata ad utilizzare Music Studio. Grazie ai proprio software database FileMaker.
all’oggetto, registrazione multitrac- nuovi elementi di controllo e alle
cia, nuovi strumenti Vital ed automa- diverse modalità di visualizzazione, Tra le nuove risorse, FileMaker lancia
zioni per gli effetti. Samplitude Music è molto semplice trovare cìò che si una newsletter a cadenza trimestra-
Studio 2008 è disponibile nei migliori sta cercando. Con le pratiche cinque le.
negozi a soli 99,99 €. preconfigurazioni di divisione dello Oltre a presentare le ultime novità
schermo, lo user non perderà mai la di prodotto, consigli e suggerimenti
Il nuovo motore del software di panoramica sul progetto; se poi ne- ed offerte speciali, le newsletter
produzione musicale più venduto* cessitasse di aiuto per le proprie pro- FileMaker Education proporranno
unisce tutte le fasi del lavoro in un’ duzioni musicali, trova le risposte e le la testimonianza di diversi attori del
unica interfaccia: dalla registrazione soluzioni nella nuova infoCommunity sistema scolastico che hanno voluto
all’arrangiamento, l’elaborazione, il multimediale alla quale si accede di- trasmettere e condividere la propria
mixaggio, per terminare con la ma- rettamente dal programma. esperienza di utilizzo del software
sterizzazione. FileMaker nelle proprie attività quo-
Questo motore offre una latenza * Si riferisce ai prodotti software tidiane.
minima con massimo rendimento. I venduti al dettaglio secondo il rile- L’iscrizione alla newsletter FileMaker
brevi tempi di calcolo degli effetti vamento mensile di Media Control Education è gratuita e può essere
della traccia facilitano, per esempio, Germania (PC/CD-ROM non-games D effettuata all’indirizzo
il controllo della registrazione multi- secondo i criteri del VUD); GfK Chart www.filemaker.it/education

N. 77 - Settembre/Ottobre 2007 VBJ 49
.NET TOOLS
VS. Net 2005 & C++ & Refactoring
Refactor! per C++ Come accennato, la mancanza di un supporto al
Visual Studio .NET 2005 refactoring per i progetti C++ è apparso striden-
di Raffaele Di Natale te a tanti: un disallineamento inaspettato. Come
è stato evidenziato in altre occasioni [2], la Micro-
Un add-in indispensabile per effettuare il soft, in questi casi di “assenza di soluzione”, è so-
Refactoring di progetti C++ in ambiente lita consigliare nei propri siti tool gratuiti presenti
VS.NET 2005 sul mercato. Così, anche in questo caso, all’indiriz-
zo [3] Microsoft suggerisce l’utilizzo di Refactor!
“Refactor!” è stata con ogni probabilità l’escla- riassumendone le funzionalità con annessa spie-
mazione di tanti programmatori che, lavorando ad gazione del perché di questo approccio.
un progetto in C#, hanno riscontrato la presenza
di una serie di funzionalità di refactoring integra- Download ed installazione
ta nell’IDE. Successivamente, gli stessi program- Refactor! si presenta come un add-in per Visual
matori, passati poi ad un progetto C++ nel me- Studio .Net 2005. Può essere scaricato gratuita-
desimo IDE, si sono domandati “Refactor?”. Sì, mente dal sito [4] e successivamente installato.
perché con grande sorpresa il bel menu che cam- L’effettivo successo dell’installazione sarà evi-
peggiava prima nel progetto C# è sparito una vol- denziato sia dalla presenza del logo del tool nel-
ta aperto quello C++. lo splash-screen di avvio di Visual Studio, sia ac-
cedendo all’Add-in Manager (menu Tools/Add-in
Introduzione Manager) di VS.
Citando Martin Fowler [1], uno dei massimi
esperti in questo ambito, il refactoring è una tec- La famiglia Refactor!
nica utilizzata per migliorare il design di una base Refactor! per C++ appartiene ad una suite di
esistente di codice. La sua essenza consiste nel- applicazioni denominate IDE Productivity Tools
l’applicazione di una serie di piccole trasformazio- sviluppata da Developer Express [5] e pensata per
ni che, preservando comunque il comportamento il refactoring di progetti in ambiente Visual Stu-
dell’applicazione, non risultano singolarmente im- dio .NET 2005. Alla versione per C++ si aggiun-
portanti. Tuttavia l’effetto cumulativo di ciascuna gono quella per ASP .NET e per Visual Basic. Ol-
di queste trasformazioni è abbastanza significati- tre alle suddette versioni gratuite sono disponi-
vo per l’intero progetto. Inoltre, l’applicazione di bili le più complete versioni Pro, a pagamento.
tecniche di refactoring consente di ristrutturare Refactor! non può essere installato nelle versio-
il progetto software pur garantendo la sua con- ni Express Edition di Visual Studio.
sistenza. È vero però che il refactoring manuale
e non assistito potrebbe farci incappare in errori Refactoring Pattern
ed è per questo che risulta quasi indispensabile Il refactoring o, in altre parole, il consolidamen-
avere a disposizione un tool che in maniera au- to del codice esistente, è un’attività basata su pic-
tomatica estende su tutto il progetto i piccoli ag- cole operazioni di “lifting” del codice. Così come
giustamenti che apportiamo. l’applicazione di tecniche e modelli nello svilup-
po del codice ha portato alla definizione dei “De-

50 N. 77 - Settembre/Ottobre 2007
.NET TOOLS

pi di categorie di refactoring
pattern, con relativo refacto-
ring pattern e riferimento alla
funzionalità del tool:

§ Composing Methods, tra cui
RefactoringExtractMethod (Ex-
tract Method di Refactor!);

§ Organizing Data, tra cui Re-
factoringEncapsulateField (En-
capsulate Field di Refactor!);

In Tabella 1 sono presenti le
funzionalità di refactoring di
Refactor! con relativa descri-
Figura 1 Il menu “Refactor” standard di Visual Studio .Net 2005 zione. Per un completo ed ag-
giornato elenco di Refactoring
Pattern, si consiglia una lettura
del sito [6], mentre per una det-
sign Pattern”, allo stesso modo nell’ambito del re- tagliata lista di tool di refactoring per tutti i lin-
factoring si sono affermate delle tecniche poi rag- guaggi di programmazione visitate [7].
gruppate sotto il nome di “Refactoring Pattern”.
È chiaro che, per ovvie ragioni, un tool di refacto- Confronto col refactoring standard
ring che si rispetti deve per forza confrontarsi con VS.NET 2005
tali pattern. Ovviamente non tutti i pattern de- In Figura 1 è possibile osservare il menu rela-
vono per forza essere gestiti, ma di certo un tool tivo alle funzioni di Refactor! per progetti C# in
deve garantire un supporto per quelli più utiliz- ambiente VS.NET 2005. Le funzionalità suppor-
zati ed efficaci. Di seguito si elencano due esem- tate sono:

Refactoring Descrizione
Add Block Delimiters Inserisce {} in corrispondenza di un’istruzione
Case to Conditional Trasforma una sequenza di case ad una di if
Conditional to Case Effettua l’operazione inversa alla precedente
Create Overload Crea un overload per il metodo selezionato
Encapsulate Field Incapsula un campo esponendolo mediante get/set
Extract Function (outside of class) Estrae una funzione all’esterno di una classe
Extract Method Crea un metodo della classe a partire dal blocco di codice selezionato.
È possibile inoltre fissarne la posizione all’interno della classe.
Introduce Constant Introduce una costante
Move Method to Header Sposta il metodo nell’header
Move Method to Source File Sposta il metodo nel file sorgente
Remove Block Delimiters Rimuove le {} nei casi non necessari
Rename Rinomina un oggetto, una funzione, un metodo
Reorder Parameters Riordina i parametri
Reverse Conditional Inverte la logica di una condizione e scambia il blocco if con il blocco else
Simplify Expression Semplifica un’espressione che fa uso
Widen Scope Promuove una variabile locale a variabile membro

Tabella 1 Funzioni di refactoring di Refactor! per C++

N. 77 - Settembre/Ottobre 2007 VBJ 51
.NET TOOLS

factoring corrente (ad
esempio la semplifica-
zione di un’espressio-
ne, oppure l’estrazio-
ne di un metodo), sen-
za però risultare mac-
chinoso. La regola per
utilizzare al massimo
Refactor! è molto sem-
plice: bisogna pensa-
re a quale refactoring
applicare e di conse-
guenza quale porzione
di codice dovrà esse-
re influenzata da tale
cambiamento. Succes-
sivamente, la sempli-
ce pressione del tasto
destro del mouse sul
codice selezionato ci
permetterà di accede-
re alla voce di menu
“Refactor!” che elen-
Figura 2 Estrazione di un metodo mediante Refactor!
cherà i refactoring di-
sponibili per la sele-
zione in corso.

Un esempio
1. Rinominare una funzione, una variabile…
2. Estrazione di un metodo; Un’applicazione interessante di Refactor! è sen-
3. Incapsulamento di un campo pubblico; za dubbio l’estrazione di un metodo a partire da
4. Estrazione dell’interfaccia; un blocco di codice esistente. In Figura 2 si può
5. Promozione di una variabile locale a parame- notare come, in seguito alla pressione del tasto
tro; destro del mouse in prossimità di un blocco di
6. Rimozione di parametri; codice precedentemente selezionato (che si vuo-
7. Ordinamento dei parametri. le spostare a livello di funzione membro di una
classe), venga suggerito il nome della funzione e
Da un semplice confronto con la Tabella 1 si può i rispettivi parametri; successivamente, sarà pos-
notare che, ad eccezione della 4 e della 6, tutte le sibile stabilire la posizione della funzione all’in-
voci sono supportate anche da Refactor! terno della dichiarazione della classe.

Refactor! e l’IDE VS.NET 2005 Conclusioni
Refactor! per C++ è perfettamente integrato I tempi stringenti nella consegna di progetti sof-
nell’ambiente VS.NET 2005 e l’utilizzo richia- tware, ovvero ritardi negli stati di avanzamento
ma per molti aspetti quello standard dei proget- dovuti ai problemi più disparati, portano spesso i
ti C#. Rispetto a quest’ultimo, Refactor! usa un programmatori a scrivere codice efficace e maga-
po’ di grafica in più per facilitare le scelte del- ri non eccessivamente “pulito”. Un progetto che
l’utente, mostrando in anteprima l’effetto del re- deve essere gestito per più anni, e non quindi un

52 VBJ N. 77 - Settembre/Ottobre 2007
.NET TOOLS

software “usa e getta”, merita ripetute sessioni di
refactoring tra una release e l’altra. Avere oggi a Internet Explorer
disposizione tool come Refactor! che ci permette Developer Toolbar
di raggiungere i nostri obiettivi col minimo sforzo
rende il refactoring un grosso investimento per il di Fabio Perrone
futuro della soluzione sviluppata col minimo co-
sto nel presente. Uno strumento per comprendere a fondo
le applicazioni web
Bibliografia e riferimenti
[1] http://martinfowler.com/books.html#refactoring
[2] R. Di Natale - “. Net Tools”, Visual Basic Jour- Per comprendere più a fondo le applicazioni
nal, n.70, Lug/Ago 2006 web che ognuno di noi scrive, o semplicemente
[3] http://msdn2.microsoft.com/en-us/visualc/ come strumento di apprendimento per carpire i
bb737896.aspx “segreti” di pagine web scritte da terzi, la Deve-
[4] http://www.devexpress.com/Products/NET/ loper Toolbar di Internet Explorer si può rivela-
IDETools/RefactorCPP/ re uno strumento alquanto soddisfacente. Fino-
[5] http://www.devexpress.com/Products/NET/ ra uno strumento simile era presente soltanto per
IDETools/Index.xml il browser Firefox con l’add-in Firefox Web Deve-
[6] http://www.refactoring.com/tools.html loper Extension, già recensito in passato su que-
[7] http://www.refactoring.com/catalog/index.html sta rivista.
Grazie infatti alle sue molteplici caratteristiche,
tra le quali l’esplorazione del Document Object
Prodotto Model di una pagina web, la visualizzazione delle
Refactor! per C++
parti di HTML presenti su una pagina, l’eviden-
Url di riferimento ziazione di tabelle, la visualizzazione delle dimen-
http://www.devexpress.com/Products/NET/IDETools/
sioni delle immagini (solo per citarne alcune), è
RefactorCPP/
possibile approfondire la conoscenza di qualsiasi
Stato Release pagina presente nel browser.
v. 2.5.4
Dopo avere effettuato senza alcun problema l’in-
Semplicità d’uso ªªªªª stallazione (richiede almeno Windows 2000) trove-
Perfettamente integrato con l’IDE
remo l’icona dell’applicazione sotto la barra degli
Utilità ªªªªª strumenti di Internet Explorer. È da notare che
Chi esegue ordinariamente il refactoring di progetti software in questo tool funziona sia con Internet Explorer 6
C++ trova in questo add-in una soluzione ad un’evidente lacu-
na dell’IDE
che con Internet Explorer 7.
Una volta lanciata la Developer Toolbar, questa
Qualità prodotto ªªªªª si posizionerà automaticamente nella parte bassa
Non sono stati riscontrati problemi degni di nota
dello schermo, ma è anche possibile effettuarne il
Qualità documentazione ªªªª² “detach” e lasciarla mobile sulla pagina.
In lingua inglese, qualche esempio in più aiuterebbe i neofiti del
refactoring La caratteristica principale presente nel cuore
dell’applicazione è il DOM Explorer, che permette
di esplorare e approfondire il significato dell’HT-
ML di qualsiasi pagina, analizzandone i diversi
attributi e stili presenti sulla pagina stessa. Que-
Raffaele Di Natale è laureato in Scienze dell’In-
formazione presso l’università di Catania, insegna sta funzionalità avviene tramite la visualizzazione
Informatica presso l’ITI. Attualmente si occupa di pro- gerarchica di tutti gli elementi presenti, esposti
grammazione in ambito mobile, di help authoring, alla navigazione tramite un treeview situato sul
content management system, content syndication
ed e-learning. lato sinistro dell’applicazione. Quando si evidenzia
un elemento tramite un click con il tasto sinistro

N. 77 - Settembre/Ottobre 2007 VBJ 53
.NET TOOLS

Figura 1

del mouse, vengono mostrate nel lato destro del- Da notare anche la presenza di alcune informa-
l’applicazione le proprietà e gli stili dell’elemento zioni legate ai cookie, quali la possibilità di visua-
prescelto. Tuttavia, scorrere tutto il DOM di una lizzarne alcune informazioni, di disabilitarli per
pagina alla ricerca di un elemento può non essere poter così controllare se si verificano malfunzio-
un’operazione completamente agevole, ma fortu- namenti, oppure la loro eliminazione.
natamente è possibile fare click direttamente su La presenza di un righello interattivo che com-
di un elemento della pagina affinché questo ven- pare sulla pagina quando si richiama la voce di
ga immediatamente evidenziato nel DOM: senza menu “Tools -> Show Ruler” permette di stabi-
dubbio, una grande comodità. lire con estrema precisione le dimensioni degli
Oltre all’analisi del DOM, vediamone altre fun- oggetti.
zionalità. Molto importante ed utile è senza dub- Ultimamente le applicazioni web stanno pren-
bio la possibilità di ridimensionare il sito per si- dendo sempre più piede anche per applicazioni
mulare altre risoluzioni sullo schermo, così da po- gestionali, quindi non sono più semplicemente
ter evidenziare eventuali difetti di visualizzazio- un contenitore di informazioni da esporre agli
ne della pagina, la visualizzazione delle tabelle, utenti, ma ci si attende che gli utenti stessi im-
delle celle e dei DIV. mettano dati all’interno di web form ed è quindi
Vista la loro enorme importanza nelle applica- importante che il TabIndex dei controlli che ac-
zioni web, le immagini hanno meritato un menu cettano dei valori sia corretto: la voce “View ->
a parte, in cui è possibile disabilitarle , mostrarne TabIndexes” mostra (in modo simile alla fase di
le dimensioni (in pixel) nonché il peso delle im- progettazione delle applicazioni Windows Forms
magini stesse e il percorso completo da cui ven- all’interno di Visual Studio) l’ordine di tabulazio-
gono recuperate. Tutte queste informazioni pos- ne di tutti i controlli.
sono essere visualizzate insieme o singolarmen- Ulteriori funzionalità ci vengono fornite dal
te. Infine, l’Image Report crea un file XML con- menu “Validate”: sono presenti tutti i link alle
tenente tutte le immagini presenti sulla pagina pagine W3C che permettono di effettuare la con-
con le loro caratteristiche. valida dell’HTML, dei CSS, dei Feed e dei link

54 VBJ N. 77 - Settembre/Ottobre 2007
.NET TOOLS

presenti sulla pagina. La convalida delle pagine
Prodotto
web è fondamentale per poter esporre sulle pagi- Internet Explorer Developer Toolbar
ne stesse il logo “W3C”, sinonimo di qualità e di
Url di riferimento
conformità agli standard della pagina stessa. http://www.microsoft.com/downloads/details.aspx?FamilyID=E5
Infine, un piccolo strumento utile per riprodurre 9C3964-672D-4511-BB3E-2D5E1DB91038&displaylang=en
alcune immagini è un color picker che permette Stato Release
di recuperare il colore di qualsiasi elemento pre- Stabile
sente sul sito.
Semplicità d’uso ªªª²²
L’Internet Explorer Developer Toolbar, oltre ad Nonostante le disparate funzionalità, sono tutte molto imme-
uno strumento di esplorazione per sviluppatori diate
esperti, è senza dubbio anche un ottimo strumen- Utilità ªªª²²
to di apprendimento che permette di andare ol- Per chi desidera approfondire la conoscenza delle applicazio-
tre al semplice “Visualizza HTML” presente nel ni web
browser, permettendo così di rivolgersi sia ad un Qualità prodotto ªªª²²
pubblico di beginner che ad un pubblico di svi- Affidabile, nei test sul prodotto eseguiti non ha mai mostrato par-
luppatori avanzati. ticolari problemi
Nonostante il download sia irrisorio (624 kb), le Qualità documentazione ªª²²²
notevoli potenzialità di questa applicazione pos- Ma l’utilizzo dei tool è immediato
sono permettere di comprendere maggiormente
qualsiasi tipo di applicazione web e di riuscire Fabio Perrone, laureato in Matematica e MCTS
ad approfondire la comprensione e le tecniche di (Web) in C# 2.0, lavora presso TSF s.p.a. dove si
creazione di qualsiasi pagina. occupa di progettazione e sviluppo di applicazioni
Windows e Web.

N. 77 - Settembre/Ottobre 2007 VBJ 55
OFFERTE ABBONAMENTI
Estate 2007
RIVISTE CARTACEE Per l’abbonamento in spedizione con posta prioritaria
1 anno 2 anni aggiungere i seguenti importi:
COMPUTER PROGRAMMING € 55.00 � € 100.00 � durata 1 anno: durata 2 anni:
DEV € 55.00 � € 100.00 �
VISUAL BASIC JOURNAL € 45.00 � € 80.00 � � + € 18.00 per CP � + € 36.00 per CP
LOGIN € 45.00 � € 80.00 � � + € 18.00 per DEV � + € 36.00 per DEV
JAVA JOURNAL € 43.00 � € 75.00 � � + € 10.00 per VBJ � + € 20.00 per VBJ
� + € 10.00 per LOGIN � + € 20.00 per LOGIN
CP+DEV+VBJ+LOGIN+JJ € 196.00 � € 380.00 � � + € 10.00 per JJ � + € 20.00 per JJ

RIVISTE WEB Totale ordine € _______________________
1 anno (IVA 20% INCLUSA)
INDIRIZZO DI SPEDIZIONE
CP web compreso archivio € 45.00 �
DEV web compreso archivio € 45.00 � Nome/Società __________________________________________________________
VBJ web compreso archivio € 35.00 �
Codice Fiscale (obbligatorio) ________________________________________________
LOGIN web compreso archivio € 35.00 �
JJ web compreso archivio € 35.00 � Indirizzo _______________________________________________________________

2 web a scelta compreso archivio € 60.00 � CAP _____________ Città ___________________________________ Prov. ______

3 web a scelta compreso archivio € 85.00 � Telefono ____________________________ Fax ______________________________
4 web a scelta compreso archivio € 115.00 �
5 web compreso archivio € 140.00 � E-Mail ________________________________@_______________________________

Codice Cliente __________________________________________________________
• OFFERTA SPECIALE: Con soli 20€ di differenza avrai
la possibilità di accedere per un intero anno anche alla
versione online (compreso archivio) della rivista a cui
ti sei abbonato INDIRIZZO DI FATTURAZIONE
(solo per riviste web)
RIVISTE CARTACEE + WEB Nome e Cognome _______________________________________________________
1 anno (IVA 20% INCLUSA) Ditta __________________________________________________________________
COMPUTER PROGRAMMING € 75.00 �
Indirizzo _______________________________________________________________
DEV € 75.00 �
VISUAL BASIC JOURNAL € 65.00 � CAP ____________ Città _________________________________ Prov. _________
LOGIN € 65.00 �
P.IVA _________________________________________________________________
JAVA JOURNAL € 63.00 �
E-Mail per invio fattura _________________________ @ ________________________
CP+DEV+VBJ+LOGIN+JJ € 296.00 �

• I prezzi degli abbonamenti Web sono conprensivi dell’ IVA al 20% MODALITA’ DI PAGAMENTO
� Allego fotocopia del Bonifico Bancario effettuato sul C/C 000000014804
• I prezzi degli abbonamenti per l’estero sono maggiorati di spese di spedizione. CAB 25200 ABI 01030 Cin “A” - Monte dei Paschi di Siena - Agenzia di Perignano
� Allego fotocopia della ricevuta del versamento sul C/C Postale N.14291561 intestato
• Gli abbonamenti decorrono dal primo numero raggiungibile.
a: “Gruppo Editoriale Infomedia S.r.l. - Ponsacco”
Per attivazioni retroattive contattaci al numero 0587/736460 o invia una e-mail
all’indirizzo: abbonamenti@gruppoinfomedia.it � Allego assegno bancario intestato a: “Gruppo Editoriale Infomedia S.r.l.” NON TRASFERIBILE
� Contrassegno (+ € 11.00 contributo spese postali)
PRIVACY � Autorizzo l’addebito dell’importo di € _____________________ sulla mia CARTASI’/VISA
Con la presente si autorizza al trattamento dei dati personali ai sensi delle
vigenti norme sulla privacy N. ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___

Scad. ___ ___ / ___ ___ (mm/aa) Codice di sicurezza “CV2” ___ ___ ___
FIRMA________________________________________________
Nome del Titolare ____________________________________________________

SI, mi voglio iscrivere gratuitamente alla newsletter Infomedia Data di nascita ____________________________________________________
che mi tiene aggiornato sui prossimi argomenti delle mie riviste di
programmazione e mi informa delle offerte, le nuove uscite e le prossime Firma del Titolare ____________________________________________________
pubblicazioni. Questo è il mio indirizzo di posta elettronica:
� Collegati al sito www.infomedia.it dove potrai effettuare il pagamento con carta di credito
______________________________@____________________________ in modalità sicura (banca SELLA)

Posso annullare la mia iscrizione in qualsiasi momento alla pagina:
www.infomedia.it/newsletter.htm

Garanzia di riservatezza - Gruppo Editoriale Infomedia garantisce la massima riservatezza dei dati da lei forniti e la possibilità di richiederne gratuitamente la rettifica
o la cancellazione scrivendo a: Responsabile Dati - Gruppo Editoriale Infomedia Srl - Via Valdera P. 116 - 56038 Ponsacco (PI). Le informazioni custodite nel nostro
archivio elettronico verranno trattate in conformità alla legge 196/03 sulla tutela dati personali.
L’IVA sul prezzo dell’abbonamento cartaceo è assolta dall’Editore e non sussiste l’obbligo di emissione della fattura, ai sensi del D.M. 9 aprile 1993, art.1, comma 5;
pertanto, ai fini contabili, farà fede la sola ricevuta di pagamento; perciò la fattura verrà emessa solo se esplicitamente richiesta al momento dell’ordine.
Lei può dedurre il costo dell’abbonamento dal reddito d’impresa e dai redditi derivanti dall’esercizio di arti e professioni (artt. 54 e 56 del TUIR)

GRUPPO EDITORIALE INFOMEDIA S.R.L.
Via Valdera P. 116 - 56038 Ponsacco (PI) - Tel. 0587 736460 - Fax 0587 732232
www.infomedia.it - abbonamenti@gruppoinfomedia.it