Link utili della settimana #10

On the Fly Zip and Attach” Windows Live Writer Plugin
Questo add-in è utile a tutti i bloggers che (come me) usano Windows Live Writer per scrivere e pubblicare i propri posts. Esso permette di selezionare files / directory dal proprio PC, zipparli al volo ed includerli come allegato al proprio post onde permettere al lettore di farne il download. Decisamente da provare.

Dynamic LINQ Methods
Molto molto interessante. Trattasi di una serie di extensions methods per effettuare query Linq con parametri stringa (es. where, groupby, orderby, ecc), e quindi dinamici a run-time. Questa è una funzionalità parecchio utile che sarebbe stato meglio includerla come parte integrante dei vari providers Linq (a mio modesto parere).

Visual C# 2010 samples
Parecchi esempi di codice su C# 4.0 e Linq

Coding Horror #1

Se c’è un aspetto che lo sviluppatore medio non tiene nella giusta considerazione quando scrive il codice è il cast tra tipi. Questo lo deduco solo dalla mia esperienza sul campo, ovvio.

Sto parlando del cast ridondante, cioè quel cast semplicemente inutile e che potrebbe essere tranquillamente evitato, basterebbe solo un pò di attenzione in più, e forse un pò di copia ed incolla in meno

Spesso un cast ridondante non è immediatamente percepibile.

Se si scrive una cosa del genere:

non è immediatamente visibile (ad occhio, intendo) il cast ridondante della riga 4, poichè un oggetto XmlDocument può essere tranquillamente assegnato ad un oggetto XmlNode in quanto quest’ultimo è la classe da cui deriva, e quindi per i principi basilari del polimorfismo o per il principio di sostituzione di Liskov (al secolo Barbara Liskov, è quindi una donna ) , fate voi, per cui, se B è una classe derivata da A, allora oggetti di tipo A possono essere sostituiti da oggetti di tipo B senza alterare la correttezza dei risultati.

Quindi il codice precedente può essere riscritto senza la ridondanza del cast, cosi:

Ma quando vedo cose del genere:

non riesco proprio a non rabbrividire, anche con il caldo torrido di questi giorni .

Ma come è possibile effettuare un cast del valore zero verso un tipo Byte !?!?!, quando, lo sanno pure i bambini, il tipo primitivo Byte rappresenta un valore intero senza segno compreso tra 0 e 255 ?.

Scusate lo sfogo…..

NDepend, a “must have” tool

Questo è un tool davvero impressionante per cosa riesce a tirar fuori da un assembly .Net, adesso con tanto di add-in per Visual Studio e per Reflector.

E’ un must per qualsiasi sviluppatore/architetto degno di questo nome.

Mini rivisitazione dei progetti a cui ho partecipato

Avendo visto negli ultimi anni un bel pò di applicazioni .Net di ogni tipo, avendo partecipato ad un bel pò di progetti e conseguentemente visto una quantità considerevole di righe di codice, di seguito elenco (in ordine sparso) le mie considerazioni sulla qualità media del codice sorgente da me visionato e su cui spesso e volentieri sono intervenuto in prima persona per correzioni e/o nuove funzionalità (leggasi elenco di brutture e/o coding horror):

– La visibilità delle classi è una questione non tenuta nella giusta considerazione. Quando si crea una classe la si marca come “public”, e tale resta per sempre, anche se la classe potrebbe essere “internal”;

– il paradigma “Object Oriented Programming” è scarsamente applicato, ed anche scarsamente conosciuto, e cosi si finisce spesso per avere, solo a titolò di esempio, codice duplicato, scarsamente coeso e altamente accoppiato;

Boxing e unboxing: concetto non conosciuto dai più, e cosi accade che il tipo “object” è usato a sproposito, e la tipizzazione dei dati diventa una rarità;

– Concatenazioni di stringhe a go-gò, anche se è arcinoto che questa operazione non è performante a causa dell’immutabilità dell’oggetto stringa che “stressa” parecchio il garbage collector;

– Utilizzo delle eccezioni nella logica di business dell’applicazione per notificare situazioni particolari;

– Utilizzo indiscriminato di Dataset/Datatable in ogni layer applicativo (front-end compreso), al posto di oggetti di dominio non anemici, cioè dotati di attributi e di comportamento (sì lo so, chiedo forse troppo, questo è Domain Driven Design…), con conseguente profilerazione di classi per la gestione delle entità trattate dalla applicazione, es. CustomerManager, OrderManager, ecc.
Su questo argomento potrei aprire una lunga discussione, circa colui che io definisco “il programmatore del dataset”;

– La modularità di una applicazione e il concetto di “Separation of Concern” (Soc)  non attira l’interesse della maggior parte degli addetti ai lavori. Come già discusso qui, è più importante rispettare i termini di consegna puttosto che creare software di qualità, ed ecco che si finiisce per scrivere software quasi monolitici, dove le responsabilità si “accavallano” in modo netto ed evidente tra i vari moduli. In applicazioni ASP .Net il code-behind si è spesso rivelato una trappola, nel senso che la classe “pagina” contiene una quantità spropositata di codice, ad esempio negli event handlers, alla faccia del concetto di basso accoppiamento;

