contents
foreword
preface
acknowledgments
about this book
 
1 Understanding brownfield applications
1.1 Welcome to Twilight Stars!
1.2 The components of a brownfield application
1.3 Inheriting an application
1.4 The challenges of a brownfield application
1.5 Selling it to your boss
1.6 Summary
part 1 The ecosystem
- 2 Version control in brownfield applications
- 2.1 Pain points
- 2.2 What’s in a version control system?
- 2.3 Organizing your project for version control
- 2.4 The check-in dance
- 2.5 Tips for working with version control
- 2.6 Summary
- 3 Continuous integration
- 3.1 Pain points
- 3.2 What is continuous integration?
- 3.3 Automated builds and the build server
- 3.4 An updated check-in dance
- 3.5 Setting up a CI process
- 3.6 Build components
- 3.7 Tweaking the CI process
- 3.8 Summary
- 4 Automated testing
- 4.1 Pain points
- 4.2 Living in fear of change
- 4.3 Types of automated tests
- 4.4 (Re-)integrating existing test projects
- 4.5 Adding a new test project
- 4.6 Writing new tests
- 4.7 Integration tests
- 4.8 User interface tests
- 4.9 Managing your database
- 4.10 Summary
- 5 Software metrics and code analysis
- 5.1 What are software metrics and code analysis?
- 5.2 Some metrics of interest
- 5.3 Becoming a slave to statistics
- 5.4 Implementing statistical analysis
- 5.5 Other tasks for automation
- 5.6 Summary
- 6 Defect management
- 6.1 Pain points
- 6.2 Types of defects
- 6.3 The initial defect triage
- 6.4 Organizing the effort
- 6.5 Anatomy of a defect entry
- 6.6 Instilling a culture of quality
- 6.7 Working with a defect-tracking system
- 6.8 Defect reporting
- 6.9 Summary
Part 2 The code
- 7 Bringing better OO practices to the project
- 7.1 OO fundamentals
- 7.2 Code “-abilities”
- 7.3 Useful OO principles
- 7.4 Adopting a more agile approach
- 7.5 Summary
- 8 Relayering your application
- 8.1 Pain points
- 8.2 Tiers versus layers
- 8.3 Isolation through interface-based design
- 8.4 Anticorruption layer
- 8.5 Vertical layers
- 8.6 Aspect-oriented programming
- 8.7 Taking a domain-centric approach
- 8.8 Refactoring to layers
- 8.9 Summary
- 9 Loosen up: Taming your dependencies
- 9.1 Pain points
- 9.2 The dependency inversion principle
- 9.3 A sample dependency inversion
- 9.4 Dependency injection
- 9.5 Dependency inversion in brownfield applications
- 9.6 Summary
- 10 Cleaning up the user interface
- 10.1 Pain points
- 10.2 Separating the UI layer’s concerns
- 10.3 Components of a user interface code
- 10.4 User interface patterns
- 10.5 Refactoring to MVP
- 10.6 Model-View-Controller
- 10.7 Summary
- 11 Refactoring data access
- 11.1 Pain points
- 11.2 Isolating your data access
- 11.3 Centralizing business logic
- 11.4 Features of a DAL
- 11.5 Options for creating a DAL
- 11.6 Improving the deployment story
- 11.7 Summary
- 12 Managing external system dependencies
- 12.1 Pain points
- 12.2 Types of external system dependencies
- 12.3 Handling external systems
- 12.4 Example 1: A sample refactoring
- 12.5 Example 2: Refactoring a web service
- 12.6 Example 3: Wrapping a component
- 12.7 Design patterns for dealing with third-party dependencies
- 12.8 Summary
- 13 Keeping the momentum
- 13.1 Pain points
- 13.2 Changing your course
- 13.3 Setting the pace
- 13.4 The “spring cleaning” iteration
- 13.5 Making the time
- 13.6 A milestone retrospective
- 13.7 Summary
 
appendix Our .NET toolbox
index