2. A scuola ci insegnano l’incapsulamento, l’ereditarietà e il polimorfismo Condividiamo: In .NET, l’ereditarietà è il meccanismo in base al quale viene implementato il polimorfismo Questo permette… ...di generalizzare l’uso… …di specializzare il comportamento… Se non uso l’ereditarietà in questo modo, è giusto usarla? L’ereditarietà viene introdotta solo allo scopo di riutilizzare il codice? L’ereditarietà per codice genera un fortissimo accoppiamento nel codice… All’inizio c’era l’ereditarietà
3. L’ereditarietà come riuso è un AntiPattern sono problemi che si incontrano frequentemente durante lo sviluppo dei programmi e che dovrebbero essere evitati http://it.wikipedia.org/wiki/Anti-pattern Dove possibile usare la composizione rispetto all’ereditarietà Usare il Pattern Strategy Definire una famiglia di algoritmi, incapsularli e renderli intercambiabili http://it.wikipedia.org/wiki/Strategy_pattern Diminuire l’accoppiamento Ridurre le dipendenze tra le classi del dominio Usare Dependency Injection Un riassunto lo trovate anche su http://www.slideshare.net/klucrab/antipatterns-i-vizi-del-programmatore Overuse of Inheritance 28/01/2011 3
4. Patterns, Patterns, Patterns! I patterns sono sempre la soluzione L’unico problema ovviamente è scegliere di volta in volta quello giusto Applicati Object Orientation, Strategy Pattern e Dependency Injection, quello che rimane è codice utile, che rispetta dei patterns Elementi comuni (es. proprietà, naming, ecc…) che, nel rispetto dei pattern, si ripetono nella struttura Questo è codice non più generalizzabile… ...altrimenti potrei cadere nel dynamic coding, nel late binding (es. Data Dictionary vs Properties, Reflection o Expressions Trees invece di Metodi) …e perderei l’aiuto dell’Intellisense di Visual Studio Perché non usare la Code Generation?
5. Per applicare dei patterns Per garantire uno stile Per evitare di ripetersi Almeno, non «by hand» Per essere più veloci Perchè usare la Code Generation?
6. Visual Studio dipende pesantemente dalla Code Generation Tutti gli editor di VS, i designer, sono dei Code Generator WinForm DataSet WPF Entity Framework ... Ma sembra che i programmatori non se ne siano mai accorti In che senso? Nel senso che non si sono mai ispirati a questi Code Generator per farsene uno proprio Code Generation, questa sconosciuta
7. Eppure li potremmo usare in tantissimi modi Dati SQL DAL Mapping Codice Generico (infrastruttura) Maschere (forms) Cosa Generare?
8. By Hand XML + XSLT CodeDOM CodeSmith Tools http://www.codesmithtools.com/ NetTiers http://blogs.ugidotnet.org/dsenatore/archive/2009/05/05/.nettiers-pro-e-contro.aspx http://nettiers.com/ LLBLGen http://www.llblgen.com/ Code Generation nella «storia»
9. Brute Force Codice (host) che genera codice Sostanzialmente C#/VB... F#/Ruby/Metaprogramming/DSL Codice (ad altissimo livello) che genera codice È una gran bella strada, più ardua Template-Based Ipotesi: devo generare un testo Tutto ciò che è fisso rispetto alla generazione fa parte del testo del template e non del codice Molto più manutenibile (quasi stilizzabile) Approcci
10. WPF, ASP.NET, EF ...sono Framework Un file .aspx, .(cs/vb)html, .xaml, .edmx, altro non sono che templates Il fatto che siano (o no) T4 è un dettaglio .NET 4.0
16. Code Generation con i Templates T4 in Visual Studio TEXTTEMPLATINGTRANSFORMATIONTOOLKIT
17. È basato sui marcatori È definito in termini di Processing Directives Text Blocks Code Blocks Statement Blocks Expression Blocks Class Features Blocks T4 means «Template»
21. Data Source Trasformare dati, da un formato ad un altro Da Excel… …a Xml o SQL …a codice C# per caricare oggetti da salvare in DataContext EF Ottimo nel periodo in cui si modella i DataContext e si può ogni volta ripartire Dati “tipizzati”
22. Utile per l’approccio POCO Utile per poter generare set di entità diverse adornate da attributi specifici DataContract/DataMember (WCF) DataAnnotations (EF, ASP.NET MVC) Utile per creare oggetti appartenenti ad un framework (eredità da classe base) Models
23. Generare infrastrutture di accesso ai dati OR/M Implementare Patterns Repository ActiveRecord Data Access
24. Descrivere Entità o Contratti in un linguaggio ad alto livello Anche un file Xml lo è Bello sarebbe un testo scritto parsato con ANTLR Genera codice compilato nel progetto Si descrivono le metafore esplicitando i dati utili e rendendo di default ciò che non è importante Domain Specific Languages
25. Strumenti Traversali Partial Classes Ottime per aggiungere membri custom Ottime per implementare interfacce Partial Methods Ottimi per intercettare momenti (opzionali) di get/set delle proprietà Come una callback, solo tipizzata e statica (non delegati) 1 file per partial class 1 file ttn files generati
26. Code Generation con i templates T4in Visual Studio Conclusioni Marco Parenzan
27. T4 usato con soddisfazione: Ottimo supporto in fase di disegno dei dati per preparare dei DB di partenza (insert dei dati da codice C#, con il generatore di codice genera le insert) Ottimo supporto in fase di progettazione per poter adattare il codice quando si è in fase di prototipazione Ottimo supporto in fase di manutenzione per poter “propagare” l’aggiunta di un dato in tutti i tiers (CRUD) T4 usato con difficoltà: L’editor free aiuta fino ad un certo punto… …bisogna essere metodici nella scrittura del codice del template per non perdere il filo (apertura e chiusura dei marcatori) Mai più senza Conclusioni
28. Futuro Una toolbox fatta di templates Uno “stack” di templates come da demo Più formale e strutturato (LightSwitchT4 ) Confrontarsi con la community sull’uso della Code Generation con il M-V-VM
29. Link Marco Parenzan http://blog.codeisvalue.com/ marco.parenzan@libero.it http://www.codeisvalue.com/ http://www.slideshare.com/marco.parenzan marco_parenzan