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