SlideShare une entreprise Scribd logo
1  sur  28
Code Generation con i Templates T4in Visual Studio Marco Parenzan
All’inizio c’era l’ereditarietà 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… 28/01/2011 www.xedotnet.org 2
Overuse of Inheritance 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 28/01/2011 www.xedotnet.org 3
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?
Perchè usare la Code Generation? Per applicare dei patterns Per garantire uno stile Per evitare di ripetersi Almeno, non «by hand» Per essere più veloci 28/01/2011 www.xedotnet.org 5
Code Generation, questa sconosciuta 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 28/01/2011 www.xedotnet.org 6
Cosa Generare? Eppure li potremmo usare in tantissimi modi Dati SQL DAL Mapping Codice Generico (infrastruttura) Maschere (forms) 28/01/2011 www.xedotnet.org 7
Code Generation nella «storia» By Hand XML + XSLT CodeDOM CodeSmith Tools http://www.codesmithtools.com/ Abbiamo visto netTiers nel 2009 (Venerdì 8 maggio) con Davide Senatore http://blogs.ugidotnet.org/dsenatore/archive/2009/05/05/.nettiers-pro-e-contro.aspx http://nettiers.com/ LLBLGen http://www.llblgen.com/ 28/01/2011 www.xedotnet.org 8
Approcci 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) 28/01/2011 www.xedotnet.org 9
.NET 4.0 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 28/01/2011 www.xedotnet.org 10
...e poi arrivò T4 ...in realtà è arrivato nel 2005! ...ma in pochi se ne sono accorti Una delle attività del gruppo VSX (ovvero Visual Studio e il suo ecosistema) Framework sviluppato da Microsoft e disponibile SEMPRE in Visual Studio dalla 2005 ,[object Object]
Bisogna scaricare dei plug-inClarius ,[object Object]
Ancora in BetaTangible T4 Editor plus modeling tools for VS2010 ,[object Object]
http://visualstudiogallery.msdn.microsoft.com/60297607-5fd4-4da4-97e1-3715e90c1a23/28/01/2011 www.xedotnet.org 11
Code Generation con i Templates T4 in Visual Studio Introduzione a t4
Code Generation con i Templates T4 in Visual Studio TEXTTEMPLATINGTRANSFORMATIONTOOLKIT
T4 means «Template» <#@template language=“C#” #> Hello <# Write(”World!”) #> È basato sui marcatori  È definito in termini di Processing Directives Text Blocks Code Blocks Expression Blocks Class Features Blocks 28/01/2011 www.xedotnet.org 14
Come funziona
Come funziona
Code Generation con i Templates T4 in Visual Studio Casi d’uso
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”
Models 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)
Data Access Generare infrastrutture di accesso ai dati OR/M Implementare Patterns Repository ActiveRecord
Domain Specific Languages 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
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 ttn files generati
Code Generation con i Templates T4 in Visual Studio Casi d’uso
Code Generation con i templates T4in Visual Studio Conclusioni Marco Parenzan
Conclusioni 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 28/01/2011 www.xedotnet.org 25

Contenu connexe

Similaire à Code Generation con i templates T4 in visual studio

Generazione automatica diagrammi di rete con template pptx
Generazione automatica diagrammi di rete con template pptxGenerazione automatica diagrammi di rete con template pptx
Generazione automatica diagrammi di rete con template pptx
GiacomoZorzin
 
Entity Framework 7, Back To The Future!
Entity Framework 7, Back To The Future!Entity Framework 7, Back To The Future!
Entity Framework 7, Back To The Future!
Michael Denny
 
Codice di qualità con VS2010 (TDD)
Codice di qualità con VS2010 (TDD)Codice di qualità con VS2010 (TDD)
Codice di qualità con VS2010 (TDD)
XeDotNet
 
Silverlight in Action
Silverlight in ActionSilverlight in Action
Silverlight in Action
DotNetMarche
 
Alla scoperta di Zend Framework 1.8
Alla scoperta di Zend Framework 1.8Alla scoperta di Zend Framework 1.8
Alla scoperta di Zend Framework 1.8
massimiliano.wosz
 

