Fluently.Design().Me: “coding experience requirements”
Perchè una Fluent Interface?
2 motivi:
- è un gran comodo poter “guidare” l’utilizzatore finale facendo si che l’intellisense vi proponga solo le cose sensate per il contesto corrente;
- è un gran facile leggere codice scritto in maniera fluente;
Nonostante sia un fan di Unit testing e di TDD sono soprattutto innamorato di san csc.exe e adoro gli errori del compilatore, quindi tutto ciò che posso far diventare fortemente strongly-typed diventerà fortemente strongly-typed.
Questo effettivamente è terribile:
perchè sbomba da paura a runtime :-)var worker = new BackgroundWorker(); worker.DoWork += ( s, e ) => { var arg = ( int )e.Argument; }; worker.RunWorkerAsync( "this should be an integer :-)" );
Un altro problema…
Scrivo questo:
Notate che l’intellisense mi propone ancora il metodo “AndAfterDo( … )” e pure il metodo “Cancel()” entrambi senza senso in questo contesto? il primo perchè già usato mentre il secondo inutile se il worker non è ancora in esecuzione.
Quindi una delle difficoltà vere del design, e della realizzazione, di una buona Fluent Interface è quella di essere in grado di offrire una “coding experience” degna del suo nome, come ad esempio questa:
dove dopo aver fatto la configurazione del worker posso solo ed esclusivamente mandarlo in esecuzione rendendo di fatto impossibile che il programmatore sbagli ad utilizzare il componente.
Al prossimo giro vediamo come risolvere questo e un altro interessante problema del design di un componente che espone una Fluent Interface.
.m