lunedì 21 giugno 2010 #

C# è già vecchio?

Quest’anno ho avuto la possibilità di partecipare alla NDC2010, una delle migliori conferenze a cui abbia mai partecipato sia per la qualità delle sessioni che degli speaker presenti.

Ho seguito alcune sessioni (e discussioni) su Ruby/IronRuby di Scott Bellware e Shay Friedman che mi hanno portato ad alcune riflessioni sulle quali sto ancora ragionando e che vorrei condividere.

C# è senza dubbio un bellissimo linguaggio, appena ho iniziato a lavorarci (parliamo del 2001) ho amato il suo rigore la sua sinteticità e la sua eleganza. Ho sempre amato il fatto che i metodi non sono virtuali per default che posso dichiarare una classe sealed cosi che nessuno possa ereditarla e gli altri costrutti che in qualche modo proteggono il mio codice da un uso improprio.

Poi ho scoperto Ruby, beh a dire il vero l’ho scoperto qualche anno fa, ma solo negli ultimi mesi ho iniziato seriamente a provarlo e a farci qualcosa di concreto.

Ruby è un linguaggio semplice, senza vincoli la sua natura dinamica permette di fare cose fuori dal controllo di un programmatore inesperto.

Imparare Ruby mi sta facendo cambiare alcune opinioni su C# che in confronto è molto più “cerimonioso” e ingessato di Ruby.

Inoltre, quei costrutti citati prima, che da un lato sembrano aiutarci a rendere le nostre classi più solide in realtà rendono molto problematico il testing della classe stessa (a tal proposito consiglio la visione della sessione di Michael Feather sul tema della testabilità di C#).

Molti ritengono che C# sia più protettivo rispetto a Ruby (o ad altri linguaggi dinamici) perchè il compilatore, il type system, l’intellisense, ecc... aiutano a commettere meno errori, ma, visto che siamo professionisti, ne abbiamo davvero bisogno? Non li vedete come dei limiti alla vostra creatività e produttività?

Pensate che piloti di formula 1 usino l’ABS?

Anche C# versione dopo versione va nella direzione dei linguaggi dinamici, ma forse le sue radici non lo renderanno mai libero come altri linguaggi. E’ giunta l’ora di ricominciare a guardarsi in giro?

Per ora sono solo pensieri sparsi, idee, dubbi, s#$£e mentali, sui quali però mi piacerebbe discuterne….magari in una delle prossime conf.

posted @ lunedì 21 giugno 2010 15.42 | Feedback (13)

martedì 18 maggio 2010 #

Primo NHibernate Day

Come già annunciato poco fa da Simone qui il 9 ottobre a Bologna si terrà il primo NHibernate day.

NHDay

L’evento è organizzato da UgiALT.NET insieme a DotNetMarche e sarà un’intera giornata dedicata al noto ORM e a tutto il mondo della persistenza.

La giornata è organizzata su due tracce, sulla principale si tratteranno temi avanzati riguardanti NHibernate mentre la seconda sala sarà a tema libero con la possibilità di organizzare Open space, Coding Dojo, Discussioni, Confronti e tutto ciò che vi viene in mente.

Avremo importanti (-issimi) speaker internazionali che ci parleranno degli internals di NH per questo molte sessioni saranno in inglese.

E’ aperto Call for Presenters per tutti coloro che vogliono proporre una sessione (e ci aspettiamo varie proposte da tutti voi) basta mandare una mail a cfp@ugialt.net con una descrizione della sessione/open space/code kata/ecc… che volete organizzare.

Il 15 giugno apriremo le iscrizioni e le donazioni. Come nelle precedenti edizioni la conferenza è autofinanziata quindi gli iscritti se vorranno potranno fare una piccola donazione per aiutarci a coprire le spese. I posti sono limitati quindi tenete d’occhio il calendario i blog e twitter (#nhday)per essere informati sulle modalità d’iscrizione.

posted @ martedì 18 maggio 2010 11.01 | Feedback (9)

mercoledì 21 aprile 2010 #

Eliminare gli if con i dictionary

Talvolta si trova questo codice usato (ad esempio) nei ValueConverter di WPF:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
  MyEnum myValue = (MyEnum)value;
  String imageUri;
  switch(myValue)
  {
    case MyEnum.Value1: 
      imageUri = "...";
      break;
    case MyEnum.Value2: 
      imageUri = "...";
      break;
    case MyEnum.Value3: 
      imageUri = "...";
      break;
  }
  return new Uri(imageUri , UriKind.Relative);
}

La presenza di questo tipo di switch, sebbene non sia in parti core dell’applicazione (è un semplice converter) mi infastidisce sempre, sarà per quell’indice di complessità che cresce per ogni nuovo caso.

Spesso la rimozione degli if si risolve con l’uso del polimorfismo, ma in questo caso potrebbe essere più comodo utilizzare un dictionary per memorizzare le associazioni enumerator – immagine:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
  IDictionary<MyEnum, string> dictionary = new Dictionary<MyEnum, string>();
  dictionary.Add(MyEnum.Value1, "...");
  dictionary.Add(MyEnum.Value2, "...");
  dictionary.Add(MyEnum.Value3, "...");

  MyEnum myValue= (MyEnum) value;
  return new Uri(dictionary[myValue] , UriKind.Relative);
}