Similaire à Code Generation con i templates T4 in visual studio (20)

Il buon programmatore - consigli pratici per una vita felice
Il buon programmatore - consigli pratici per una vita feliceIl buon programmatore - consigli pratici per una vita felice
Il buon programmatore - consigli pratici per una vita felice
 
Meetup DotNetCode A.I. Bot Framework and Azure Functions
Meetup DotNetCode A.I. Bot Framework and Azure FunctionsMeetup DotNetCode A.I. Bot Framework and Azure Functions
Meetup DotNetCode A.I. Bot Framework and Azure Functions
 
Generazione automatica diagrammi di rete con template pptx
Generazione automatica diagrammi di rete con template pptxGenerazione automatica diagrammi di rete con template pptx
Generazione automatica diagrammi di rete con template pptx
 
NEXiDA Smart User Interface flyer (italian)
NEXiDA Smart User Interface flyer (italian)NEXiDA Smart User Interface flyer (italian)
NEXiDA Smart User Interface flyer (italian)
 
Entity Framework 7, Back To The Future!
Entity Framework 7, Back To The Future!Entity Framework 7, Back To The Future!
Entity Framework 7, Back To The Future!
 
Microsoft Fast - Overview
Microsoft Fast - OverviewMicrosoft Fast - Overview
Microsoft Fast - Overview
 
2014.04.04 Sviluppare applicazioni web (completamente) on line con Visual Stu...
2014.04.04 Sviluppare applicazioni web (completamente) on line con Visual Stu...2014.04.04 Sviluppare applicazioni web (completamente) on line con Visual Stu...
2014.04.04 Sviluppare applicazioni web (completamente) on line con Visual Stu...
 
Lavorare con applicazioni Brownfield: il caso di 39x27.com
Lavorare con applicazioni Brownfield: il caso di 39x27.comLavorare con applicazioni Brownfield: il caso di 39x27.com
Lavorare con applicazioni Brownfield: il caso di 39x27.com
 
Webcast - Introduzione a Visual Studio Online
Webcast - Introduzione a Visual Studio OnlineWebcast - Introduzione a Visual Studio Online
Webcast - Introduzione a Visual Studio Online
 
Machine learning models continuous deployment on azure using devops
Machine learning models continuous deployment on azure using devopsMachine learning models continuous deployment on azure using devops
Machine learning models continuous deployment on azure using devops
 
Codice di qualità con VS2010 (TDD)
Codice di qualità con VS2010 (TDD)Codice di qualità con VS2010 (TDD)
Codice di qualità con VS2010 (TDD)
 
Exploring VS Code
Exploring VS CodeExploring VS Code
Exploring VS Code
 
Mobile development .net
Mobile development .netMobile development .net
Mobile development .net
 
Silverlight in Action
Silverlight in ActionSilverlight in Action
Silverlight in Action
 
Loosely Coupled Complexity - Unleash the power of your domain model
Loosely Coupled Complexity - Unleash the power of your domain modelLoosely Coupled Complexity - Unleash the power of your domain model
Loosely Coupled Complexity - Unleash the power of your domain model
 
Smart api
Smart apiSmart api
Smart api
 
Angular kit e Design system del Paese - Meetup ngRome 30 Gennaio 2023
Angular kit e Design system del Paese - Meetup ngRome 30 Gennaio 2023Angular kit e Design system del Paese - Meetup ngRome 30 Gennaio 2023
Angular kit e Design system del Paese - Meetup ngRome 30 Gennaio 2023
 
Alla scoperta di Zend Framework 1.8
Alla scoperta di Zend Framework 1.8Alla scoperta di Zend Framework 1.8
Alla scoperta di Zend Framework 1.8
 
Reportage Delphi Day 2012
Reportage Delphi Day 2012Reportage Delphi Day 2012
Reportage Delphi Day 2012
 
Tech Webinar: Firefox Developer Tool
Tech Webinar: Firefox Developer ToolTech Webinar: Firefox Developer Tool
Tech Webinar: Firefox Developer Tool
 

