odessa .net user group - 10.11.2011 - applied code generation

66
@dmytromindra APPLIED CODE GENERATION IN .NET Dmytro Mindra Lohika, Odessa

Upload: dmytro-mindra

Post on 05-Dec-2014

588 views

Category:

Technology


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

APPLIED CODE GENERATION IN .NET

Dmytro MindraLohika, Odessa

Page 2: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Page 3: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

The question of Origin ?

• We are engineers !

• Engineers’ time is valuable and expensive;

• Engineers don’t like repetitive tasks;

Page 4: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Task classification

• Brains

• Experience

• Procedures

Page 5: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Houston, we’ve got a problem !

Our business domain contains 500+ entities.

Each entity needs CRUD.

Page 6: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Houston, we’ve got a problem !

And you have lots of time.

The whole 4 months.

For your big team of 4 developers that should not be a problem !

Page 7: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Houston, we’ve got a problem !

Oh, and we’re not sure which parts will stay generic and which won’t

Page 8: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Houston, we’ve got a problem !

Be agile, don’t wait for the analysts to finish their job, because we don’t have that kind of time.

Just change your code when the Requirements are finished.

Page 9: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Houston, we’ve got a problem !

For each domain entity we should have

• Stored Procedures

• Repository

• Service

• Controller

• Views

• etc

That’s about 1000 lines of code per entity.

Page 10: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Houston, we’ve got a problem !

But we have 500+ entities

500*1000 = 500000 lines of code.

Who wants to type this in ?

Page 11: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Houston, we’ve got a problem !

• And when the changes arrive someone should make corrections to 500*1000 lines of code.

Page 12: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

What are the solutions ?

• Hand-code everything (and every change)– Hire a lot of monkeys coders

• Design everything generically, correctly the first time– Mission impossible

• Use only code generation– And spend your life changing generator to match all

possible requirements

• Use combination of tools including code generation.– This seems reasonable

Page 13: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Boilerplate

• Interestingly, the term (boilerplate) arose from the newspaper business. Columns and other pieces that were syndicated were sent out to subscribing newspapers in the form of a mat (i.e. a matrix). Once received, boiling lead was poured into this mat to create the plate used to print the piece, hence the name boilerplate. As the article printed on a boilerplate could not be altered, the term came to be used by attorneys to refer to the portions of a contract which did not change through repeated uses in different applications, and finally to language in general which did not change in any document that was used repeatedly for different occasions.

Page 14: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Page 15: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

CODE GENERATION is code that writes code

Page 16: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Some common terms

• Code generation

• Automatic programming

• Generative programming

Page 17: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

IDE Generated Code Example

Page 18: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Tools evolution

Page 19: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Code Smith http://www.codesmithtools.com/

Demo

Page 20: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Generator

Code Generator

Input Output

Page 21: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Why CG?• Productivity

• Quality

• Consistency

• Abstraction

Page 22: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Page 23: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

PROS

• Code uniformity

• Easy to debug

• Easy to introduce huge changes

• No more boilerplate code

Page 24: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

CONS

• Someone should maintain the generator

• Generator has learning curve

• Generator usually has limitations

Page 25: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Applications

• Database Access• Generate Test Data• Generate Integration Tests• User Interface• Documentation• Unit tests• File Formats• Web services• Business logic• DLL Wrappers• Firewall configuration• Website configuration• Looking for localizable strings

Page 26: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Code Generation is Fun ?

• CG makes boring job for you

• Writing generator is fun

• Once written generator works for you

• You can experiment with different implementations by modifying generator and regeneration the code.

• While writing the generator you get deeper into the technology instead of doing dull job.

Page 27: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Scaffolding and prototyping

• Code generation can help you to build fast prototypes.

Page 28: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

MVC Scaffolding Demo

Page 29: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Rules

1. Give the proper respect to hand-coding

2. Handwrite the code first

3. Control the source code

4. Make a considered decision about the implementation language

5. Integrate the generator into the development process

Page 30: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Rules

6. Include warnings

7. Make it friendly

8. Include documentation

9. Keep in mind that generation is a cultural issue

10. Maintain the generator

Page 31: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

A note about DSL

A domain-specific language (DSL) is a programming language or specification language dedicated to a particular problem domain

Page 32: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

LOGO

Page 33: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Model Driven Architecture

Page 34: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Page 35: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Model Driven Architecture

• Code generation has a dramatic impact on development time and engineering productivity.

• The application is amenable to change on a large scale.

• The business rules are abstracted into files that are free of language or framework details that would hinder portability.

• The code for the application is of consistently high quality across the code base.

Page 36: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Benefits of MDA

• Quality

• Consistency

• A single point of knowledge

• More design time

• Design decisions that stand out

Page 37: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Software Factories

Page 38: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Industrializing Software Development

