Sfruttare IDisposable per realizzare un misuratore di tempistiche di esecuzione (Parte 2)

Dicevamo (nel post precedente)...
L'interfaccia IDisposable ci permette di controllare il ciclo di vita di una classe, dal suo istanziamento, fino alla completa distruzione; l'uso congiunto di questa interfaccia (o meglio, di classi che implementano questa interfaccia) e la keywork "using", ci permette di controllare questo ciclo vitale in maniera molto più rigida, ottenendo quindi un controllo completo sulla classenquando essa viene effettivamente dealocata dalla memoria del processo.

Partendo dall'helper "Tracer", che funge da "entry-point" della funzionalità che stiamo realizzando, possiamo accedere al metodo che ci permetterà di generare una nuova instanza della classe materialmente responsabile dell'attività. La banalità dell'implementazione del metodo lascia veramente pochissimo spazio ai commenti: un semplice passaggio dei parametri previsti dal metodo (uno dei quali opzionale), iniettati immediamente nel costrutture della nuova istanza di "TraceDuration", poi emessa al chiamante.

L'implementazione reale di "TraceDuration" è certamente più interessante. Faccio subito notare che il codice riportato è puramente esemplificativo, senza fronzoli. Ci sono tantissimi modi per migliorare la qualità e la flessibilità della classe, magari facendo largo uso di tecniche quali IoC e D/I (di cui abbiamo già parlato in post precedenti). Prima di tutto definiamo l'implementazione di "IDisposable" (come più volte già anticipato) per assicurarci i benefici derivanti dal suo utilizzo in combinazione a "using".

Poi avremo cura che tale classe sia istanziata solo all'interno dell'assembly in cui è definito l'helper "Tracer", marcando il costruttore come "internal"; "finezza", questa mirata unicamente a guidare l'utilizzatore affinchè sfrutti sempre il punto di ingresso che abbiamo studiato per la funzionalità.

Il costruttore rappresenta il momento temporale in cui iniziare la nostra misurazione della durata; quindi, dopo aver opportunamente salvato i parametri di ingresso della classe e l'orario corrente, emettiamo su standard output (standard console) il messaggio utente con i dettagli testuali di inizio del tracciamento.

L'unico altro metodo contenuto in "TraceDuration" è quello che l'interfaccia implementata ci obbliga a costruire: "Dispose". Esso viene invocato quando il costrutto "using" cessa il suo "scope", cioè quando il codice che vogliamo misurare è stato completamente eseguito: un paio di calcoli elementari per ottere la durata dell'operazione, seguiti dalla composizione del messaggio di terminazione, ed ancora lo standard output che aiuta ad interagire con l'utente finale...

Poche righe di codice ed il gioco è fatto: semplice, elegante e sintetico...
M.

Commenti

Post popolari in questo blog

Restore di un database SQL Server in un container Docker

Cancellazione fisica vs cancellazione logica dei dati

WCF RESTful service: esposizione del servizio