Come potete vedere (a parte alcuni dettagli implementativi che ho omesso) abbiamo rimosso completamente gli if riducendo notevolmente la complessità e aumentando la manutenibilità generale del metodo.

PS Con questa tecnica inoltre, il dictionary può essere caricato da una risorsa esterna con tutti i vantaggi che ne conseguono.

posted @ mercoledì 21 aprile 2010 18.25 | Feedback (5)

giovedì 1 aprile 2010 #

ViewModel grassi e domini anemici

Il pattern del 2009, per noi sviluppatori Micorosoft, è stato senza dubbio il “Model-View-ViewModel”. L’abbiamo usato con Silverlight, con WPF, qualcuno con ASP.NET MVC ha fatto qualcosa di simile e perfino gli sfortunati che ancora lavorano con WindowsForms hanno provato ad utilizzarlo.

Costruire appplicazioni che usano questo pattern porta spesso ad avere un domain model anemico perchè si tende a spalmare un po’ di logica nei VM e un po’ nei servizi. Di questo ne abbiamo parlato anche sulla ML di ugialt.net.

A mio avviso, se all’inizio questo non è un problema, man mano che l’applicazione cresce si sente la mancanza di un po’ di logica sugli oggetti del DM e ci si ritrova con piccole duplicazioni di codice abbastanza puzzolenti.

Quindi, finchè l’applicazione ha dimensioni medio-piccole possiamo sopravvivere utilizzando i ViewModel++ e usando dei DTO (ossia il domain model anemico) per passare le informazioni dai servizi (model) alle View (anche se mi chiedo perchè usare dei DTO quando potrei far riempire ai servizi direttamente il VM). Se l’applicazione cresce è però conveniente estrapolare la logica dai VM e portarla negli oggetti di dominio.

Sto facendo del refactoring su un’applicazione nata “piccola” ma che sta crescendo bene. Vedremo se i risultati saranno buoni dopo questa rifattorizzazione.

posted @ giovedì 1 aprile 2010 18.49 | Feedback (4)

giovedì 28 gennaio 2010 #

Corso TDD a Bologna

Segnalo agli interessati che il 25 e 26 Febbraio terrò a Bologna un’altra edizione del corso sul Test Driven Development. Il corso avrà un taglio molto pratico cosi da permettere ai partecipanti di sporcarsi le mani con i test e con i mock objects.

Maggiori informazioni qui: http://www.overneteducation.it/F_Corsi_detail.aspx?Cod_Corso=SQM006 Oppure contattatemi direttamente per saperne di più.

posted @ giovedì 28 gennaio 2010 12.12 | Feedback (12)

giovedì 14 gennaio 2010 #

WPF ed ereditarietà visuale

Una delle “mancanze” che alcuni lamentano in WPF è l’assenza dell’ereditarietà visuale delle Window e dei UserControl.

In realtà (come per le griglie :-)) non è un problema, esistono semplici meccanismi che permettono di ottenere lo stesso risultato.

Una delle tecniche è quella di utilizzare un template per stilare una BaseWindow o un BaseControl:

Supponiamo di avere una BaseView (Window) base dalla quale facciamo derivare tutte le finestre della nostra applicazione:

Definiremo una classe BaseView che eredita da Window e avrà tutti i metodi/propriertà necessarie:

public class BaseView : Window
{
  // ...
}
 

Questa è solo una classe e non ha parte visuale.

La parte “visuale” la disegno con Expression Blend come stile della BaseView e vado a ridefinire il ControlTemplate mettendo al suo interno tutti i controlli che voglio vedere in tutte le finestre che ereditano:

    <Style TargetType="{x:Type Common:BaseView}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Common:BaseView}">
                    <StacckPanel>
                            <!-- Altri controlli: toolbar? -->
                            <ContentPresenter/>
                            <!-- Altri controlli: footer? -->
                      </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Questo stile viene poi applicato a tutte i controlli di tipo BaseView che avranno quindi tutti un aspetto comune.

