Post

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

Sicuramente almeno una volta nella vostra carriera di sviluppatori vi sarà capitato di dover misurare la durata di esecuzione di un'istruzione oppure di un gruppo di istruzioni. La cosa più semplice da fare è dichiarare due variabili di tipo "DateTime", dove saranno registrate la data di inizio dell'operazione, e la data di fine; quindi eseguire una banale "end.Subtract(start)" per ottenere il "TimeSpan" che rappresenta l'effettiva misurazione della durata. Non vi ho detto niente di nuovo, quindi. Ma ammettiamo che dobbiate misurare diverse porzioni e funzioni del vostro sistema. Se poi si tratta di un sistema che processa "batch" un quantitativo di dati considerevole, la cosa è un tantino dispersiva, e si rischia di sporcare tutto il codice con variabili come quelle sopra citate. La domanda che mi sono posto è la seguente: ho modo di ottenere il medesimo risultato evitando di inquinare il mio codice con vagonate di istruzioni che...

Maggiore espressività in un'applicazione console

Nell'ultimo periodo mi sono concentrato non su architetture tradizionali (web o desktop), ma su processori ed elaboratori che macinano grossissime quantità di informazioni in background in modo asincrono. In questo genere di progetti, l'interazione utente non è la cosa più importante; lo sono invece la gestione degli errori, il tracciamento dei vari step applicativi in tutte le fasi dell'elaborazione e, più di tutto, le prestazioni. Lo scopo finale è ottenere un sistema che sia in grado di completare il workflow attraverso una sequenza ben definita di semplici passi logici, tutti tracciabili e ben evidenti anche in fase di analisi dei log. Un'applicazione console è la scelta più indicata per iniziare a sviluppare (e testare) un elaboratore massivo, perchè rimuove i "fronzoli" di un sistema tradizionale, permettendo di concentrarsi sul lavoro che deve essere portato a termine. Ben presto ci si rende però conto che la semplice "WriteLine" della c...

Inversion of Control e Dependecy Injection fatti in casa (3)

Finalmente siamo giunti all'ultimo capitolo della saga iniziata con i precedenti due post riguardanti l'introduzione all'IoC e l'implementazione dei plugins ; finalmente siamo giunti al nocciolo della questione; finalmente, senza indugio, passiamo a vedere qualche cosa di interessante... Il pezzo che manca a completare il puzzle è capire come dare la possibilità alla nostra applicazione di generare un'istanza di un particolare oggetto, che implementa l'interfaccia "IFinder", utilizzando una semplice stringa di testo. La struttura che permette la "magia" è la classe statica "FinderIoc", e il suoo metodo "CreateProvider". Come visto in precedenza, l'utilizzo della stessa è estremamente banale; l'implementazione nasconde qualche piccola insidia, dovendo fare uso di tecniche quali "Activation", "Reflection" e "Dynamic Type Generation". Dopo una sana validazione dell'argomento in ...

Inversion of Control e Dependecy Injection fatti in casa (2)

Nella precedente puntata eravamo rimasti alla descrizione del service layer di accesso alle funzionalità applicative. Inoltre, la definizione dell'interfaccia "IFinderProvider" permette di esporre il contratto condiviso tra i differenti plugin di ricerca: share, local e webservice. Come detto, prima di passare alla descrizione del "container", responsabile della gestione modulare operata da Dependency Injection, vediamo l'implentazione reale del modulo "Local". Il codice riportato è una banalissima implementazione di "mockup" che emette dei sample data. In una situazione reale la logica applicativa eseguirebbe una ricerca sul disco locale, magari scansionando le directoy secondo una struttura definita, e partendo da un percorso "radice" definito da configurazione applicativa. La cosa importante è che il modulo "Local" è implementato dalla classe "LocalFinderProvider", che rispetta i termini del contratt...

Inversion of Control e Dependecy Injection fatti in casa (1)

Qualche giorno fa stavo lavorando ad un piccola applicazione con un collega e ci siamo dovuti subito confrontare con una scelta architetturale che mi ha ispirato la scrittura di questo post. Prima di mettere troppa carne al fuoco, meglio spiegare i requisiti di questo mini-sistema; chiaramente lo spoglierò di tutte le cose che "fanno solo volume", e che non sono significative in questo frangente. Problema: data una bellissima GUI (WPF, Windows Forms, fate voi...) con una casella di ricerca "Google style", è richiesto che l'applicativo esegua una ricerca di tutti documenti, di un formato definito, che contengono nel nome del file oppure nel contenuto del documento stesso, il testo digitato. La richiesta particolare è che la ricerca debba essere fatta sia sul computer locale, che in una locazione remota utilizzando un servizio web (opportunamente disegnato per l'occasione) in grado di erogare le informazioni. Sembra tutto facile, quindi mettiamo un bel pu...

Perchè applicare un "Design Pattern"

"Nell'ingegneria del software, un design pattern (schema di progettazione) può essere definito una soluzione progettuale generale a un problema ricorrente.". Questa è la prima frase che riporta Wikipedia quando si cerca la voce "Software Design Pattern". I più arguti avranno già capito che questo post non è di natura empirica (quindi condito da tanto "succoso" codice); più che altro è l'ennesima "sbrodolata" concettuale-filosofica a tema informatico. Si, perchè essere appassionati di informatica è un po' essere filosofi e teorici della materia, capire i principi ispiratori, farli propri ed applicarli alla pratica quotidiana. Ritengo che il nostro mestiere sia una di quelle professioni che più richiedono dedizione e passione. Si studia per anni ciò che hanno fatto quelli che sono venuti prima di noi; si fa esperienza sul campo, versando sangue e lacrime ogni giorno. Alla fine ci si sveglia una mattina convinti di sapere (più o meno...

MapReduce: Volume III

Dove eravamo rimasti? Ah, si...all'implementazione concreta della classe astratta che permette l'esecuzione dell'algoritmo di MapReduce... Come dicevamo nel precente puntata, per portare a termine il nostro scopo, ci faremo dare una mano dalla libreria "Task Parallel Library", o TPL. Tale libreria, in precedenza rilasciata come estensione del .NET Framework, a partire dalla versione 4.0 è stata incorporata nel framework stesso, ponendosi come approccio più efficace per la gestione di processi multi-thread e asincroni in generale. Ma non perdiamo ulteriore tempo e vediamo il codice, per poi illustrare come sia nata la sua implementazione. Naturalmente la classe astratta deve implementare i requisiti dell'interfaccia "IMapReduceProcessor"; esporre le proprietà che servono per "osservare" lo stato, e il metodo di "Execute" che rappresenta il cuore dell'algoritmo. Come detto in precedenza, affichè MapReduce possa essere a...