venerdì 18 marzo 2011

Smart Observer (Eventi)

Un idea che mi ronza in tensta da un po' ...creare un entità osservabile.

La prima idea era di utilizzare quanto già realizzato nel Framework 4.0 ma poi come sempre per le piccole cose preferisco farmele da me.

Per due motivi semplici..
a) se voglio aggiungere o togliere qualcosa sono sempre in tempo
b) imparo comprendo apprendo.

Questo banale esempio rappresenta solo una parte di quello che realmente mi serve per realizzare una struttura del tutto affidabile.

Ma come per molti miei brani di codice, questa rappresenta benchè funzionante solo uno spunto.

Codice completo :

public delegate void OnChange(object Changed, string Message);

public interface INotifier
{
event OnChange Changed;
}

public class DemoEntity :INotifier
{
public event OnChange Changed;
private int _ID;
private string _Name;
public int ID
{
get { return _ID; }
set
{
_ID = value;
DoNotify();
}
}
public string Name
{
get { return _Name; }
set
{
_Name = value;
DoNotify();
}
}
public void DoNotify()
{
Changed(this, "Modified");
}
}

public class DemoListEntity : List , INotifier
{
public event OnChange Changed;
public void AddNewEntity(DemoEntity item)
{
this.Add(item);
DoNotify();
}
public void UpdateEnetity(DemoEntity item)
{
lock (this)
{
for (int i = 0; i < this.Count; i++) {
if (this[i].ID == item.ID) {
this[i] = item; DoNotify(); break; }
}
}
}
public void DoNotify() {
Changed(this, "Modified");
}


In questo esempio c'e' un delegato OnChange(object Changed, string Message);
Che per il momento non fa assolutemente nulla di interessante, ma ha lo scopo unico di
definire i campi che saranno oggetto della notifica di avvenuto cambiamento.C'è l'interfaccia INotifier che assume il ruolo di contratto fra chi utilizzerà l'evento e chi utilizzerà la classe.

Tipicamente potrebbe essere comodo utilizzae una lista di queste interfaccie al fine di concentrare la gestione dell'evento.

E poi due classi Entity e List per dar forma all'esempio.

In questa implementazione "banale e approssimativa" si può tuttavia comprendere quanto possa essere efficace.

L'uso di DoNotify potrebbe essere esteso con due parametri come il campo modificato e il valore attuale e precedente... per esempio ...

Il caso d'uso ?? Una window application verosimilmente a multi utenza a cui propagare che Un dato è stato modificato .. o che quello che stiamo visualizzando deve essere aggiornato.

Via web questo processo è sicuramente più complesso perchè chiaramente il server non può invocare una refresh lato client... ma il client via ajax può chiedere se qualcosa è cambiato...

In questo caso una struttura come questa non basta, perchè due sessioni non condividono la
stessa area di memoria .. ma nulla ci vieta di aggiornare dei dati lato server.



Nessun commento: