Inganno il tempo che mi rimane qui al lavoro per
illustrare un attimo come ho intenzione di implementare la feature di firma
dinamica nel mio HappySign. La classe
Sign è il fulcro di tutto: essa contiene proprietà come Name,
Author, Category, Dynamic e Code (oltre a diverse altre che adesso non
interessano).
Quella che ci riguarda è proprio quest'ultima,
Code.
Se Dynamic = false, allora Code
contiene banalmente una string. Questa string è quella
che viene trascinata o incollata. Niente di più semplice. Già testato.
Se Dynamic = true, le cose si fanno più complesse.
Se la firma è dinamica, devo associargli una classe
contenente codice .NET che viene eseguito a run-time per calcolare il valore
reale del parametro. Quindi, facciamo un esempio. Supponiamo di aver
creato una firma/decorazione "Random Number : {0}". Questa è una firma dinamica: quando
trascina questa firma, l'utente si aspetta di trovare nell'applicazione di
destinazione qualcosa come "Random Number : 694543", oppure "Random Number :
98". Non so a cosa possa servire una decorazione di questo tipo, ma è solo un
esempio.
Che codice .NET devo scrivere?
Cominciamo subito col dire
che HappySign è realizzato interamente in C#. La classe per le
firme dinamiche deve essere scritta obbligatoriamente in VB.NET. E' una
questione che mi sono auto-imposto, così mescolo C# e Vb.NET. Volendo,
tecnicamente, posso usare anche C#. Tutto utilizza il nuovo framework 2.0.
Ho
definito una semplice interfaccia ISignParameter, formata da un
solo metodo:
public interface ISignParameter
{
string GetValueParameter(int Index);
}
La classe DEVE implementare questa interfaccia. Il parametro
Index serve per calcolare i valori di tutti i parametri presenti nella firma
dinamica. Quindi, ad esempio, nell'editor di script incluso in
HappySign è possibile definire una classe come:
Public Class RandomNumber
Implements ISignParameter
Public Function GetValueParameter(Index As Integer) As String Implements ISignParameter.GetValueParameter
Dim Ret As Integer
'...
'... Calcolo un numero random
'...
Return(Ret.ToString())
End Function
End Class
Ovviamente, ho volutamente omesso la parte di calcolo del numero
random. Se il codice è scritto bene, la classe può fare di tutto:
connettersi ad un web-services, leggere files, calcolare qualcosa,
interfacciarsi con altri programmi esterni, andare sul web, fare assolutamente
di tutto. L'importante è che venga rispettata l'interfaccia
ISignParameter. Il nome, in questo caso RandomNumber, è
assolutamente libero, non deve rispettare alcun vincolo particolare.
Attenzione: il metodo GetValueParameter viene chiamato tante
volte quanti sono i parametri della firma dinamica. Se scrivo una cosa del
genere:
"Now I listen : {0},
Duration : {1},
Year
{2}"
I parametri sono ben 3. Quindi, GetValueParameter viene chiamata 3 volte. La
prima volta, deve restituire una string per calcolare {0}, la seconda volta
calcola {1}, l'ultima volta calcola {2}. Ho già fatto delle prove e devo dire
che è proprio carino. Io nella mia classe "scriptata" (oddio,
che termine!!) ho messo un bel Select Case e ho chiamato metodi
privati della classe, così il codice è più leggibile e pratico.
Sono sicuro che potrei scontrarmi con qualche dettaglio tecnico che adesso mi
sfugge; ad esempio, ho già visto che le tecniche per
eseguire/compilare classi a run-time sono diverse se create con VB2003 piuttosto
che con VS2005. Purtroppo non ricordo bene, ma alcune classi/metodi/proprietà
sono definite come obsolete. Vedrò di utilizzare il nuovo framework
appieno.