Quindi per sfruttare il template è sufficiente che le finestre dell'applicazione ereditino da BaseView:

<MyApplication:BaseView>
....
</MyApplication:BaseView>

UPDATE: ho messo un progetto d’esempio qui.

Technorati Tags: ,,

posted @ giovedì 14 gennaio 2010 19.34 | Feedback (19)

mercoledì 6 gennaio 2010 #

Esperimenti con MongoDb

Durante questo periodo di ferie ho potuto affrontare alcuni temi presenti nella mia personale lista dei “TO-DO”.

Il rumore intorno ai Database Documentali e al movimento #NoSQL sta crescendo grazie anche al fatto che grandi nomi (Facebook, Amazon, SourceForge e altri) li usano da tempo in produzione.

Cosi ho scaricato gli eseguibili di MongoDB e il relativo driver C# ed ho scritto un primo esempio di utilizzo.

Il server è un’applicazione console (che può essere installata come servizio) che rimane in ascolto su una certa porta (configurabile):

D:\mongodb-win32-x86_64-1.2.1\bin>mongod.exe --dbpath ./data
 
Tue Jan 05 19:16:20 Mongo DB : starting : pid = 0 port = 27017 dbpath = ./data master = 0 slave = 0  64-bit
Tue Jan 05 19:16:20 db version v1.2.1, pdfile version 4.5
Tue Jan 05 19:16:20 git version: 45992de574979343f34fdfe96b069d5d1eff0182
Tue Jan 05 19:16:20 sys info: windows (6, 0, 6002, 2, 'Service Pack 2') BOOST_LIB_VERSION=1_39
Tue Jan 05 19:16:20 waiting for connections on port 27017

Cosi il server è avviato e in ascolto per eventuali comandi. Non ho creato nessun database per ora.

Da visual studio ho creato un mini progetto per fare alcuni esperimenti:

Mongo mongo = new Mongo();
mongo.Connect();
Database db = mongo.getDB("MyTestDb");
IMongoCollection posts = db.GetCollection("Persons");
 
Document doc = new Document();
doc["Name"] = "Emanele";
doc["Surname"] = "DelBono";
posts.Insert(doc);
 
Document example = new Document();
example["Name"] = "Emanuele";
ICursor cursor = posts.Find(example);
foreach (Document document in cursor.Documents)
{
  Console.WriteLine(document.ToString());
}

Nel primo blocco creo un database “MyDbTest” e seleziono la collection su cui lavorare (“Persons”).

Poi creo un nuovo documento. La classe Document, messa a disposizione dal driver C#, rappresenta un “chunk” di informazione da salvare nel database. Alla base è un Dictionary in cui key, value raprresentano nome della proprietà e valore ma può contenere qualsiasi tipo di gerarchia complessa. Internamente i dati sono memorizzati in JSON (come molti database documentali).

Il documento creato viene salvato nel database usando l’istruzione insert.

Nell’ultimo blocco vado a recuperare l’informazione. Nello specifico costruisco un documento che fa da “esempio” per la ricerca e il metodo Find estrae tutti i documenti che hanno la chiave Name = “Emanuele”.

Insomma, il succo della semplicità, più di cosi non si può pretendere. Le performance sembrano buone, ci sono altri metodi per estrapolare le informazioni in modo più mirato, supporta lo storage per grossi documenti (video, foto, ecc…).

Sicuramente bisogna lavorarci un po’ per capirne i limiti e apprezzarne ancora di più i pregi, ma l’inizio è fantastico (e sta, ripeto, nella semplicità) e in applicazioni non troppo complesse dal punto di vista dei dati sembra essere l’ottimo: pensate ad un blog engine in cui potete salvare un intero post (con testo, foto, commenti, tags, ecc…) con una semplice insert di un Documento.

Sul sito di MongoDB trovate molta documentazione.

Nel frattempo i miei esperimenti continueranno (spero). Sto provando a scrivere un mapper che permette di trasformare oggetti di dominio in Document cosi da evitare il mapping manuale. Dovrebbe essere abbastanza semplice prendendo spunto dai vari serializzatori e deserializzatori JSON.

posted @ mercoledì 6 gennaio 2010 11.57 | Feedback (12)

sabato 28 novembre 2009 #

V UgiALT.net Conference: a che punto siamo

Lunedi scorso alle ore 10.00 AM abbiamo ufficialmente aperto le iscrizioni tramite il sito http://conference.ugialt.net e i 130 posti disponibili si sono esauriti in meno di 9 ore. Il record va a Andrea Balducci che si è iscritto alle ore 10:00:16 e si aggiudica il  premio per il partecipante più agile!