Plus de Marco Parenzan

Plus de Marco Parenzan (20)

Azure IoT Central per lo SCADA engineer
Azure IoT Central per lo SCADA engineerAzure IoT Central per lo SCADA engineer
Azure IoT Central per lo SCADA engineer
 
Azure Hybrid @ Home
Azure Hybrid @ HomeAzure Hybrid @ Home
Azure Hybrid @ Home
 
Static abstract members nelle interfacce di C# 11 e dintorni di .NET 7.pptx
Static abstract members nelle interfacce di C# 11 e dintorni di .NET 7.pptxStatic abstract members nelle interfacce di C# 11 e dintorni di .NET 7.pptx
Static abstract members nelle interfacce di C# 11 e dintorni di .NET 7.pptx
 
Azure Synapse Analytics for your IoT Solutions
Azure Synapse Analytics for your IoT SolutionsAzure Synapse Analytics for your IoT Solutions
Azure Synapse Analytics for your IoT Solutions
 
Power BI Streaming Data Flow e Azure IoT Central
Power BI Streaming Data Flow e Azure IoT Central Power BI Streaming Data Flow e Azure IoT Central
Power BI Streaming Data Flow e Azure IoT Central
 
Power BI Streaming Data Flow e Azure IoT Central
Power BI Streaming Data Flow e Azure IoT CentralPower BI Streaming Data Flow e Azure IoT Central
Power BI Streaming Data Flow e Azure IoT Central
 
Power BI Streaming Data Flow e Azure IoT Central
Power BI Streaming Data Flow e Azure IoT CentralPower BI Streaming Data Flow e Azure IoT Central
Power BI Streaming Data Flow e Azure IoT Central
 
Developing Actors in Azure with .net
Developing Actors in Azure with .netDeveloping Actors in Azure with .net
Developing Actors in Azure with .net
 
Math with .NET for you and Azure
Math with .NET for you and AzureMath with .NET for you and Azure
Math with .NET for you and Azure
 
Power BI data flow and Azure IoT Central
Power BI data flow and Azure IoT CentralPower BI data flow and Azure IoT Central
Power BI data flow and Azure IoT Central
 
.net for fun: write a Christmas videogame
.net for fun: write a Christmas videogame.net for fun: write a Christmas videogame
.net for fun: write a Christmas videogame
 
Building IoT infrastructure on edge with .net, Raspberry PI and ESP32 to conn...
Building IoT infrastructure on edge with .net, Raspberry PI and ESP32 to conn...Building IoT infrastructure on edge with .net, Raspberry PI and ESP32 to conn...
Building IoT infrastructure on edge with .net, Raspberry PI and ESP32 to conn...
 
Anomaly Detection with Azure and .NET
Anomaly Detection with Azure and .NETAnomaly Detection with Azure and .NET
Anomaly Detection with Azure and .NET
 
Deploy Microsoft Azure Data Solutions
Deploy Microsoft Azure Data SolutionsDeploy Microsoft Azure Data Solutions
Deploy Microsoft Azure Data Solutions
 
Deep Dive Time Series Anomaly Detection in Azure with dotnet
Deep Dive Time Series Anomaly Detection in Azure with dotnetDeep Dive Time Series Anomaly Detection in Azure with dotnet
Deep Dive Time Series Anomaly Detection in Azure with dotnet
 
Azure IoT Central
Azure IoT CentralAzure IoT Central
Azure IoT Central
 
Anomaly Detection with Azure and .net
Anomaly Detection with Azure and .netAnomaly Detection with Azure and .net
Anomaly Detection with Azure and .net
 
Code Generation for Azure with .net
Code Generation for Azure with .netCode Generation for Azure with .net
Code Generation for Azure with .net
 
Running Kafka and Spark on Raspberry PI with Azure and some .net magic
Running Kafka and Spark on Raspberry PI with Azure and some .net magicRunning Kafka and Spark on Raspberry PI with Azure and some .net magic
Running Kafka and Spark on Raspberry PI with Azure and some .net magic
 