– Assenza di Unit Test, non nel senso che nessuno li scrive ma nel senso che il Test Driven Development per molti è una sigla non pienamente compresa; in quei pochi scenari in cui ho visto scrivere Unit Tests questi non erano mai strutturati nel modo corretto secondo lo schema arrange-act-assert ma erano per lo più invocazioni di metodi a scopo di debugging. In pratica, più che “Sviluppo guidato dal test” ho visto l’esatto opposto.

Fortunatamente ho anche visto codice scritto benissimo, bene, o almeno in modo decente

Link utili della settimana #8

Super cool MSBuild Debugging in Visual Studio IDE
Questa è una feature eccezionale non ufficialmente supportata. Seguendo il link è possibile scoprire i passi necessari per abilitarla in Visual Studio 2010.

Tool di migrazione VB6 –> VB .NET / C# gratuito
Considerato che è gratuito e che promette bene vale sicuramente la pena provarlo.

Visual Studio 2010 Dark background
Add-in per VS 2010 per impostare dei temi personalizzati circa i colori, tra cui un fantastico Dark

Microsoft ADO .NET Entity Framework Feature CTP4

– Domain Driven Design di Alberto Brandolini  Part 1; Part 2; Part 3

Domain Model Pattern (Martin Fowler)

ASP.NET Multi-Level Drop Down Menu – JQuery

NUnit Result Manager
Web application per tener traccia dei risultati degli unit tests (per project manager & developer)

Uso delle parentesi graffe

Sono sempre stato piuttosto “maniacale” nella scrittura di codice, circa il rispetto delle guidelines e circa uno stile di codifica che aiuti a migliorare la leggibilità dello stesso, e la sua manutenibilità.

Ho sempre sostenuto che il pezzo di codice scritto stilisticamente bene è quello che si “autodocumenta” semplicemente solo leggendolo.

La leggibilità aumenta, a mio parere, anche con opportuni accorgimenti o tecniche, non sempre utilizzati da tutti, anzi spesso ci sono pareri discordanti sull’effettiva utilità di alcune modalità di scrittura.

Mi riferisco, ad esempio, all’utilizzo delle parentesi graffe in alcuni casi particolari dove possono essere evitate (ovviamente il contesto è quello di applicazione scritta in C#, linguaggio principe nel mondo .Net).

A mio avviso, la leggibilità beneficia del fatto di scrivere qualcosa del genere:

if (condizione)
    a = 1;

rispetto a questo codice:

if (condizione)
   {
     a = 1;
   }

Quando mi ritrovo a svolgere code review oppure solo a guardare codice scritto da altri, la tentazione di eliminare le graffe è troppo forte, e, quando posso, finisco per toglierle.

La stessa tecnica la applico al ciclo for, ovviamente anche in questo caso l’istruzione da eseguire deve essere una sola.

Circa le if, sarebbe addirittura più valida l’idea di toglierle proprio, in perfetta aderenza ai principi della campagna anti-if, a cui ho aderito con entusiasmo, anche se qui il contesto è differente poichè le “if” andrebbero usate con parsimonia o evitate del tutto quando particolarmente annidate e ripeture (così come l’istruzione “switch”),  sostituendole con una applicazione più rigorosa dei principi della programmazione ad oggetti, polimorfismo ed ereditarietà in primis.

Settore ingegneristico o artigianale ?

Poichè mi piace tenere insieme i miei pensieri su questo blog, riporto la mia risposta all’amico Andrea Saltarello sullo spinoso tema da lui sollevato in un thread sul forum di GUISA, ovvero “ma siamo solo artigiani ?”

“Hai perfettamente ragione quando affermi che “siamo un settore artigianale”, e ciò dipende a mio avviso
dal fatto che non tutti sono disposti a migliorarsi professionalmente per comprendere “il perchè” piuttosto del “come”.
Molti sanno come impiantare un sito Web MVC; pochi conoscono però il pattern, ancora meno sanno che quel pattern si chiama “Model 2” e non MVC; qualcuno addirittura non conosce nemmeno il significato dell’acronimo, ma tutti però ci spacciamo come architetti poichè, come affermi giustamente, “architetto” è una buzzworld figa da mettere sul bigliettino da visita o nella firma elettronica della mail.
Questo è solo un esempio, ma ne potrei citare molti altri.
Come sicuramente ben sai, esistono realtà IT dove ad una applicazione è richiesto solo che funzioni; non è minimamente richiesto e non si ha nemmeno la consapevolezza dell’importanza di avere software modulare che evolve nel tempo con il minimo impatto sulle funzionalità esistenti.

La qualità del prodotto software è una caratteristica scarsamente apprezzata, anche dagli stessi addetti ai lavori; ciò che conta è consegnare la versione 1 funzionante, per poter fatturare, non importa come viene sviluppata.

Qesto è un settore dove “i fiorellini” non sono richiesti.

Quindi, altro che TDD e sviluppo incrementale… “

Link utili della settimana #7

SILF: Silverlight Install and Logging Framework

How to Use a VBA Macro to Sum Only Visible Cells
Questo me lo appunto perchè davvero utile, e mi chiedo come mai non sia già presente una funzionalità simile  
in  Excel  2007, ovvero la possibilità di sommare solo le celle visibili (vale a dire non filtrate) di un dato range, e non invece tutte le celle, anche quelle filtrate, come invece succede se si usa la classica funzione SUM.
Nota: non sono un programmatore VBA nè mai lo sarò, questo me lo appunto solo perchè molto utile (un tempo sono stato programmatore VB6, ma parlo di 15 anni fa, un’intera era geologica per il mondo dell’informatica).