Ingegneria del Software – Esercitazione 4

Prima parte

Il seguente diagramma delle classi UML rappresenta una soluzione basata sul design pattern Observer in cui sono presenti il soggetto concreto ClockTimer e due osservatori concreti, ovvero un orologio analogico AnalogClock e un orologio digitale DigitalClock:

Il soggetto concreto impartisce ogni secondo una notifica di aggiornamento che deve essere recepita dai due osservatori, i quali visualizzeranno l'ora aggiornata mediante il metodo Draw().

Implementare in C# la soluzione rappresentata nel diagramma, definendo i metodi Draw() delle classi AnalogClock e DigitalClock in maniera semplice, ovvero senza disegnare effettivamente sullo schermo i due orologi, ma scrivendo semplicemente dei messaggi testuali che contengono l'ora.

Realizzare inoltre una classe di test per verificare il corretto funzionamento della soluzione implementata.

 

Seconda parte

Realizzare una seconda versione della soluzione utilizzando il meccanismo dei delegati ed eventi specifico del linguaggio C#

https://msdn.microsoft.com/en-us/library/17sde2xt(v=vs.100).aspx

 

Realizzare una terza versione della soluzione utilizzando gestori di eventi generici,

https://msdn.microsoft.com/en-us/library/db0etb8x(v=vs.110).aspx,

specificando l'argomento passato al gestore dell'evento e fornendo attraverso tale argomento informazioni relative all'ora corrente del soggetto ClockTimer.

 

Realizzare una quarta versione impiegando un oggetto System.Timers.Timer

https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.100).aspx

come cuore della classe ClockTimer  - anziché usare un thread - e proteggendo opportunamente le regioni critiche di tale classe per evitare l'accesso contemporaneo ai metodi GetTime()/SetTime e Start()/Stop() da parte di più thread.

 

Finalità dell’esercizio

Implementazione di un design pattern (Observer)

Uso dei thread

Uso dei delegati/eventi in C#

Delimitazione di regioni critiche thread-safe


 

Soluzione