La programmazione
a Componenti
Uno
degli obiettivi più ambiziosi dell'Ingegeria del Software è
organizzare lo sviluppo di Sistemi in maniera simile a quanto è
stato fatto in altre branche dell'Ingegneria, dove la presenza di un mercato
di parti standard altamente riutilizzabili permette di aumentare la produttività,
riducendo nel contempo i costi. Nella meccanica, ad esempio, esiste da
tempo un grosso mercato di componenti riutilizzabili, come viti, dadi,
bulloni e ruote dentate; ciascuno di questi componenti trova posto facilmente
in centinaia di prodotti diversi.
L'industria
del Software, sempre più orientata alla filosofia dei componenti,
stà dando vita a due nuove figure di programmatore: il progettista
di componenti e l'assemblatore di applicazioni.
Il
primo ha il compito di scoprire e progettare oggetti software di uso comune,
che possano essere utilizzati con successo in contesti differenti. Produttori
in concorrenza tra di loro possono realizzare Componenti compatibili, ma
con caratteristiche prestazionali differenti. L'acquirente può orientarsi
su un mercato che offre una pluralità di scelte, e decidere in base
al budget o a particolari esigenze prestazionali.
L'assemblatore
di applicazioni, d'altra parte, è un professionista specializzato
in un particolare dominio applicativo, capace di creare programmi complessi
acquistando sul mercato componenti standard, e combinandoli con strumenti
grafici o linguaggi di scripting.
Questo
capitolo offre un'analisi approfondita delle problematiche che si incontrano
nella creazione di Componenti in Java; attraverso gli esempi verrà
comunque offerto una panoramica su come sia possibile assemblare applicazioni
complesse a partire da Componenti concepiti per il riuso.
La specifica Java
Beans
JavaBeans
è una specifica, ossia un insieme di regole, seguendo le quali è
possibile realizzare in Java Componenti software riutilizzabili, che abbiano
la capacità di interagire con altri Componenti, realizzati da altri
produttori, attraverso un protocollo di comunicazione comune. Ogni Bean
è caratterizzato dai servizi che è in grado di offrire, e
può essere utilizzato in un ambienete di sviluppo differente rispetto
a quello in cui è stato realizzato. Quest'ultimo punto è
cruciale nella filosofia dei componenti: sebbene i Java Beans siano a tutti
gli effetti classi Java, e possano essere manipolati completamente per
via programmatica, essi vengono spesso utilizzati in ambienti di sviluppo
diversi, come Tool grafici o linguaggi di scripting.
I
Tool grafici, tipo JBuilder, permettono di manipolare i componenti in maniera
visuale. Un assemblatore di Componenti può selezionare i Beans da
una palette, inserirli in un apposito contenitore, impostarne le proprietà,
collegare gli eventi di un Bean ai metodi di un altro, generando in tal
modo applicazioni, Applet, Servlet e persino nuovi Componenti senza scrivere
una sola riga di codice.
I
linguaggi di scripting, di contro, offrono una maggior flessibilità
rispetto ai Tool grafici, senza presentare le complicazioni di un linguaggio
generico. La programmazione di pagine Web dinamiche, un dei domini applicativi
di maggior attualità, deve il suo rapido sviluppo ad un'intelligente
politica di stratificazione, che vede le funzionalità di più
basso livello, come la gestione dei DataBase, la Businnes Logic o l'interfacciamento
con le risorse di sistema, incapsulate all'interno di JavaBeans, mentre
tutto l'aspetto della presentazione viene sviluppato con un semplice linguaggio
di scripting, tipo Java Server Pages o PHP.
Il modello di
componenti Java Beans
Un
modello a componenti è caratterizzato da almeno sette fattori: Proprietà,
Metodi, Introspezione, Personalizzazione, Persistenza, Eventi e Modalità
di Deployment. Nei prossimi paragrafi analizzeremo il ruolo di ciascuno
di questi aspetti all'interno della specifica Java Beans; quindi procederemo
a descriverne l'implementazioni in Java.
Proprietà
Le
proprietà sono attributi privati, accessibili solamente attraverso
appositi metodi "get" e "set". Tali metodi costituiscono l'unica via di
accesso pubblica alle proprietà, cosa che permette al progettista
di Componenti di stabilire per ogni parametro precise regole di accesso.
Se si utilizzano i Bean all'interno di un programma di sviluppo visuale,
le proprietà di un componente vengono visualizzate in un apposito
pannello, che permette di modificarne il valore con un opportuno strumento
grafico.
Metodi
I
metodi di un Bean sono metodi pubblici Java, con l'unica differenza che
essi risultano accessibili anche attraverso linguaggi di scripting e Builder
Tools. I metodi sono la prima e più importante via d'accesso ai
servizi di un Bean.
Introspezione
I
Builder Tool scoprono i servizi di un Bean (proprietà, metodi ed
eventi) attraverso un processo noto come Introspezione, che consiste principalmente
nell'interrogare il componente per conoscerne i metodi, e da questi dedurne
le caratteristiche. Il progettista di componenti può attivare l'introspezione
in due maniere: seguendo precise convenzioni nella formulazione delle firme
dei metodi, o creando una speciale classe BeanInfo, che fornisce un elenco
esplicito dei servizi di un particolare Bean.
La
prima via è senza dubbio la più semplice: se si definiscono
i metodi di accesso ad un determinato servizio seguendo le regole di naming
descritte dalla specifica JavaBeans, i Tool grafici saranno in grado, grazie
alla reflection, di individuare i servizi di un Bean semplicemente osservandone
l'interfaccia di programmazione. Il ricorso ai BeanInfo, d'altro
canto, torna utile in tutti quei casi in cui sia necessario mascherare
alcuni metodi, in modo da esporre solamente un sottoinsieme dei servizi
effettivi del Bean.
Personalizzazione
Durante
il lavoro di composizione di Java Beans all'interno di un Tool grafico,
un apposito Property Sheet, generato al volo dal programma di composizione,
mostra lo stato delle proprietà e permette di modificarle con un
opportuno strumento grafico, tipo un campo di testo per valori String o
una palette per proprietà Color. Simili strumenti grafici vengono
detti Editor di Proprietà. I Tool grafici dispongono di Editor di
Proprietà in grado di supportare i tipi Java più comuni,
come i tipi numerici, le stringhe e i colori; nel caso si desideri rendere
editabile una proprietà di un tipo diverso, è necessario
realizzare un'opportuna classe di supporto, conforme all'interfaccia PropertyEditor.
Quando invece si desideri fornire un controllo totale sulla configurazione
di un Bean, è possibile definire un BeanCustomizers, una speciale
applicazione grafica specializzata nella configurazione di un particolare
tipo di Componenti.
Persistenza
La
Persistenza permette ad un Bean di salvare il proprio stato e di ripristinarlo
in un secondo tempo. JavaBeans supporta la persistenza grazie all'Object
Serialization, che permette di risolvere questo problema in modo molto
rapido.
Eventi
Nella
programmazione ad oggetti tradizionale non esiste nessuna convenzione su
come modellare lo scambio di messaggi tra oggetti. Ogni programmatore adotta
un proprio sistema, creando una fitta rete di dipendenze che rende molto
difficile il riutilizzo di oggetti in contesti differenti da quello di
partenza. Gli oggeti Java progettati secondo la specifica Java Beans adottano
un meccanismo di comunicazione basato sugli Eventi, simile a quello utilizzato
nei componenti grafici Swing ed AWT. L'esistenza di un unico protocollo
di comunicazione standard garantisce l'intercomunicabilità tra componenti,
indipendentemente da chi li abbia prodotti.
Deployment
I
JavaBeans possono essere consegnati, in gruppo o singolarmente, attraverso
files jar, speciali archivi compressi in grado di trasportare tutto quello
di cui un Bean ha bisogno, come classi, immagini o altri files di supporto.
Grazie ai files jar è possibile consegnare i Beans con una modalità
del tipo "chiavi in mano": l'acquirente deve solamente caricare un file
jar nel proprio ambiente di sviluppo, e i Beans in esso contenuti verranno
subito messi a disposizione. L'impacchettamento di classi Java all'interno
di files jar segue poche semplici regole, che verranno descritte negli
esempi del capitolo.
Conclusioni
In
questo articolo sono stati presentati alcuni principi chiave dello sviluppo
di applicazioni basate sui componenti. Il mese prossimo entreremo nel vivo
del mondo dei componenti Java Beans, studiando in dettaglio il meccanismo
delle proprietà.
|