I posti sono esauriti, adesso siamo a 165 iscritti, ma consiglio a tutti coloro che vorrebbero partecipare di mettersi comunque in lista, sicuramente alcuni posti si libereranno e la coda si accorcierà.

Buona anche la raccolta donazioni, quest’anno avremo alcuni speaker stranieri e stiamo raccogliendo un po’ di soldi per riuscire a ripagarli i costi di viaggio, quindi se siete iscritti e non l’avete ancora fatto potete donare qualcosa tramite paypal cliccando qui.

La cosa interessante è tutti gli iscritti lo hanno fatto sulla fiducia. Infatti solo questa settimana abbiamo iniziato a pubblicare stralci di agenda ma la raccolta delle sessioni non è ancora terminata.

Potete trovare l’elenco delle sessioni fin’ora proposte qui. Come vedrete ce n’è per tutti i gusti: Monotouch, Distributed Version Control, Database Documentali e Relazionali, BDD, Jquery, REST, DDD, HTML5, Validazione e altri ancora.

Quindi le premesse ci sono tutte, nelle prossime settimane definiremo l’agenda definitiva e dopo Natale ci dedicheremo alla logistica, ai libri e alle licenze omaggio che stiamo raccogliendo dagli sponsors.

 

Technorati Tags: ,

posted @ sabato 28 novembre 2009 17.51 | Feedback (15)

domenica 15 novembre 2009 #

Avoid DataGrid (Seconda puntata)

In un mio  post di qualche giorno fa ho scritto di come la pigrizia dei programmatori porta spesso ad un uso spropositato e inopportuno della “mitica” DataGrid.

Volevo riportare alcuni esempi per dimostrare che si può vivere felici anche senza usare la datagrid, ma prima voglio fare alcune premesse. La DataGrid spesso arriva perchè qualcuno ha pensato male alla gestione delle informazioni:

1) Se a seguito di una ricerca o all’apertura di una pagina/form visualizzate una griglia con n-mila righe in decine di pagine avete un problema: visualizzare più di 20-30 record e visualizzarne 1000 è la stessa cosa: l’utente non sta trovando quello che cerca. Se una ricerca ritorna più di 20 record sarebbe meglio consigliare all’utente di cambiare le chiavi di ricerca: chi è mai arrivato a pagina 3 della ricerca di google? Se non trovo qualcosa in pagina 1 (o al massimo in pagina 2) rifaccio la ricerca. Impiego meno tempo!

2) Se visualizzare più di 5 campi avete un problema: che senso ha visulizzare subito tutte le informazioni di una persona in una griglia di 15 colonne? Date la possibilità all’utente di identificare la persona cercata (nome e cognome) e usate un modo alternativo per visualizzare i dettagli solo quando e se serve.

3) Se fate l’editing in griglia avete un problema: l’editing in-line è scomodo per l’utente, non permette di visualizzare agevolmente tutte le informazioni, lascia poco spazio per gli evenutali messaggi d’errore ed esteticamente è brutto.

Detto ciò, ecco alcuni esempi, trovati in rete, per mostrare un elenco di record che non sia una griglia :

shot_000015

shot_000016

shot_000017

shot_000018

 

 

 

shot_000019   shot_000020

Capture3

Technorati Tags: ,,

posted @ venerdì 27 novembre 2009 0.00 | Feedback (16)

domenica 22 novembre 2009 #

Agile Day 2009

Venerdi scorso a Bologna si è tenuto il sesto Agile Day una conferenza nazionale dedicata alle tematiche della progettazione e sviluppo agile delle applicazioni.

Ritengo senza dubbio che sia la migliore conferenza in Italia a cui uno sviluppatore/manager/cliente possa partecipare. A differenza delle altre è una giornata in cui impari cose che non troverai mai in un libro o in blog, è una conferenza da cui torni  pieno di idee e di spunti per migliorare il tuo modo di lavorare.

La caratteristica più interessante è la possibilità di organizzare openspace al volo, e così fuori programma nel pomeriggio Alberto Brandolini ha tenuto una sessione dedicata al DDD affrontandolo con un approccio molto diverso da come siamo abituati parlando di contesti e  discutendo casi reali.

Molto interessante anche la sessione di apertura di Peter Steven che ha spiegato come l’unico modo per affrontare con successo un progetto fixed price sia quello di farlo in modo agile (sul suo blog trovate le slide della sessione).

Poi tutte le chiacchierate con i tanti amici che hanno partecipato!

Per finire: fantastica la cena Bolognese doc.

PS. Per chi volesse demo e slide della sessione mia e di Alessandro sulla Continuous Integration li può scaricare da qui.

 

Technorati Tags:

posted @ domenica 22 novembre 2009 19.02 | Feedback (8)