Dopo la partial class i partial method ...
Tra le nuove funzionalita di "Orcas" (.NET 3.5 - Visual Studio 2008) mi ha particolarmente colpito per l'eleganza e per la ricaduta che potrà avere sui nuovi tool di autogenerazione del codice e i case in generale il partial method.
Funzionalità non molto pubblicizzata che vedremo nella Beta 2 e che mette un ulteriore tassello nella evoluzione della separazione tra codice generato da un case dell'ambiente di sviluppo e codice di estensione al modello su cui stiamo sviluppando, continuando l'evoluzione introdotta dalle partial class.
Con le partial class da .NET 2.0 in poi è possibile separare in file diversi l'implementazione di una classe marcandola per l'appunto con l'attributo partial , consentendo in questo modo la possibilità di separare il codice generato dal case di turno dal codice scritto da noi e ricomponendo il tutto in fase di compilazione. Questa funzionalità ha avuto una ampia ricaduta su diversi strumenti dal modello di sviluppo e compilazione delle pagine ASP.NET fino ai designer delle windows form di VS 2005, al designer del dataset, di workflow foundation, etc .
Con i partial method si prosegue su questa strada consentendo la definizione e l'implementazione di metodi con lo stesso principio di base della partial class, aprendo nuovi ed interessanti scenari.....vado a spiegare il funzionamento e l'utilità :
Immaginiamo di definire una classe customer per rappresentare una entità di questo tipo all'interno della nostra applicazione. Come detto, attraverso una partal class possiamo spezzare in due file l'implementazione come di seguito:
File 1
partial class Customer
{
string _name;
string Name
{
get { return _name;}
set {_name=value;}
}
}
File 2
partial class Customer
{
string GetXYZ()
{
//omesso
}
}
Immaginiamo ad esempio che la classe Customer sia implementata da un case di un ORM e che, invece, il metodo GetXYZ sia invece una nostra estensione alla classe.
Con il partial method si potrà definire nel primo file autogenerato l'impronta di un metodo che potrà poi essere implemletato realmente nel secondo file. Il vantaggio di fare cio permette nel primo file di poter scrivere del codice che utilizza il metodo nella parte autogenerata, lasciando però l'implementazione al file utilizzato da chi va ad estendere il codice generato.
Tornando al nostro esempio immaginiamo di voler permetter l'inserimento di una regola di validazione per l'input della proprietà Name sull'oggetto Customer autogenerato dall'ORM, lasciandone l'implementazione allo sviluppatore. Grazie al partial method il generatore di codice dell'ORM nel file 1 potrà scrivere:
File 1
partial class Customer
{
string _name;
partial void OnNameChange();
string Name
{
get { return _name;}
set {
OnNameChange();
_name=value;
}
}
}
e quindi nel file 2 potra essere eventualmente scritta la parte di implementazione della regola di validazione come di seguito:
File 2
partial class Customer
{
string GetXYZ()
{
//omesso
}
partial void OnNameChange()
{
//omesso
}
}
In questo modo il generatore di codice può prevedere la possibilità di offrire dei punti di intercezione allo sviluppatore estrmamente efficaci, senza ricorrere a ereditarietà, delegate o altro. Altro interessante aspetto consiste nel fatto che il codice riguardante i partial method del file 1 viene effettivamente compilato se, e solo se, ne viene effettuata l'implementazione, aumentandone ancor di più l'efficacia.
Ci sono alcuni vincoli nel partial method: deve essere sempre di tipo void , deve essere private .
Uno dei primi utilizzi del partial method in "Orcas" è proprio nell'ORM offerto da LINQ to SQL con funzionalità molto simili a quanto mostrato nell'esempio precedente.
Comments
Anonymous
July 19, 2007
Ma non assomiglia ad una implementazione, direttamente nel linguaggio, del design pattern "template method"? Forse sono fuorviato dal fatto che a) lo uso spesso e b) ho letto recentemente un post su un blog che sostiene che i design patterns non sono altro che il riempimento di mancanza di espressività dei linguaggi...Anonymous
July 19, 2007
The comment has been removed