Refactoring: Improving the Design of Existing Code (Addison-Wesley Object Technology Series) by Martin Fowler.