Table of Contents
Contents
preface
acknowledgments
about this book
about the title
about the cover illustration
Part I Code generation fundamentals
- Chapter 1 Overview
- 1.1 A generation case study
- Step 1: generating the database access layer — Step 2: generating the user interface — Step 3: building the client interface — Step 4: building unit tests — Step 5: integrating a technical change — Step 6: integrating a design change — Step 7: building an RPC layer — Step 8: building documentation — Case study conclusions
- 1.2 Benefits of code generation for engineers1
- 1.3 Benefits of code generation for managers
- 1.4 The code generation process
- Assessing the need — Laying down the infrastructure — Documenting it — Deploying it — Maintaining it
- 1.5 The buy/build decision
- 1.6 Code generation at its best
- 1.7 Top ten code-generation rules
- 1.8 Generators you are using today
- 1.9 Summary
- Chapter 2 Code generation basics
- 2.1 The various forms of active code generation
- Code munging — The inline-code expander — Mixed-code generation — Partial-class generation — Tier or layer generation — Full-domain language
- 2.2 Code generation workflow
- Editing generated code
- 2.3 Code generation concerns
- Nobody on my team will accept a generator — Engineers will ignore the ?do not edit? comments — If the generator can?t build it, the feature will take weeks to build
- 2.4 Code generation skills
- Using text templates — Writing regular expressions — Parsing XML — File and directory handling — Command-line handling
- 2.5 Choosing a language for your code generator
- Comparing code generator languages — Using Ruby to write code generators
- 2.6 Summary
- Chapter 3 Code generation tools
- 3.1 Building generators with Ruby
- 3.2 Parsing XML with Rexml
- Using Rexml
- 3.3 ERb: a great tool for templates
- Installing and using ERb — ERb templates — Building ASP, JSP, etc. with ERb
- 3.4 Building the language parser toolkit
- Inside the Tokenizers — Inside the LanguageScanners — Language parsing tools
- 3.5 Summary
- Chapter 4 Building simple generators
- 4.1 The code munger generator type
- Uses and example code — Developing the generator
- 4.2 The inline-code expansion generator model Uses and examples
- Developing the generator
- 4.3 The mixed-code generator model
- Uses and examples — Developing the generator
- 4.4 The partial-class generator mode
- Uses and examples — Developing the generator
- 4.5 The tier generator model
- Uses and examples — Developing the generator
- 4.6 Generating for various languages
- C — C++ — C# — Java — Perl — SQL
- 4.7 Summary96
Part II Code generation solutions
- Chapter 5 Generating user interfaces
- 5.1 The big picture
- Why generate the user interface? — Integration with existing tools and other generators
- 5.2 Designing a good interface
- 5.3 Workflow comparison
- 5.4 A case study: generating JSP
- Why generate JSPs? — The role of the generator — The high-level architecture — A table definition file — A form definition file — Processing flow — Designing the generator
- 5.5 Technique: generating Swing dialog boxes
- Generator requirements — Architectural recommendation — Processing flow
- 5.6 Technique: generating MFC dialog boxes
- Generator requirements — Recommended tier generator architecture — Processing flow — Recommended mixed-code generation architecture — Processing flow
- 5.7 Design tips
- 5.8 Tools for generating UIs
- 5.9 Summary
- Chapter 6 Generating documentation
- 6.1 The importance of structured comments
- 6.2 The big picture
- 6.3 A case study: augmented SQL code
- Roles of the generator — Laying out the generator architecture — Processing flow — Building the code for the SQL generator — Performing system tests
- 6.4 Understanding the JavaDoc and the Doclet API
- 6.5 Finding a tool to do it for you
- 6.6 Summary
- Chapter 7 Generating unit tests
- 7.1 The big picture
- 7.2 Preparing for common concerns
- Unit tests won?t be maintained — It?s too hard to make unit tests — Unit tests will limit our flexibility — The interface isn?t ready yet — Unit tests are not worth the time — Adding unit tests to a legacy system is painful — Unit tests can only prove the existence of errors
- 7.3 A case study: augmented C code
- Roles of the generator — Laying out the generator architecture — Processing flow — Building the code for the unit test generator — Finding tools for test cases
- 7.4 Technique: the ordered test generator
- Roles of the generator — Laying out the generator architecture — Processing flow
- 7.5 Technique: the test data generator
- Roles of the generator — Laying out the generator architecture — Processing flow — Using the test data generator and the sequential test generator together
- 7.6 Technique: the test robot generator
- Roles of the generator — Laying out the generator architecture — Processing flow — Generators for robots
- 7.7 Finding a tool to do it for you
- 7.8 Design tips
- 7.9 Summary
- Chapter 8 Embedding SQL with generators
- 8.1 PerlSQL
- 8.2 Preparing for common concerns
- We are creating a new language — Debugging will be a pain — With Perl you could do this within the language
- 8.3 Workflow comparison
- 8.4 A case study: PerlSQL
- Roles of the generator — Laying out the generator architecture — Processing flow — Building the code for the PerlSQL generator — Performing system tests
- 8.5 Finding SQL tools
- 8.6 Summary
- Chapter 9 Handling data
- 9.1 Code generation versus a library
- 9.2 A case study: a simple CSV-reading example
- Roles of the generator — Laying out the generator architecture — Processing flow — Building the code for the CSV reader generator — Performing system tests
- 9.3 Technique: data adapters
- Roles of the generator — Laying out the generator architecture — Processing flow
- 9.4 Technique: binary file reader/writer
- Roles of the generator — Laying out the generator architecture — Implementation recommendations — Processing flow
- 9.5 Finding tools to do it for you
- 9.6 Summary
- Chapter 10 Creating database access generators
- 10.1 Benefits of database access generators
- 10.2 The big picture
- Terminology — Integration with existing tools — Working with other generators
- 10.3 Preparing for common concerns
- The code is going to be out of control — I?m going to be the only one who knows what?s going on — Our application semantics aren?t well defined yet — This is going to take all the joy out of coding — The database design is too complex to be generated — The generated SQL SELECT statements will be rubbish — The up-front development cost is too high — I don?t have all of the prerequisite skills — The information here is centered around web applications; what about client/server? — My application doesn?t use a database
- 10.4 Workflow comparison
- 10.5 A case study: EJB generation
- The architecture of the EJB database access layer — EJB options — The schema — Roles of the generator — Laying out the generator architecture — Processing flow — The schema definition — The extensions definition file — Sample data definition — Implementation — Performing system tests — J2EE developer resources — Generators for J2EE
- 10.6 Technique: generating JDBC
- Roles of the generator — Laying out the generator architecture — Processing flow — JDBC developer resources
- 10.7 Technique: generating database access layers for ASP
- Roles of the generator — Laying out the generator architecture — Processing flow — ASP developer resources
- 10.8 Technique: generating database access layers for ASP.NET
- Roles of the generator — Recommended architecture — Laying out the generator architecture — Processing flow — ASP.NET developer resources — Generators for .NET
- 10.9 Technique: Generating database access classes for Perl DBI
- Roles of the generator — Laying out the generator architecture — Processing flow — Perl/DBI developer resources
- 10.10 Technique: generating database access classes for PHP
- Roles of the generator — Laying out the generator architecture — Processing flow — Generators for PHP — PHP developer resources
- 10.11 Off-the-shelf: AndroMDA
- Roles of the generator — Laying out the generator architecture — Developer resources
- 10.12 Off-the-shelf: XDoclet
- Roles of the generator — Laying out the generator architecture
- 10.13 Design tips
- 10.14 Finding a tool to do it for you
- 10.15 Summary
- Chapter 11 Generating web services layers
- 11.1 The big picture
- Providing security and authentication — Why not use a library?
- 11.2 A case study: generating XML-RPC for Java
- The XML-RPC message flow — Roles of the generator — Laying out the generator architecture — Processing flow — Building the code for the XML-RPC generator — Performing system tests — XML-RPC resources
- 11.3 Technique: generating SOAP
- Roles of the generator — Laying out the generator architecture — Processing flow — SOAP resources
- 11.4 Design tips
- 11.5 Finding a tool to do it for you
- 11.6 Summary
- Chapter 12 Generating business logic
- 12.1 A case study: generating Java business equations
- Roles of the generator — Laying out the generator architecture — Processing flow — Building the code for the equation generator — Performing system tests
- 12.2 A case study: the report logic and interface generator
- Roles of the generator — Laying out the generator architecture — Processing flow — A report logic and interface generator alternative — Report logic generation tools
- 12.3 Summary
- Chapter 13 More generator ideas
- 13.1 Technique: maintaining header files
- Roles of the generator — Laying out the generator architecture — Processing flow — Processing flow
- 13.2 Technique: creating DLL wrappers
- Roles of the generator — Laying out the generator architecture — Processing flow
- 13.3 Technique: creating wrappers for external languages
- Roles of the generator — Laying out the generator architecture — Processing flow
- 13.4 Technique: creating firewall configurations
- Roles of the generator — Laying out the generator architecture — Processing flow
- 13.5 Technique: creating lookup functions
- Roles of the generator — Laying out the generator architecture — Processing flow
- 13.6 Technique: creating macro lookup tables
- Feeding code to the generator — Roles of the generator — Laying out the generator architecture — Processing flow
- 13.7 Summary
appendix a A brief introduction to Ruby
appendix b The simple system test framework
appendix c EJBGen code and templates
appendix d Integrating code generation into your IDE
appendix e Simple templating
appendix f Patterns for regular expressions
index