Refactoring: Improving the Design of Existing Software