Time Series Anomaly Detection with Azure and .NETT
Time Series Anomaly Detection with Azure and .NETTTime Series Anomaly Detection with Azure and .NETT
Time Series Anomaly Detection with Azure and .NETT
 

Code Generation con i templates T4 in visual studio

  • 1. Code Generation con i Templates T4in Visual Studio Marco Parenzan
  • 2. All’inizio c’era l’ereditarietà 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… 28/01/2011 www.xedotnet.org 2
  • 3. Overuse of Inheritance 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 28/01/2011 www.xedotnet.org 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. Perchè usare la Code Generation? Per applicare dei patterns Per garantire uno stile Per evitare di ripetersi Almeno, non «by hand» Per essere più veloci 28/01/2011 www.xedotnet.org 5
  • 6. Code Generation, questa sconosciuta 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 28/01/2011 www.xedotnet.org 6
  • 7. Cosa Generare? Eppure li potremmo usare in tantissimi modi Dati SQL DAL Mapping Codice Generico (infrastruttura) Maschere (forms) 28/01/2011 www.xedotnet.org 7
  • 8. Code Generation nella «storia» By Hand XML + XSLT CodeDOM CodeSmith Tools http://www.codesmithtools.com/ Abbiamo visto netTiers nel 2009 (Venerdì 8 maggio) con Davide Senatore http://blogs.ugidotnet.org/dsenatore/archive/2009/05/05/.nettiers-pro-e-contro.aspx http://nettiers.com/ LLBLGen http://www.llblgen.com/ 28/01/2011 www.xedotnet.org 8
  • 9. Approcci 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) 28/01/2011 www.xedotnet.org 9
  • 10. .NET 4.0 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 28/01/2011 www.xedotnet.org 10
  • 11.
  • 12.
  • 13.
  • 15. Code Generation con i Templates T4 in Visual Studio Introduzione a t4
  • 16. Code Generation con i Templates T4 in Visual Studio TEXTTEMPLATINGTRANSFORMATIONTOOLKIT
  • 17. T4 means «Template» <#@template language=“C#” #> Hello <# Write(”World!”) #> È basato sui marcatori È definito in termini di Processing Directives Text Blocks Code Blocks Expression Blocks Class Features Blocks 28/01/2011 www.xedotnet.org 14
  • 20. Code Generation con i Templates T4 in Visual Studio Casi d’uso
  • 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. Models 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)
  • 23. Data Access Generare infrastrutture di accesso ai dati OR/M Implementare Patterns Repository ActiveRecord
  • 24. Domain Specific Languages 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
  • 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 ttn files generati
  • 26. Code Generation con i Templates T4 in Visual Studio Casi d’uso
  • 27. Code Generation con i templates T4in Visual Studio Conclusioni Marco Parenzan
  • 28. Conclusioni 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 28/01/2011 www.xedotnet.org 25
  • 29. 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
  • 30. Blogs e Libri Libri??? Practical Code Generation in .NETPeter Vogelhttp://www.amazon.com/Practical-Code-Generation-NET-Addison-Wesley/dp/0321606787/ref=sr_1_1?ie=UTF8&qid=1295929709&sr=8-1 (Vecchi) Libri sulla Code Generation Code Generation in Microsoft .NETKathleen Dollardhttp://www.amazon.com/Code-Generation-Microsoft-Kathleen-Dollard/dp/1590591372/ref=sr_1_1?ie=UTF8&s=books&qid=1295930865&sr=1-1 Code Generation in ActionJack Herringtonhttp://www.amazon.com/Code-Generation-Action-Jack-Herrington/dp/1930110979/ref=sr_1_2?ie=UTF8&qid=1295929709&sr=8-2 Blogs Oleg Sychhttp://www.olegsych.com/ Daniel Cazzulinohttp://weblogs.asp.net/cazzu/ 28/01/2011 www.xedotnet.org 27
  • 31. Link www.xedotnet.org 28 Marco Parenzan http://blog.codeisvalue.com/ marco.parenzan@libero.it http://www.codeisvalue.com/ marco_parenzan http://www.slideshare.com/marco.parenzan