Page 39: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Software Factory

Page 40: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Consider this:

• Code generation has a large initial schedule overhead;

• Code generators are ideal for well-known large-scale problems;

• Code generation is powerful when used appropriately;

• Always keep in mind code generation limitations!

Page 41: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Code Generation Skills

• Text Templates

• Regular Expressions

• XML Parsing

• Reflection

Page 42: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Show me the tools

Page 43: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Available tools

• StringBuilder

• CodeSnippets

• XSLT

• Reflection Emit

• EnvDTE

• CodeDom

• T4

• … (Python, Ruby,

Page 44: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

StringBuilder

• Advantages– Almost all .net developers should feel comfortable using

the StringBuilder class so it requires no additional languages / tools to learn.

– Even with the disadvantages, the StringBuilder can be an excellent choice if you need to generate code quickly. Especially if you don’t need to maintain the “template” long term.

• Disadvantages– Unable to truly see the “template” within the control logic.

– Requires a recompile if the “template” should be changed.

Page 45: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Code Snippets

• Advantages

– Simple Xml based template with numerous samples provided within Visual Studio.

– Several open source code snippet libraries available.

• Disadvantages

– Limited snippet functions and at the present time developers are unable to author additional snippet functions!

Page 46: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

XSLT

• Advantages

– Xml based template.

– Simple code generation technique for those developers comfortable with XSLT transformations.

• Disadvantages

– While Xml is a relatively simple technology, XSLT has been known to bring grown men to tears!

– XSLT can be difficult to debug.

Page 47: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Reflection Emit

It is rocket science mixed with the black arts.

• Full representation of physical structure• Allows building modules and assemblies at

runtime– Transient code only used at runtime– Persistent code for reuse

• Create classes, types and emit IL• Used by .NET compilers to build .NET apps• Can be as fast as normal code

Page 48: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

EnvDTE

• EnvDTE is an assembly-wrapped COM library containing the objects and members for Visual Studio core automation.

• Using EnvDTE you can develop your own add-ins for Visual Studio that can generate code.

Page 49: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

CodeDom

• Advantages– Allows a single “template” to generate code within several

target languages, such as VB and C#.– Additional language providers can be written to support

other languages.– Proven technology, used by Microsoft for code generation

in all versions of Visual Studio since .net was released.

• Disadvantages– Unable to truly see the “template” within the control logic.– Requires a recompile if the “template” should be changed.– Very few developers have experience using the CodeDom

even though it has been with us since the .net framework 1.0.

Page 50: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Text Template Transformation Toolkit

Page 51: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

How T4 Works ?

Page 52: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

T4 Tools

• Tangible T4 Editor for Visual Studio 2010 RTM adds IntelliSense and Syntax Coloring to T4 Text Templates.

• T4 Toolbox

Page 53: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

T4 Pros and Cons

• Advantages– Ability to embed C# control logic within the template.– Syntax that will be somewhat familiar to classic ASP developers..– Preferred code generation technique for Entity Framework 4.0

and the Visual Studio 2010 modeling tools., which means lots of samples on MSDN, etc.

– Templates can be precompiled.

• Disadvantages– While third parties have written language support for Visual

Studio no built in support for editing T4 templates exists in Visual Studio today.

– Relatively new technology, therefore not many developers have experience with T4 templates.

Page 54: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

ReSharper 6.0 Code Generation

Create from UsageGenerate Type MembersGenerate Type ConstructorGenerate PropertiesGenerate Delegating MembersGenerate Formatting MembersGenerate Equality MembersImplement/Override Methods

Page 55: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Some advices

Page 56: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Shall I Generate Interfaces?

Page 57: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Shall I Generate Interfaces?

No !

Page 58: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Shall I Unit Test generated code ?

• You shouldn’t unit test generated code. You may unit test generator instead.

Page 59: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Real WorldCase Studies

Page 60: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Case 1: Client – Server Communication

Existing API

Generated Server Proxy

Generated Client Proxy

Communication

channel

Page 61: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Case 2: API Wrapper

Lega

cy A

PI

Ad

apte

r

Exis

tin

g A

pp

licat

ion

Page 62: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Case 3: Protocol Parser

Page 63: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Case 4: Model Driven DAL

Partially generated DB

Generated Entities

Generated Repositories

Hand written services

XMLModel

Page 64: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

It’s an Engineering, Baby !

Conclusion:• Not a silver bullet but another good tool;

• Makes life easier when applied properly;

• Writing generator is much more fun than writing boilerplate code;

• Generated code is easier to debug;

• You can make huge changes in regenerated code easily;

Page 65: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra

Do try this !

• Code generation can make you flexible and responsive. Do try this at home. (Or at work)

Page 66: Odessa .NET User Group - 10.11.2011 - Applied Code Generation

@dmytromindra